blob: 97ab99cff7e3334b664401208997e585d1ed24b6 [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 Rossum79f25d91997-04-29 20:08:16 +0000115 PyMem_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 */
304 PyObject *c_names; /* list of strings (names) */
305 PyObject *c_globals; /* dictionary (value=None) */
306 PyObject *c_locals; /* dictionary (value=localID) */
307 PyObject *c_varnames; /* list (inverse of c_locals) */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000308 int c_nlocals; /* index of next local */
309 int c_argcount; /* number of top-level arguments */
310 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000311 int c_nexti; /* index into c_code */
312 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000313 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000314 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000315 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000316 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000317 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000318 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000319 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000320 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000321 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000322 int c_stacklevel; /* Current stack level */
323 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000324 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000325 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000326 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000327#ifdef PRIVATE_NAME_MANGLING
328 char *c_private; /* for private name mangling */
329#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000330};
331
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000332
Guido van Rossum452a9831996-09-17 14:32:04 +0000333/* Error message including line number */
334
335static void
336com_error(c, exc, msg)
337 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000338 PyObject *exc;
Guido van Rossum452a9831996-09-17 14:32:04 +0000339 char *msg;
340{
341 int n = strlen(msg);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000342 PyObject *v;
Guido van Rossum452a9831996-09-17 14:32:04 +0000343 char buffer[30];
344 char *s;
Guido van Rossum635abd21997-01-06 22:56:52 +0000345 c->c_errors++;
Guido van Rossum452a9831996-09-17 14:32:04 +0000346 if (c->c_lineno <= 1) {
347 /* Unknown line number or single interactive command */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000348 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000349 return;
350 }
351 sprintf(buffer, " (line %d)", c->c_lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000352 v = PyString_FromStringAndSize((char *)NULL, n + strlen(buffer));
Guido van Rossum452a9831996-09-17 14:32:04 +0000353 if (v == NULL)
354 return; /* MemoryError, too bad */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000355 s = PyString_AS_STRING((PyStringObject *)v);
Guido van Rossum452a9831996-09-17 14:32:04 +0000356 strcpy(s, msg);
357 strcat(s, buffer);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000358 PyErr_SetObject(exc, v);
359 Py_DECREF(v);
Guido van Rossum452a9831996-09-17 14:32:04 +0000360}
361
362
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000363/* Interface to the block stack */
364
365static void
366block_push(c, type)
367 struct compiling *c;
368 int type;
369{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000370 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000371 com_error(c, PyExc_SystemError,
372 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000373 }
374 else {
375 c->c_block[c->c_nblocks++] = type;
376 }
377}
378
379static void
380block_pop(c, type)
381 struct compiling *c;
382 int type;
383{
384 if (c->c_nblocks > 0)
385 c->c_nblocks--;
386 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000387 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000388 }
389}
390
391
Guido van Rossum681d79a1995-07-18 14:51:37 +0000392/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000393
Guido van Rossum79f25d91997-04-29 20:08:16 +0000394static int com_init Py_PROTO((struct compiling *, char *));
395static void com_free Py_PROTO((struct compiling *));
396static void com_push Py_PROTO((struct compiling *, int));
397static void com_pop Py_PROTO((struct compiling *, int));
398static void com_done Py_PROTO((struct compiling *));
399static void com_node Py_PROTO((struct compiling *, struct _node *));
400static void com_factor Py_PROTO((struct compiling *, struct _node *));
401static void com_addbyte Py_PROTO((struct compiling *, int));
402static void com_addint Py_PROTO((struct compiling *, int));
403static void com_addoparg Py_PROTO((struct compiling *, int, int));
404static void com_addfwref Py_PROTO((struct compiling *, int, int *));
405static void com_backpatch Py_PROTO((struct compiling *, int));
406static int com_add Py_PROTO((struct compiling *, PyObject *, PyObject *));
407static int com_addconst Py_PROTO((struct compiling *, PyObject *));
408static int com_addname Py_PROTO((struct compiling *, PyObject *));
409static void com_addopname Py_PROTO((struct compiling *, int, node *));
410static void com_list Py_PROTO((struct compiling *, node *, int));
411static int com_argdefs Py_PROTO((struct compiling *, node *));
412static int com_newlocal Py_PROTO((struct compiling *, char *));
413static PyCodeObject *icompile Py_PROTO((struct _node *, struct compiling *));
414static PyCodeObject *jcompile Py_PROTO((struct _node *, char *,
415 struct compiling *));
416static PyObject *parsestrplus Py_PROTO((node *));
417static PyObject *parsestr Py_PROTO((char *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000418
419static int
Guido van Rossum590baa41993-11-30 13:40:46 +0000420com_init(c, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000421 struct compiling *c;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000422 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000423{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000424 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
425 1000)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000426 goto fail_3;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000427 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000428 goto fail_2;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000429 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000430 goto fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000431 if ((c->c_globals = PyDict_New()) == NULL)
Guido van Rossumc5e96291991-12-10 13:53:51 +0000432 goto fail_0;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000433 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000434 goto fail_00;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000435 if ((c->c_varnames = PyList_New(0)) == NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000436 goto fail_000;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000437 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
438 1000)) == NULL)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000439 goto fail_0000;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000440 c->c_nlocals = 0;
441 c->c_argcount = 0;
442 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000443 c->c_nexti = 0;
444 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000445 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000446 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000447 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000448 c->c_begin = 0;
449 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000450 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000451 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000452 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000453 c->c_stacklevel = 0;
454 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000455 c->c_firstlineno = 0;
456 c->c_last_addr = 0;
457 c->c_last_line = 0;
458 c-> c_lnotab_next = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000459 return 1;
460
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000461 fail_0000:
Guido van Rossum72badf51999-12-20 20:40:12 +0000462 Py_DECREF(c->c_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000463 fail_000:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000464 Py_DECREF(c->c_locals);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000465 fail_00:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000466 Py_DECREF(c->c_globals);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000467 fail_0:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000468 Py_DECREF(c->c_names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000469 fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000470 Py_DECREF(c->c_consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000471 fail_2:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000472 Py_DECREF(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000473 fail_3:
474 return 0;
475}
476
477static void
478com_free(c)
479 struct compiling *c;
480{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000481 Py_XDECREF(c->c_code);
482 Py_XDECREF(c->c_consts);
483 Py_XDECREF(c->c_names);
484 Py_XDECREF(c->c_globals);
485 Py_XDECREF(c->c_locals);
486 Py_XDECREF(c->c_varnames);
487 Py_XDECREF(c->c_lnotab);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000488}
489
490static void
Guido van Rossum8b993a91997-01-17 21:04:03 +0000491com_push(c, n)
492 struct compiling *c;
493 int n;
494{
495 c->c_stacklevel += n;
496 if (c->c_stacklevel > c->c_maxstacklevel)
497 c->c_maxstacklevel = c->c_stacklevel;
498}
499
500static void
501com_pop(c, n)
502 struct compiling *c;
503 int n;
504{
505 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000506 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000507 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
508 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000509 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000510 c->c_stacklevel = 0;
511 }
512 else
513 c->c_stacklevel -= n;
514}
515
516static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000517com_done(c)
518 struct compiling *c;
519{
520 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000521 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000522 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000523 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000524}
525
526static void
527com_addbyte(c, byte)
528 struct compiling *c;
529 int byte;
530{
531 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000532 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000533 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000534 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000535 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000536 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000537 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000538 com_error(c, PyExc_SystemError,
539 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000540 }
541 if (c->c_code == NULL)
542 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000543 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000544 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000545 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000546 c->c_errors++;
547 return;
548 }
549 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000550 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000551}
552
553static void
554com_addint(c, x)
555 struct compiling *c;
556 int x;
557{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000558 com_addbyte(c, x & 0xff);
559 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000560}
561
562static void
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000563com_add_lnotab(c, addr, line)
564 struct compiling *c;
565 int addr;
566 int line;
567{
568 int size;
569 char *p;
570 if (c->c_lnotab == NULL)
571 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000572 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000573 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000574 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000575 c->c_errors++;
576 return;
577 }
578 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000579 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000580 *p++ = addr;
581 *p++ = line;
582 c->c_lnotab_next += 2;
583}
584
585static void
586com_set_lineno(c, lineno)
587 struct compiling *c;
588 int lineno;
589{
590 c->c_lineno = lineno;
591 if (c->c_firstlineno == 0) {
592 c->c_firstlineno = c->c_last_line = lineno;
593 }
594 else {
595 int incr_addr = c->c_nexti - c->c_last_addr;
596 int incr_line = lineno - c->c_last_line;
597 while (incr_addr > 0 || incr_line > 0) {
598 int trunc_addr = incr_addr;
599 int trunc_line = incr_line;
600 if (trunc_addr > 255)
601 trunc_addr = 255;
602 if (trunc_line > 255)
603 trunc_line = 255;
604 com_add_lnotab(c, trunc_addr, trunc_line);
605 incr_addr -= trunc_addr;
606 incr_line -= trunc_line;
607 }
608 c->c_last_addr = c->c_nexti;
609 c->c_last_line = lineno;
610 }
611}
612
613static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000614com_addoparg(c, op, arg)
615 struct compiling *c;
616 int op;
617 int arg;
618{
Guido van Rossum8e793d91997-03-03 19:13:14 +0000619 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000620 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000621 if (Py_OptimizeFlag)
622 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000623 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000624 com_addbyte(c, op);
625 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000626}
627
628static void
629com_addfwref(c, op, p_anchor)
630 struct compiling *c;
631 int op;
632 int *p_anchor;
633{
634 /* Compile a forward reference for backpatching */
635 int here;
636 int anchor;
637 com_addbyte(c, op);
638 here = c->c_nexti;
639 anchor = *p_anchor;
640 *p_anchor = here;
641 com_addint(c, anchor == 0 ? 0 : here - anchor);
642}
643
644static void
645com_backpatch(c, anchor)
646 struct compiling *c;
647 int anchor; /* Must be nonzero */
648{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000649 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000650 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000651 int dist;
652 int prev;
653 for (;;) {
654 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000655 prev = code[anchor] + (code[anchor+1] << 8);
656 dist = target - (anchor+2);
657 code[anchor] = dist & 0xff;
658 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000659 if (!prev)
660 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000661 anchor -= prev;
662 }
663}
664
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000665/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000666
667static int
668com_add(c, list, v)
669 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000670 PyObject *list;
671 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000672{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000673 int n = PyList_Size(list);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000674 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +0000675 /* XXX This is quadratic in the number of names per compilation unit.
676 XXX Should use a dictionary. */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000677 for (i = n; --i >= 0; ) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000678 PyObject *w = PyList_GetItem(list, i);
679 if (v->ob_type == w->ob_type && PyObject_Compare(v, w) == 0)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000680 return i;
681 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000682 /* Check for error from PyObject_Compare */
683 if (PyErr_Occurred() || PyList_Append(list, v) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000684 c->c_errors++;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000685 return n;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000686}
687
688static int
689com_addconst(c, v)
690 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000691 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000692{
693 return com_add(c, c->c_consts, v);
694}
695
696static int
697com_addname(c, v)
698 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000699 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000700{
701 return com_add(c, c->c_names, v);
702}
703
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000704#ifdef PRIVATE_NAME_MANGLING
705static int
706com_mangle(c, name, buffer, maxlen)
707 struct compiling *c;
708 char *name;
709 char *buffer;
710 int maxlen;
711{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000712 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000713 This is independent from how the name is used. */
714 char *p;
715 int nlen, plen;
716 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000717 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000718 return 0; /* Don't mangle __extremely_long_names */
719 if (name[nlen-1] == '_' && name[nlen-2] == '_')
720 return 0; /* Don't mangle __whatever__ */
721 p = c->c_private;
722 /* Strip leading underscores from class name */
723 while (*p == '_')
724 p++;
725 if (*p == '\0')
726 return 0; /* Don't mangle if class is just underscores */
727 plen = strlen(p);
728 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000729 plen = maxlen-nlen-2; /* Truncate class name if too long */
730 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000731 buffer[0] = '_';
732 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000733 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000734 /* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
735 return 1;
736}
737#endif
738
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000739static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000740com_addopnamestr(c, op, name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000741 struct compiling *c;
742 int op;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000743 char *name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000744{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000745 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000746 int i;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000747#ifdef PRIVATE_NAME_MANGLING
748 char buffer[256];
749 if (name != NULL && name[0] == '_' && name[1] == '_' &&
750 c->c_private != NULL &&
751 com_mangle(c, name, buffer, (int)sizeof(buffer)))
752 name = buffer;
753#endif
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000754 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000755 c->c_errors++;
756 i = 255;
757 }
758 else {
759 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000760 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000761 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000762 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
763 switch (op) {
764 case LOAD_NAME:
765 case STORE_NAME:
766 case DELETE_NAME:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000767 if (PyDict_GetItemString(c->c_globals, name) != NULL) {
Guido van Rossumc5e96291991-12-10 13:53:51 +0000768 switch (op) {
769 case LOAD_NAME: op = LOAD_GLOBAL; break;
770 case STORE_NAME: op = STORE_GLOBAL; break;
771 case DELETE_NAME: op = DELETE_GLOBAL; break;
772 }
773 }
774 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000775 com_addoparg(c, op, i);
776}
777
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000778static void
779com_addopname(c, op, n)
780 struct compiling *c;
781 int op;
782 node *n;
783{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000784 char *name;
785 char buffer[1000];
786 /* XXX it is possible to write this code without the 1000
787 chars on the total length of dotted names, I just can't be
788 bothered right now */
789 if (TYPE(n) == STAR)
790 name = "*";
791 else if (TYPE(n) == dotted_name) {
792 char *p = buffer;
793 int i;
794 name = buffer;
795 for (i = 0; i < NCH(n); i += 2) {
796 char *s = STR(CHILD(n, i));
797 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000798 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000799 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +0000800 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000801 break;
802 }
803 if (p != buffer)
804 *p++ = '.';
805 strcpy(p, s);
806 p = strchr(p, '\0');
807 }
808 }
809 else {
810 REQ(n, NAME);
811 name = STR(n);
812 }
813 com_addopnamestr(c, op, name);
814}
815
Guido van Rossum79f25d91997-04-29 20:08:16 +0000816static PyObject *
Guido van Rossum452a9831996-09-17 14:32:04 +0000817parsenumber(co, s)
818 struct compiling *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000819 char *s;
820{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000821 extern double atof Py_PROTO((const char *));
Guido van Rossumc5e96291991-12-10 13:53:51 +0000822 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000823 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000824 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +0000825#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +0000826 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +0000827 int imflag;
828#endif
829
Guido van Rossum282914b1991-04-04 10:42:56 +0000830 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000831 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +0000832#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +0000833 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +0000834#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000835 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000836 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000837 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000838 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000839 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000840 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000841 if (*end == '\0') {
842 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000843 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000844 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000845 return NULL;
846 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000847 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000848 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000849 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +0000850#ifndef WITHOUT_COMPLEX
851 if (imflag) {
852 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000853 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +0000854 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000855 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000856 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +0000857 }
Guido van Rossumac1fc951997-10-08 15:23:55 +0000858 else
Guido van Rossum50564e81996-01-12 01:13:16 +0000859#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +0000860 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000861 PyFPE_START_PROTECT("atof", return 0)
862 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000863 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000864 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000865 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000866}
867
Guido van Rossum79f25d91997-04-29 20:08:16 +0000868static PyObject *
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000869parsestr(s)
870 char *s;
871{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000872 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000873 int len;
874 char *buf;
875 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000876 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000877 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +0000878 int first = *s;
879 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000880 int rawmode = 0;
881 int unicode = 0;
882 if (isalpha(quote) || quote == '_') {
883 if (quote == 'u' || quote == 'U') {
884 quote = *++s;
885 unicode = 1;
886 }
887 if (quote == 'r' || quote == 'R') {
888 quote = *++s;
889 rawmode = 1;
890 }
891 }
Guido van Rossum8054fad1993-10-26 15:19:44 +0000892 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000893 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000894 return NULL;
895 }
896 s++;
897 len = strlen(s);
Guido van Rossum8054fad1993-10-26 15:19:44 +0000898 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000899 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000900 return NULL;
901 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000902 if (len >= 4 && s[0] == quote && s[1] == quote) {
903 s += 2;
904 len -= 2;
905 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000906 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000907 return NULL;
908 }
909 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000910 if (unicode) {
911 if (rawmode)
912 return PyUnicode_DecodeRawUnicodeEscape(
913 s, len, NULL);
914 else
915 return PyUnicode_DecodeUnicodeEscape(
916 s, len, NULL);
917 }
918 else if (rawmode || strchr(s, '\\') == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000919 return PyString_FromStringAndSize(s, len);
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000920 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000921 v = PyString_FromStringAndSize((char *)NULL, len);
922 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000923 end = s + len;
924 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000925 if (*s != '\\') {
926 *p++ = *s++;
927 continue;
928 }
929 s++;
930 switch (*s++) {
931 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000932 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000933 case '\\': *p++ = '\\'; break;
934 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000935 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000936 case 'b': *p++ = '\b'; break;
937 case 'f': *p++ = '\014'; break; /* FF */
938 case 't': *p++ = '\t'; break;
939 case 'n': *p++ = '\n'; break;
940 case 'r': *p++ = '\r'; break;
941 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000942 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
943 case '0': case '1': case '2': case '3':
944 case '4': case '5': case '6': case '7':
945 c = s[-1] - '0';
946 if ('0' <= *s && *s <= '7') {
947 c = (c<<3) + *s++ - '0';
948 if ('0' <= *s && *s <= '7')
949 c = (c<<3) + *s++ - '0';
950 }
951 *p++ = c;
952 break;
953 case 'x':
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000954 if (isxdigit(Py_CHARMASK(*s))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000955 unsigned int x = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000956 do {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000957 c = Py_CHARMASK(*s);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000958 s++;
Guido van Rossumed1100f1997-10-20 23:24:07 +0000959 x = (x<<4) & ~0xF;
960 if (isdigit(c))
961 x += c - '0';
962 else if (islower(c))
963 x += 10 + c - 'a';
964 else
965 x += 10 + c - 'A';
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000966 } while (isxdigit(Py_CHARMASK(*s)));
Guido van Rossumed1100f1997-10-20 23:24:07 +0000967 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000968 break;
969 }
970 /* FALLTHROUGH */
971 default: *p++ = '\\'; *p++ = s[-1]; break;
972 }
973 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000974 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000975 return v;
976}
977
Guido van Rossum79f25d91997-04-29 20:08:16 +0000978static PyObject *
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000979parsestrplus(n)
980 node *n;
981{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000982 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000983 int i;
984 REQ(CHILD(n, 0), STRING);
985 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
986 /* String literal concatenation */
987 for (i = 1; i < NCH(n) && v != NULL; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000988 PyString_ConcatAndDel(&v, parsestr(STR(CHILD(n, i))));
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000989 }
990 }
991 return v;
992}
993
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000994static void
995com_list_constructor(c, n)
996 struct compiling *c;
997 node *n;
998{
999 int len;
1000 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001001 if (TYPE(n) != testlist)
1002 REQ(n, exprlist);
1003 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
1004 len = (NCH(n) + 1) / 2;
1005 for (i = 0; i < NCH(n); i += 2)
1006 com_node(c, CHILD(n, i));
1007 com_addoparg(c, BUILD_LIST, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001008 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001009}
1010
1011static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001012com_dictmaker(c, n)
1013 struct compiling *c;
1014 node *n;
1015{
1016 int i;
1017 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1018 for (i = 0; i+2 < NCH(n); i += 4) {
1019 /* We must arrange things just right for STORE_SUBSCR.
1020 It wants the stack to look like (value) (dict) (key) */
1021 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001022 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001023 com_node(c, CHILD(n, i+2)); /* value */
1024 com_addbyte(c, ROT_TWO);
1025 com_node(c, CHILD(n, i)); /* key */
1026 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001027 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001028 }
1029}
1030
1031static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001032com_atom(c, n)
1033 struct compiling *c;
1034 node *n;
1035{
1036 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001037 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001038 int i;
1039 REQ(n, atom);
1040 ch = CHILD(n, 0);
1041 switch (TYPE(ch)) {
1042 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001043 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001044 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001045 com_push(c, 1);
1046 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001047 else
1048 com_node(c, CHILD(n, 1));
1049 break;
1050 case LSQB:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001051 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001052 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001053 com_push(c, 1);
1054 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001055 else
1056 com_list_constructor(c, CHILD(n, 1));
1057 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001058 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001059 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001060 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001061 if (TYPE(CHILD(n, 1)) != RBRACE)
1062 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001063 break;
1064 case BACKQUOTE:
1065 com_node(c, CHILD(n, 1));
1066 com_addbyte(c, UNARY_CONVERT);
1067 break;
1068 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001069 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001070 i = 255;
1071 }
1072 else {
1073 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001074 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001075 }
1076 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001077 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001078 break;
1079 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001080 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001081 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001082 c->c_errors++;
1083 i = 255;
1084 }
1085 else {
1086 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001087 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001088 }
1089 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001090 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001091 break;
1092 case NAME:
1093 com_addopname(c, LOAD_NAME, ch);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001094 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001095 break;
1096 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001097 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001098 com_error(c, PyExc_SystemError,
1099 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001100 }
1101}
1102
1103static void
1104com_slice(c, n, op)
1105 struct compiling *c;
1106 node *n;
1107 int op;
1108{
1109 if (NCH(n) == 1) {
1110 com_addbyte(c, op);
1111 }
1112 else if (NCH(n) == 2) {
1113 if (TYPE(CHILD(n, 0)) != COLON) {
1114 com_node(c, CHILD(n, 0));
1115 com_addbyte(c, op+1);
1116 }
1117 else {
1118 com_node(c, CHILD(n, 1));
1119 com_addbyte(c, op+2);
1120 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001121 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001122 }
1123 else {
1124 com_node(c, CHILD(n, 0));
1125 com_node(c, CHILD(n, 2));
1126 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001127 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001128 }
1129}
1130
Guido van Rossum635abd21997-01-06 22:56:52 +00001131static void
1132com_argument(c, n, pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001133 struct compiling *c;
1134 node *n; /* argument */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001135 PyObject **pkeywords;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001136{
1137 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001138 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001139 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001140 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001141 com_error(c, PyExc_SyntaxError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001142 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001143 }
1144 else {
1145 com_node(c, CHILD(n, 0));
1146 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001147 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001148 }
1149 m = n;
1150 do {
1151 m = CHILD(m, 0);
1152 } while (NCH(m) == 1);
1153 if (TYPE(m) != NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001154 com_error(c, PyExc_SyntaxError,
1155 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001156 }
1157 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001158 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001159 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001160 *pkeywords = PyDict_New();
Guido van Rossum635abd21997-01-06 22:56:52 +00001161 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001162 c->c_errors++;
1163 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001164 if (PyDict_GetItem(*pkeywords, v) != NULL)
1165 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001166 "duplicate keyword argument");
1167 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001168 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001169 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001170 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001171 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001172 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001173 }
1174 }
1175 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001176}
1177
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001178static void
1179com_call_function(c, n)
1180 struct compiling *c;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001181 node *n; /* EITHER arglist OR ')' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001182{
1183 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001184 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001185 }
1186 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001187 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001188 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001189 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001190 int star_flag = 0;
1191 int starstar_flag = 0;
1192 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001193 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001194 na = 0;
1195 nk = 0;
1196 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001197 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001198 if (TYPE(ch) == STAR ||
1199 TYPE(ch) == DOUBLESTAR)
1200 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001201 if (ch->n_lineno != lineno) {
1202 lineno = ch->n_lineno;
1203 com_addoparg(c, SET_LINENO, lineno);
1204 }
1205 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001206 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001207 na++;
1208 else
1209 nk++;
1210 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001211 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001212 while (i < NCH(n)) {
1213 node *tok = CHILD(n, i);
1214 node *ch = CHILD(n, i+1);
1215 i += 3;
1216 switch (TYPE(tok)) {
1217 case STAR: star_flag = 1; break;
1218 case DOUBLESTAR: starstar_flag = 1; break;
1219 }
1220 com_node(c, ch);
1221 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001222 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001223 com_error(c, PyExc_SyntaxError,
1224 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001225 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001226 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001227 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001228 star_flag + (starstar_flag << 1);
1229 else
1230 opcode = CALL_FUNCTION;
1231 com_addoparg(c, opcode, na | (nk << 8));
1232 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001233 }
1234}
1235
1236static void
1237com_select_member(c, n)
1238 struct compiling *c;
1239 node *n;
1240{
1241 com_addopname(c, LOAD_ATTR, n);
1242}
1243
1244static void
Guido van Rossum8861b741996-07-30 16:49:37 +00001245com_sliceobj(c, n)
1246 struct compiling *c;
1247 node *n;
1248{
1249 int i=0;
1250 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001251 node *ch;
1252
1253 /* first argument */
1254 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001255 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001256 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001257 i++;
1258 }
1259 else {
1260 com_node(c, CHILD(n,i));
1261 i++;
1262 REQ(CHILD(n,i),COLON);
1263 i++;
1264 }
1265 /* second argument */
1266 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1267 com_node(c, CHILD(n,i));
1268 i++;
1269 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001270 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001271 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001272 com_push(c, 1);
1273 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001274 /* remaining arguments */
1275 for (; i < NCH(n); i++) {
1276 ns++;
1277 ch=CHILD(n,i);
1278 REQ(ch, sliceop);
1279 if (NCH(ch) == 1) {
1280 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001281 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001282 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001283 }
1284 else
1285 com_node(c, CHILD(ch,1));
1286 }
1287 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001288 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001289}
1290
1291static void
1292com_subscript(c, n)
1293 struct compiling *c;
1294 node *n;
1295{
1296 node *ch;
1297 REQ(n, subscript);
1298 ch = CHILD(n,0);
1299 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001300 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001301 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001302 com_push(c, 1);
1303 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001304 else {
1305 /* check for slice */
1306 if ((TYPE(ch) == COLON || NCH(n) > 1))
1307 com_sliceobj(c, n);
1308 else {
1309 REQ(ch, test);
1310 com_node(c, ch);
1311 }
1312 }
1313}
1314
1315static void
1316com_subscriptlist(c, n, assigning)
1317 struct compiling *c;
1318 node *n;
1319 int assigning;
1320{
1321 int i, op;
1322 REQ(n, subscriptlist);
1323 /* Check to make backward compatible slice behavior for '[i:j]' */
1324 if (NCH(n) == 1) {
1325 node *sub = CHILD(n, 0); /* subscript */
1326 /* Make it is a simple slice.
Guido van Rossum8b993a91997-01-17 21:04:03 +00001327 Should have exactly one colon. */
Guido van Rossum8861b741996-07-30 16:49:37 +00001328 if ((TYPE(CHILD(sub, 0)) == COLON
1329 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
Guido van Rossum8b993a91997-01-17 21:04:03 +00001330 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1331 {
Guido van Rossum8861b741996-07-30 16:49:37 +00001332 if (assigning == OP_APPLY)
1333 op = SLICE;
1334 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001335 op = ((assigning == OP_ASSIGN) ?
1336 STORE_SLICE : DELETE_SLICE);
Guido van Rossum8861b741996-07-30 16:49:37 +00001337 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001338 if (op == STORE_SLICE)
1339 com_pop(c, 2);
1340 else if (op == DELETE_SLICE)
1341 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001342 return;
1343 }
1344 }
1345 /* Else normal subscriptlist. Compile each subscript. */
1346 for (i = 0; i < NCH(n); i += 2)
1347 com_subscript(c, CHILD(n, i));
1348 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001349 if (NCH(n) > 1) {
1350 i = (NCH(n)+1) / 2;
1351 com_addoparg(c, BUILD_TUPLE, i);
1352 com_pop(c, i-1);
1353 }
1354 if (assigning == OP_APPLY) {
Guido van Rossum8861b741996-07-30 16:49:37 +00001355 op = BINARY_SUBSCR;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001356 i = 1;
1357 }
1358 else if (assigning == OP_ASSIGN) {
1359 op = STORE_SUBSCR;
1360 i = 3;
1361 }
1362 else {
1363 op = DELETE_SUBSCR;
1364 i = 2;
1365 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001366 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001367 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001368}
1369
1370static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001371com_apply_trailer(c, n)
1372 struct compiling *c;
1373 node *n;
1374{
1375 REQ(n, trailer);
1376 switch (TYPE(CHILD(n, 0))) {
1377 case LPAR:
1378 com_call_function(c, CHILD(n, 1));
1379 break;
1380 case DOT:
1381 com_select_member(c, CHILD(n, 1));
1382 break;
1383 case LSQB:
Guido van Rossum8861b741996-07-30 16:49:37 +00001384 com_subscriptlist(c, CHILD(n, 1), OP_APPLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001385 break;
1386 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001387 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001388 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001389 }
1390}
1391
1392static void
Guido van Rossum50564e81996-01-12 01:13:16 +00001393com_power(c, n)
1394 struct compiling *c;
1395 node *n;
1396{
1397 int i;
1398 REQ(n, power);
1399 com_atom(c, CHILD(n, 0));
1400 for (i = 1; i < NCH(n); i++) {
1401 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1402 com_factor(c, CHILD(n, i+1));
1403 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001404 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001405 break;
1406 }
1407 else
1408 com_apply_trailer(c, CHILD(n, i));
1409 }
1410}
1411
1412static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001413com_factor(c, n)
1414 struct compiling *c;
1415 node *n;
1416{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001417 REQ(n, factor);
1418 if (TYPE(CHILD(n, 0)) == PLUS) {
1419 com_factor(c, CHILD(n, 1));
1420 com_addbyte(c, UNARY_POSITIVE);
1421 }
1422 else if (TYPE(CHILD(n, 0)) == MINUS) {
1423 com_factor(c, CHILD(n, 1));
1424 com_addbyte(c, UNARY_NEGATIVE);
1425 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001426 else if (TYPE(CHILD(n, 0)) == TILDE) {
1427 com_factor(c, CHILD(n, 1));
1428 com_addbyte(c, UNARY_INVERT);
1429 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001430 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001431 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001432 }
1433}
1434
1435static void
1436com_term(c, n)
1437 struct compiling *c;
1438 node *n;
1439{
1440 int i;
1441 int op;
1442 REQ(n, term);
1443 com_factor(c, CHILD(n, 0));
1444 for (i = 2; i < NCH(n); i += 2) {
1445 com_factor(c, CHILD(n, i));
1446 switch (TYPE(CHILD(n, i-1))) {
1447 case STAR:
1448 op = BINARY_MULTIPLY;
1449 break;
1450 case SLASH:
1451 op = BINARY_DIVIDE;
1452 break;
1453 case PERCENT:
1454 op = BINARY_MODULO;
1455 break;
1456 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001457 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001458 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001459 op = 255;
1460 }
1461 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001462 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001463 }
1464}
1465
1466static void
1467com_arith_expr(c, n)
1468 struct compiling *c;
1469 node *n;
1470{
1471 int i;
1472 int op;
1473 REQ(n, arith_expr);
1474 com_term(c, CHILD(n, 0));
1475 for (i = 2; i < NCH(n); i += 2) {
1476 com_term(c, CHILD(n, i));
1477 switch (TYPE(CHILD(n, i-1))) {
1478 case PLUS:
1479 op = BINARY_ADD;
1480 break;
1481 case MINUS:
1482 op = BINARY_SUBTRACT;
1483 break;
1484 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001485 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001486 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001487 op = 255;
1488 }
1489 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001490 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001491 }
1492}
1493
1494static void
1495com_shift_expr(c, n)
1496 struct compiling *c;
1497 node *n;
1498{
1499 int i;
1500 int op;
1501 REQ(n, shift_expr);
1502 com_arith_expr(c, CHILD(n, 0));
1503 for (i = 2; i < NCH(n); i += 2) {
1504 com_arith_expr(c, CHILD(n, i));
1505 switch (TYPE(CHILD(n, i-1))) {
1506 case LEFTSHIFT:
1507 op = BINARY_LSHIFT;
1508 break;
1509 case RIGHTSHIFT:
1510 op = BINARY_RSHIFT;
1511 break;
1512 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001513 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001514 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001515 op = 255;
1516 }
1517 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001518 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001519 }
1520}
1521
1522static void
1523com_and_expr(c, n)
1524 struct compiling *c;
1525 node *n;
1526{
1527 int i;
1528 int op;
1529 REQ(n, and_expr);
1530 com_shift_expr(c, CHILD(n, 0));
1531 for (i = 2; i < NCH(n); i += 2) {
1532 com_shift_expr(c, CHILD(n, i));
1533 if (TYPE(CHILD(n, i-1)) == AMPER) {
1534 op = BINARY_AND;
1535 }
1536 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001537 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001538 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001539 op = 255;
1540 }
1541 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001542 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001543 }
1544}
1545
1546static void
1547com_xor_expr(c, n)
1548 struct compiling *c;
1549 node *n;
1550{
1551 int i;
1552 int op;
1553 REQ(n, xor_expr);
1554 com_and_expr(c, CHILD(n, 0));
1555 for (i = 2; i < NCH(n); i += 2) {
1556 com_and_expr(c, CHILD(n, i));
1557 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1558 op = BINARY_XOR;
1559 }
1560 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001561 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001562 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001563 op = 255;
1564 }
1565 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001566 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001567 }
1568}
1569
1570static void
1571com_expr(c, n)
1572 struct compiling *c;
1573 node *n;
1574{
1575 int i;
1576 int op;
1577 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001578 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001579 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001580 com_xor_expr(c, CHILD(n, i));
1581 if (TYPE(CHILD(n, i-1)) == VBAR) {
1582 op = BINARY_OR;
1583 }
1584 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001585 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001586 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001587 op = 255;
1588 }
1589 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001590 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001591 }
1592}
1593
1594static enum cmp_op
1595cmp_type(n)
1596 node *n;
1597{
1598 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001599 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001600 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1601 if (NCH(n) == 1) {
1602 n = CHILD(n, 0);
1603 switch (TYPE(n)) {
1604 case LESS: return LT;
1605 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001606 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001607 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001608 case LESSEQUAL: return LE;
1609 case GREATEREQUAL: return GE;
1610 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001611 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1612 if (strcmp(STR(n), "is") == 0) return IS;
1613 }
1614 }
1615 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001616 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001617 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1618 return NOT_IN;
1619 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1620 return IS_NOT;
1621 }
1622 }
1623 return BAD;
1624}
1625
1626static void
1627com_comparison(c, n)
1628 struct compiling *c;
1629 node *n;
1630{
1631 int i;
1632 enum cmp_op op;
1633 int anchor;
1634 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1635 com_expr(c, CHILD(n, 0));
1636 if (NCH(n) == 1)
1637 return;
1638
1639 /****************************************************************
1640 The following code is generated for all but the last
1641 comparison in a chain:
1642
1643 label: on stack: opcode: jump to:
1644
1645 a <code to load b>
1646 a, b DUP_TOP
1647 a, b, b ROT_THREE
1648 b, a, b COMPARE_OP
1649 b, 0-or-1 JUMP_IF_FALSE L1
1650 b, 1 POP_TOP
1651 b
1652
1653 We are now ready to repeat this sequence for the next
1654 comparison in the chain.
1655
1656 For the last we generate:
1657
1658 b <code to load c>
1659 b, c COMPARE_OP
1660 0-or-1
1661
1662 If there were any jumps to L1 (i.e., there was more than one
1663 comparison), we generate:
1664
1665 0-or-1 JUMP_FORWARD L2
1666 L1: b, 0 ROT_TWO
1667 0, b POP_TOP
1668 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00001669 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001670 ****************************************************************/
1671
1672 anchor = 0;
1673
1674 for (i = 2; i < NCH(n); i += 2) {
1675 com_expr(c, CHILD(n, i));
1676 if (i+2 < NCH(n)) {
1677 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001678 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001679 com_addbyte(c, ROT_THREE);
1680 }
1681 op = cmp_type(CHILD(n, i-1));
1682 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001683 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001684 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001685 }
1686 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001687 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001688 if (i+2 < NCH(n)) {
1689 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1690 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001691 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001692 }
1693 }
1694
1695 if (anchor) {
1696 int anchor2 = 0;
1697 com_addfwref(c, JUMP_FORWARD, &anchor2);
1698 com_backpatch(c, anchor);
1699 com_addbyte(c, ROT_TWO);
1700 com_addbyte(c, POP_TOP);
1701 com_backpatch(c, anchor2);
1702 }
1703}
1704
1705static void
1706com_not_test(c, n)
1707 struct compiling *c;
1708 node *n;
1709{
1710 REQ(n, not_test); /* 'not' not_test | comparison */
1711 if (NCH(n) == 1) {
1712 com_comparison(c, CHILD(n, 0));
1713 }
1714 else {
1715 com_not_test(c, CHILD(n, 1));
1716 com_addbyte(c, UNARY_NOT);
1717 }
1718}
1719
1720static void
1721com_and_test(c, n)
1722 struct compiling *c;
1723 node *n;
1724{
1725 int i;
1726 int anchor;
1727 REQ(n, and_test); /* not_test ('and' not_test)* */
1728 anchor = 0;
1729 i = 0;
1730 for (;;) {
1731 com_not_test(c, CHILD(n, i));
1732 if ((i += 2) >= NCH(n))
1733 break;
1734 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1735 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001736 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001737 }
1738 if (anchor)
1739 com_backpatch(c, anchor);
1740}
1741
1742static void
1743com_test(c, n)
1744 struct compiling *c;
1745 node *n;
1746{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001747 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00001748 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001749 PyObject *v;
Guido van Rossum57531fe1993-11-30 14:57:42 +00001750 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001751 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001752 v = (PyObject *) icompile(CHILD(n, 0), c);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001753 if (v == NULL) {
1754 c->c_errors++;
1755 i = 255;
1756 }
1757 else {
1758 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001759 Py_DECREF(v);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001760 }
1761 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001762 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001763 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001764 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001765 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001766 else {
1767 int anchor = 0;
1768 int i = 0;
1769 for (;;) {
1770 com_and_test(c, CHILD(n, i));
1771 if ((i += 2) >= NCH(n))
1772 break;
1773 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1774 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001775 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001776 }
1777 if (anchor)
1778 com_backpatch(c, anchor);
1779 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001780}
1781
1782static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001783com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001784 struct compiling *c;
1785 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001786 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001787{
1788 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001789 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001790 com_node(c, CHILD(n, 0));
1791 }
1792 else {
1793 int i;
1794 int len;
1795 len = (NCH(n) + 1) / 2;
1796 for (i = 0; i < NCH(n); i += 2)
1797 com_node(c, CHILD(n, i));
1798 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001799 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001800 }
1801}
1802
1803
1804/* Begin of assignment compilation */
1805
Guido van Rossum79f25d91997-04-29 20:08:16 +00001806static void com_assign_name Py_PROTO((struct compiling *, node *, int));
1807static void com_assign Py_PROTO((struct compiling *, node *, int));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001808
1809static void
1810com_assign_attr(c, n, assigning)
1811 struct compiling *c;
1812 node *n;
1813 int assigning;
1814{
1815 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001816 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001817}
1818
1819static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001820com_assign_trailer(c, n, assigning)
1821 struct compiling *c;
1822 node *n;
1823 int assigning;
1824{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001825 REQ(n, trailer);
1826 switch (TYPE(CHILD(n, 0))) {
1827 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001828 com_error(c, PyExc_SyntaxError,
1829 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001830 break;
1831 case DOT: /* '.' NAME */
1832 com_assign_attr(c, CHILD(n, 1), assigning);
1833 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001834 case LSQB: /* '[' subscriptlist ']' */
1835 com_subscriptlist(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001836 break;
1837 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001838 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001839 }
1840}
1841
1842static void
1843com_assign_tuple(c, n, assigning)
1844 struct compiling *c;
1845 node *n;
1846 int assigning;
1847{
1848 int i;
1849 if (TYPE(n) != testlist)
1850 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001851 if (assigning) {
1852 i = (NCH(n)+1)/2;
1853 com_addoparg(c, UNPACK_TUPLE, i);
1854 com_push(c, i-1);
1855 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001856 for (i = 0; i < NCH(n); i += 2)
1857 com_assign(c, CHILD(n, i), assigning);
1858}
1859
1860static void
1861com_assign_list(c, n, assigning)
1862 struct compiling *c;
1863 node *n;
1864 int assigning;
1865{
1866 int i;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001867 if (assigning) {
1868 i = (NCH(n)+1)/2;
1869 com_addoparg(c, UNPACK_LIST, i);
1870 com_push(c, i-1);
1871 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001872 for (i = 0; i < NCH(n); i += 2)
1873 com_assign(c, CHILD(n, i), assigning);
1874}
1875
1876static void
1877com_assign_name(c, n, assigning)
1878 struct compiling *c;
1879 node *n;
1880 int assigning;
1881{
1882 REQ(n, NAME);
1883 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001884 if (assigning)
1885 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001886}
1887
1888static void
1889com_assign(c, n, assigning)
1890 struct compiling *c;
1891 node *n;
1892 int assigning;
1893{
1894 /* Loop to avoid trivial recursion */
1895 for (;;) {
1896 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001897
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001898 case exprlist:
1899 case testlist:
1900 if (NCH(n) > 1) {
1901 com_assign_tuple(c, n, assigning);
1902 return;
1903 }
1904 n = CHILD(n, 0);
1905 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001906
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001907 case test:
1908 case and_test:
1909 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001910 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001911 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001912 case xor_expr:
1913 case and_expr:
1914 case shift_expr:
1915 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001916 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00001917 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001918 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001919 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001920 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001921 return;
1922 }
1923 n = CHILD(n, 0);
1924 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001925
Guido van Rossum50564e81996-01-12 01:13:16 +00001926 case power: /* atom trailer* ('**' power)* */
1927/* ('+'|'-'|'~') factor | atom trailer* */
1928 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001929 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001930 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001931 return;
1932 }
Guido van Rossum50564e81996-01-12 01:13:16 +00001933 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001934 int i;
1935 com_node(c, CHILD(n, 0));
1936 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00001937 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001938 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001939 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00001940 return;
1941 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001942 com_apply_trailer(c, CHILD(n, i));
1943 } /* NB i is still alive */
1944 com_assign_trailer(c,
1945 CHILD(n, i), assigning);
1946 return;
1947 }
1948 n = CHILD(n, 0);
1949 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001950
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001951 case atom:
1952 switch (TYPE(CHILD(n, 0))) {
1953 case LPAR:
1954 n = CHILD(n, 1);
1955 if (TYPE(n) == RPAR) {
1956 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001957 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001958 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001959 return;
1960 }
1961 break;
1962 case LSQB:
1963 n = CHILD(n, 1);
1964 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001965 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001966 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001967 return;
1968 }
1969 com_assign_list(c, n, assigning);
1970 return;
1971 case NAME:
1972 com_assign_name(c, CHILD(n, 0), assigning);
1973 return;
1974 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001975 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001976 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001977 return;
1978 }
1979 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001980
1981 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001982 com_error(c, PyExc_SyntaxError,
1983 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001984 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001985
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001986 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001987 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001988 com_error(c, PyExc_SystemError,
1989 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001990 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001991
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001992 }
1993 }
1994}
Guido van Rossum7c531111997-03-11 18:42:21 +00001995
Guido van Rossum79f25d91997-04-29 20:08:16 +00001996/* Forward */ static node *get_rawdocstring Py_PROTO((node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001997
1998static void
1999com_expr_stmt(c, n)
2000 struct compiling *c;
2001 node *n;
2002{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002003 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002004 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002005 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002006 return;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002007 com_node(c, CHILD(n, NCH(n)-1));
2008 if (NCH(n) == 1) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002009 if (c->c_interactive)
2010 com_addbyte(c, PRINT_EXPR);
2011 else
2012 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002013 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002014 }
2015 else {
2016 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002017 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002018 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002019 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002020 com_push(c, 1);
2021 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002022 com_assign(c, CHILD(n, i), OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002023 }
2024 }
2025}
2026
2027static void
Guido van Rossum228d7f31997-04-02 05:24:36 +00002028com_assert_stmt(c, n)
2029 struct compiling *c;
2030 node *n;
2031{
2032 int a = 0, b = 0;
2033 int i;
2034 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2035 /* Generate code like for
2036
2037 if __debug__:
2038 if not <test>:
2039 raise AssertionError [, <message>]
2040
2041 where <message> is the second test, if present.
2042 */
2043 if (Py_OptimizeFlag)
2044 return;
2045 com_addopnamestr(c, LOAD_GLOBAL, "__debug__");
2046 com_push(c, 1);
2047 com_addfwref(c, JUMP_IF_FALSE, &a);
2048 com_addbyte(c, POP_TOP);
2049 com_pop(c, 1);
2050 com_node(c, CHILD(n, 1));
2051 com_addfwref(c, JUMP_IF_TRUE, &b);
2052 com_addbyte(c, POP_TOP);
2053 com_pop(c, 1);
2054 /* Raise that exception! */
2055 com_addopnamestr(c, LOAD_GLOBAL, "AssertionError");
2056 com_push(c, 1);
2057 i = NCH(n)/2; /* Either 2 or 4 */
2058 if (i > 1)
2059 com_node(c, CHILD(n, 3));
2060 com_addoparg(c, RAISE_VARARGS, i);
2061 com_pop(c, i);
2062 /* The interpreter does not fall through */
2063 /* All jumps converge here */
2064 com_backpatch(c, a);
2065 com_backpatch(c, b);
2066 com_addbyte(c, POP_TOP);
2067}
2068
2069static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002070com_print_stmt(c, n)
2071 struct compiling *c;
2072 node *n;
2073{
2074 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002075 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
2076 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002077 com_node(c, CHILD(n, i));
2078 com_addbyte(c, PRINT_ITEM);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002079 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002080 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002081 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002082 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002083 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002084}
2085
2086static void
2087com_return_stmt(c, n)
2088 struct compiling *c;
2089 node *n;
2090{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002091 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002092 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002093 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002094 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002095 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002096 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002097 com_push(c, 1);
2098 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002099 else
2100 com_node(c, CHILD(n, 1));
2101 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002102 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002103}
2104
2105static void
2106com_raise_stmt(c, n)
2107 struct compiling *c;
2108 node *n;
2109{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002110 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002111 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2112 if (NCH(n) > 1) {
2113 com_node(c, CHILD(n, 1));
2114 if (NCH(n) > 3) {
2115 com_node(c, CHILD(n, 3));
2116 if (NCH(n) > 5)
2117 com_node(c, CHILD(n, 5));
2118 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002119 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002120 i = NCH(n)/2;
2121 com_addoparg(c, RAISE_VARARGS, i);
2122 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002123}
2124
2125static void
2126com_import_stmt(c, n)
2127 struct compiling *c;
2128 node *n;
2129{
2130 int i;
2131 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002132 /* 'import' dotted_name (',' dotted_name)* |
2133 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002134 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002135 /* 'from' dotted_name 'import' ... */
2136 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002137 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002138 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002139 for (i = 3; i < NCH(n); i += 2)
2140 com_addopname(c, IMPORT_FROM, CHILD(n, i));
2141 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002142 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002143 }
2144 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002145 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002146 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002147 REQ(CHILD(n, i), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002148 com_addopname(c, IMPORT_NAME, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002149 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002150 com_addopname(c, STORE_NAME, CHILD(CHILD(n, i), 0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002151 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002152 }
2153 }
2154}
2155
2156static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00002157com_global_stmt(c, n)
2158 struct compiling *c;
2159 node *n;
2160{
2161 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002162 REQ(n, global_stmt);
2163 /* 'global' NAME (',' NAME)* */
2164 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002165 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002166#ifdef PRIVATE_NAME_MANGLING
2167 char buffer[256];
2168 if (s != NULL && s[0] == '_' && s[1] == '_' &&
2169 c->c_private != NULL &&
2170 com_mangle(c, s, buffer, (int)sizeof(buffer)))
2171 s = buffer;
2172#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +00002173 if (PyDict_GetItemString(c->c_locals, s) != NULL) {
2174 com_error(c, PyExc_SyntaxError,
2175 "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002176 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002177 else if (PyDict_SetItemString(c->c_globals, s, Py_None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002178 c->c_errors++;
2179 }
2180}
2181
Guido van Rossum681d79a1995-07-18 14:51:37 +00002182static int
2183com_newlocal_o(c, nameval)
2184 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002185 PyObject *nameval;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002186{
2187 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002188 PyObject *ival;
2189 if (PyList_Size(c->c_varnames) != c->c_nlocals) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002190 /* This is usually caused by an error on a previous call */
2191 if (c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002192 com_error(c, PyExc_SystemError,
2193 "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002194 }
2195 return 0;
2196 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002197 ival = PyInt_FromLong(i = c->c_nlocals++);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002198 if (ival == NULL)
2199 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002200 else if (PyDict_SetItem(c->c_locals, nameval, ival) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002201 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002202 else if (PyList_Append(c->c_varnames, nameval) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002203 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002204 Py_XDECREF(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002205 return i;
2206}
2207
2208static int
2209com_addlocal_o(c, nameval)
2210 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002211 PyObject *nameval;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002212{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002213 PyObject *ival = PyDict_GetItem(c->c_locals, nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002214 if (ival != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002215 return PyInt_AsLong(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002216 return com_newlocal_o(c, nameval);
2217}
2218
2219static int
2220com_newlocal(c, name)
2221 struct compiling *c;
2222 char *name;
2223{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002224 PyObject *nameval = PyString_InternFromString(name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002225 int i;
2226 if (nameval == NULL) {
2227 c->c_errors++;
2228 return 0;
2229 }
2230 i = com_newlocal_o(c, nameval);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002231 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002232 return i;
2233}
2234
Guido van Rossumc5e96291991-12-10 13:53:51 +00002235static void
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002236com_exec_stmt(c, n)
2237 struct compiling *c;
2238 node *n;
2239{
2240 REQ(n, exec_stmt);
2241 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2242 com_node(c, CHILD(n, 1));
2243 if (NCH(n) >= 4)
2244 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002245 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002246 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002247 com_push(c, 1);
2248 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002249 if (NCH(n) >= 6)
2250 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002251 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002252 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002253 com_push(c, 1);
2254 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002255 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002256 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002257}
2258
Guido van Rossum7c531111997-03-11 18:42:21 +00002259static int
2260is_constant_false(c, n)
2261 struct compiling *c;
2262 node *n;
2263{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002264 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002265 int i;
2266
2267 /* Label to avoid tail recursion */
2268 next:
2269 switch (TYPE(n)) {
2270
2271 case suite:
2272 if (NCH(n) == 1) {
2273 n = CHILD(n, 0);
2274 goto next;
2275 }
2276 /* Fall through */
2277 case file_input:
2278 for (i = 0; i < NCH(n); i++) {
2279 node *ch = CHILD(n, i);
2280 if (TYPE(ch) == stmt) {
2281 n = ch;
2282 goto next;
2283 }
2284 }
2285 break;
2286
2287 case stmt:
2288 case simple_stmt:
2289 case small_stmt:
2290 n = CHILD(n, 0);
2291 goto next;
2292
2293 case expr_stmt:
2294 case testlist:
2295 case test:
2296 case and_test:
2297 case not_test:
2298 case comparison:
2299 case expr:
2300 case xor_expr:
2301 case and_expr:
2302 case shift_expr:
2303 case arith_expr:
2304 case term:
2305 case factor:
2306 case power:
2307 case atom:
2308 if (NCH(n) == 1) {
2309 n = CHILD(n, 0);
2310 goto next;
2311 }
2312 break;
2313
2314 case NAME:
2315 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2316 return 1;
2317 break;
2318
2319 case NUMBER:
2320 v = parsenumber(c, STR(n));
2321 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002322 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002323 break;
2324 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002325 i = PyObject_IsTrue(v);
2326 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002327 return i == 0;
2328
2329 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002330 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002331 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002332 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002333 break;
2334 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002335 i = PyObject_IsTrue(v);
2336 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002337 return i == 0;
2338
2339 }
2340 return 0;
2341}
2342
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002343static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002344com_if_stmt(c, n)
2345 struct compiling *c;
2346 node *n;
2347{
2348 int i;
2349 int anchor = 0;
2350 REQ(n, if_stmt);
2351 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2352 for (i = 0; i+3 < NCH(n); i+=4) {
2353 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002354 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002355 if (is_constant_false(c, ch))
2356 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002357 if (i > 0)
2358 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002359 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002360 com_addfwref(c, JUMP_IF_FALSE, &a);
2361 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002362 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002363 com_node(c, CHILD(n, i+3));
2364 com_addfwref(c, JUMP_FORWARD, &anchor);
2365 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002366 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002367 com_addbyte(c, POP_TOP);
2368 }
2369 if (i+2 < NCH(n))
2370 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002371 if (anchor)
2372 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002373}
2374
2375static void
2376com_while_stmt(c, n)
2377 struct compiling *c;
2378 node *n;
2379{
2380 int break_anchor = 0;
2381 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002382 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002383 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2384 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002385 block_push(c, SETUP_LOOP);
2386 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002387 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002388 com_node(c, CHILD(n, 1));
2389 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2390 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002391 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002392 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002393 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002394 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002395 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2396 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002397 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002398 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002399 com_addbyte(c, POP_TOP);
2400 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002401 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002402 if (NCH(n) > 4)
2403 com_node(c, CHILD(n, 6));
2404 com_backpatch(c, break_anchor);
2405}
2406
2407static void
2408com_for_stmt(c, n)
2409 struct compiling *c;
2410 node *n;
2411{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002412 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002413 int break_anchor = 0;
2414 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002415 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002416 REQ(n, for_stmt);
2417 /* 'for' exprlist 'in' exprlist ':' 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);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002420 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002421 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002422 if (v == NULL)
2423 c->c_errors++;
2424 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002425 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002426 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002427 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002428 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002429 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002430 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002431 com_assign(c, CHILD(n, 1), OP_ASSIGN);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002432 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002433 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002434 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002435 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2436 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002437 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002438 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002439 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002440 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002441 if (NCH(n) > 8)
2442 com_node(c, CHILD(n, 8));
2443 com_backpatch(c, break_anchor);
2444}
2445
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002446/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002447
2448 SETUP_FINALLY L
2449 <code for S>
2450 POP_BLOCK
2451 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002452 L: <code for Sf>
2453 END_FINALLY
2454
2455 The special instructions use the block stack. Each block
2456 stack entry contains the instruction that created it (here
2457 SETUP_FINALLY), the level of the value stack at the time the
2458 block stack entry was created, and a label (here L).
2459
2460 SETUP_FINALLY:
2461 Pushes the current value stack level and the label
2462 onto the block stack.
2463 POP_BLOCK:
2464 Pops en entry from the block stack, and pops the value
2465 stack until its level is the same as indicated on the
2466 block stack. (The label is ignored.)
2467 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002468 Pops a variable number of entries from the *value* stack
2469 and re-raises the exception they specify. The number of
2470 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002471
2472 The block stack is unwound when an exception is raised:
2473 when a SETUP_FINALLY entry is found, the exception is pushed
2474 onto the value stack (and the exception condition is cleared),
2475 and the interpreter jumps to the label gotten from the block
2476 stack.
2477
2478 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002479 (The contents of the value stack is shown in [], with the top
2480 at the right; 'tb' is trace-back info, 'val' the exception's
2481 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002482
2483 Value stack Label Instruction Argument
2484 [] SETUP_EXCEPT L1
2485 [] <code for S>
2486 [] POP_BLOCK
2487 [] JUMP_FORWARD L0
2488
Guido van Rossum3f5da241990-12-20 15:06:42 +00002489 [tb, val, exc] L1: DUP )
2490 [tb, val, exc, exc] <evaluate E1> )
2491 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2492 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2493 [tb, val, exc, 1] POP )
2494 [tb, val, exc] POP
2495 [tb, val] <assign to V1> (or POP if no V1)
2496 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002497 [] <code for S1>
2498 JUMP_FORWARD L0
2499
Guido van Rossum3f5da241990-12-20 15:06:42 +00002500 [tb, val, exc, 0] L2: POP
2501 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002502 .............................etc.......................
2503
Guido van Rossum3f5da241990-12-20 15:06:42 +00002504 [tb, val, exc, 0] Ln+1: POP
2505 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002506
2507 [] L0: <next statement>
2508
2509 Of course, parts are not generated if Vi or Ei is not present.
2510*/
2511
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002512static void
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002513com_try_except(c, n)
2514 struct compiling *c;
2515 node *n;
2516{
2517 int except_anchor = 0;
2518 int end_anchor = 0;
2519 int else_anchor = 0;
2520 int i;
2521 node *ch;
2522
2523 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2524 block_push(c, SETUP_EXCEPT);
2525 com_node(c, CHILD(n, 2));
2526 com_addbyte(c, POP_BLOCK);
2527 block_pop(c, SETUP_EXCEPT);
2528 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2529 com_backpatch(c, except_anchor);
2530 for (i = 3;
2531 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2532 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002533 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002534 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002535 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002536 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002537 break;
2538 }
2539 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002540 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002541 com_addoparg(c, SET_LINENO, ch->n_lineno);
2542 if (NCH(ch) > 1) {
2543 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002544 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002545 com_node(c, CHILD(ch, 1));
2546 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002547 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002548 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2549 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002550 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002551 }
2552 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002553 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002554 if (NCH(ch) > 3)
Guido van Rossum8861b741996-07-30 16:49:37 +00002555 com_assign(c, CHILD(ch, 3), OP_ASSIGN);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002556 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002557 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002558 com_pop(c, 1);
2559 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002560 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002561 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002562 com_node(c, CHILD(n, i+2));
2563 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2564 if (except_anchor) {
2565 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002566 /* We come in with [tb, val, exc, 0] on the
2567 stack; one pop and it's the same as
2568 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002569 com_addbyte(c, POP_TOP);
2570 }
2571 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002572 /* We actually come in here with [tb, val, exc] but the
2573 END_FINALLY will zap those and jump around.
2574 The c_stacklevel does not reflect them so we need not pop
2575 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002576 com_addbyte(c, END_FINALLY);
2577 com_backpatch(c, else_anchor);
2578 if (i < NCH(n))
2579 com_node(c, CHILD(n, i+2));
2580 com_backpatch(c, end_anchor);
2581}
2582
2583static void
2584com_try_finally(c, n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002585 struct compiling *c;
2586 node *n;
2587{
2588 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002589 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002590
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002591 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2592 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002593 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002594 com_addbyte(c, POP_BLOCK);
2595 block_pop(c, SETUP_FINALLY);
2596 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002597 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002598 /* While the generated code pushes only one item,
2599 the try-finally handling can enter here with
2600 up to three items. OK, here are the details:
2601 3 for an exception, 2 for RETURN, 1 for BREAK. */
2602 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002603 com_backpatch(c, finally_anchor);
2604 ch = CHILD(n, NCH(n)-1);
2605 com_addoparg(c, SET_LINENO, ch->n_lineno);
2606 com_node(c, ch);
2607 com_addbyte(c, END_FINALLY);
2608 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002609 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002610}
2611
2612static void
2613com_try_stmt(c, n)
2614 struct compiling *c;
2615 node *n;
2616{
2617 REQ(n, try_stmt);
2618 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2619 | 'try' ':' suite 'finally' ':' suite */
2620 if (TYPE(CHILD(n, 3)) != except_clause)
2621 com_try_finally(c, n);
2622 else
2623 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002624}
2625
Guido van Rossum8b993a91997-01-17 21:04:03 +00002626static node *
2627get_rawdocstring(n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002628 node *n;
2629{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002630 int i;
2631
Guido van Rossum8b993a91997-01-17 21:04:03 +00002632 /* Label to avoid tail recursion */
2633 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002634 switch (TYPE(n)) {
2635
2636 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002637 if (NCH(n) == 1) {
2638 n = CHILD(n, 0);
2639 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002640 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002641 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002642 case file_input:
2643 for (i = 0; i < NCH(n); i++) {
2644 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002645 if (TYPE(ch) == stmt) {
2646 n = ch;
2647 goto next;
2648 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002649 }
2650 break;
2651
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002652 case stmt:
2653 case simple_stmt:
2654 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002655 n = CHILD(n, 0);
2656 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002657
2658 case expr_stmt:
2659 case testlist:
2660 case test:
2661 case and_test:
2662 case not_test:
2663 case comparison:
2664 case expr:
2665 case xor_expr:
2666 case and_expr:
2667 case shift_expr:
2668 case arith_expr:
2669 case term:
2670 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002671 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002672 if (NCH(n) == 1) {
2673 n = CHILD(n, 0);
2674 goto next;
2675 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002676 break;
2677
2678 case atom:
2679 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002680 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002681 break;
2682
2683 }
2684 return NULL;
2685}
2686
Guido van Rossum79f25d91997-04-29 20:08:16 +00002687static PyObject *
Guido van Rossum8b993a91997-01-17 21:04:03 +00002688get_docstring(n)
2689 node *n;
2690{
Guido van Rossum541563e1999-01-28 15:08:09 +00002691 /* Don't generate doc-strings if run with -OO */
2692 if (Py_OptimizeFlag > 1)
2693 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002694 n = get_rawdocstring(n);
2695 if (n == NULL)
2696 return NULL;
2697 return parsestrplus(n);
2698}
2699
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002700static void
2701com_suite(c, n)
2702 struct compiling *c;
2703 node *n;
2704{
2705 REQ(n, suite);
2706 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2707 if (NCH(n) == 1) {
2708 com_node(c, CHILD(n, 0));
2709 }
2710 else {
2711 int i;
2712 for (i = 0; i < NCH(n); i++) {
2713 node *ch = CHILD(n, i);
2714 if (TYPE(ch) == stmt)
2715 com_node(c, ch);
2716 }
2717 }
2718}
2719
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002720/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002721static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002722com_continue_stmt(c, n)
2723 struct compiling *c;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002724 node *n; /* Not used, but passed for consistency */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002725{
2726 int i = c->c_nblocks;
2727 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2728 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2729 }
2730 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002731 com_error(c, PyExc_SyntaxError,
2732 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002733 }
2734 /* XXX Could allow it inside a 'finally' clause
2735 XXX if we could pop the exception still on the stack */
2736}
2737
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002738static int
Guido van Rossum681d79a1995-07-18 14:51:37 +00002739com_argdefs(c, n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002740 struct compiling *c;
2741 node *n;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002742{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002743 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002744 if (TYPE(n) == lambdef) {
2745 /* lambdef: 'lambda' [varargslist] ':' test */
2746 n = CHILD(n, 1);
2747 }
2748 else {
2749 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2750 n = CHILD(n, 2);
2751 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2752 n = CHILD(n, 1);
2753 }
2754 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002755 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002756 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002757 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002758 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2759 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002760 nargs = 0;
2761 ndefs = 0;
2762 for (i = 0; i < nch; i++) {
2763 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002764 if (TYPE(CHILD(n, i)) == STAR ||
2765 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002766 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002767 nargs++;
2768 i++;
2769 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002770 t = RPAR; /* Anything except EQUAL or COMMA */
2771 else
2772 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002773 if (t == EQUAL) {
2774 i++;
2775 ndefs++;
2776 com_node(c, CHILD(n, i));
2777 i++;
2778 if (i >= nch)
2779 break;
2780 t = TYPE(CHILD(n, i));
2781 }
2782 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00002783 /* Treat "(a=1, b)" as an error */
2784 if (ndefs)
2785 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00002786 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002787 }
2788 if (t != COMMA)
2789 break;
2790 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002791 return ndefs;
2792}
2793
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002794static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002795com_funcdef(c, n)
2796 struct compiling *c;
2797 node *n;
2798{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002799 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002800 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002801 v = (PyObject *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002802 if (v == NULL)
2803 c->c_errors++;
2804 else {
2805 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002806 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002807 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002808 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002809 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002810 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002811 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002812 com_pop(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002813 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002814 }
2815}
2816
2817static void
Guido van Rossum25831651993-05-19 14:50:45 +00002818com_bases(c, n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002819 struct compiling *c;
2820 node *n;
2821{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002822 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002823 REQ(n, testlist);
2824 /* testlist: test (',' test)* [','] */
2825 for (i = 0; i < NCH(n); i += 2)
2826 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002827 i = (NCH(n)+1) / 2;
2828 com_addoparg(c, BUILD_TUPLE, i);
2829 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00002830}
2831
2832static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002833com_classdef(c, n)
2834 struct compiling *c;
2835 node *n;
2836{
Guido van Rossum25831651993-05-19 14:50:45 +00002837 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002838 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002839 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002840 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00002841 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00002842 c->c_errors++;
2843 return;
2844 }
2845 /* Push the class name on the stack */
2846 i = com_addconst(c, v);
2847 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002848 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002849 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00002850 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002851 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00002852 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002853 com_push(c, 1);
2854 }
Guido van Rossum25831651993-05-19 14:50:45 +00002855 else
2856 com_bases(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002857 v = (PyObject *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002858 if (v == NULL)
2859 c->c_errors++;
2860 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002861 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002862 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002863 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002864 com_addoparg(c, MAKE_FUNCTION, 0);
2865 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002866 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002867 com_pop(c, 2);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002868 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002869 Py_DECREF(v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002870 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002871}
2872
2873static void
2874com_node(c, n)
2875 struct compiling *c;
2876 node *n;
2877{
2878 switch (TYPE(n)) {
2879
2880 /* Definition nodes */
2881
2882 case funcdef:
2883 com_funcdef(c, n);
2884 break;
2885 case classdef:
2886 com_classdef(c, n);
2887 break;
2888
2889 /* Trivial parse tree nodes */
2890
2891 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002892 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002893 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002894 com_node(c, CHILD(n, 0));
2895 break;
2896
2897 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002898 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2899 com_addoparg(c, SET_LINENO, n->n_lineno);
2900 {
2901 int i;
2902 for (i = 0; i < NCH(n)-1; i += 2)
2903 com_node(c, CHILD(n, i));
2904 }
2905 break;
2906
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002907 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002908 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002909 com_node(c, CHILD(n, 0));
2910 break;
2911
2912 /* Statement nodes */
2913
2914 case expr_stmt:
2915 com_expr_stmt(c, n);
2916 break;
2917 case print_stmt:
2918 com_print_stmt(c, n);
2919 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002920 case del_stmt: /* 'del' exprlist */
Guido van Rossum8861b741996-07-30 16:49:37 +00002921 com_assign(c, CHILD(n, 1), OP_DELETE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002922 break;
2923 case pass_stmt:
2924 break;
2925 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002926 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002927 com_error(c, PyExc_SyntaxError,
2928 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002929 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002930 com_addbyte(c, BREAK_LOOP);
2931 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002932 case continue_stmt:
2933 com_continue_stmt(c, n);
2934 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002935 case return_stmt:
2936 com_return_stmt(c, n);
2937 break;
2938 case raise_stmt:
2939 com_raise_stmt(c, n);
2940 break;
2941 case import_stmt:
2942 com_import_stmt(c, n);
2943 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002944 case global_stmt:
2945 com_global_stmt(c, n);
2946 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002947 case exec_stmt:
2948 com_exec_stmt(c, n);
2949 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002950 case assert_stmt:
2951 com_assert_stmt(c, n);
2952 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002953 case if_stmt:
2954 com_if_stmt(c, n);
2955 break;
2956 case while_stmt:
2957 com_while_stmt(c, n);
2958 break;
2959 case for_stmt:
2960 com_for_stmt(c, n);
2961 break;
2962 case try_stmt:
2963 com_try_stmt(c, n);
2964 break;
2965 case suite:
2966 com_suite(c, n);
2967 break;
2968
2969 /* Expression nodes */
2970
2971 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002972 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002973 break;
2974 case test:
2975 com_test(c, n);
2976 break;
2977 case and_test:
2978 com_and_test(c, n);
2979 break;
2980 case not_test:
2981 com_not_test(c, n);
2982 break;
2983 case comparison:
2984 com_comparison(c, n);
2985 break;
2986 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002987 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002988 break;
2989 case expr:
2990 com_expr(c, n);
2991 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002992 case xor_expr:
2993 com_xor_expr(c, n);
2994 break;
2995 case and_expr:
2996 com_and_expr(c, n);
2997 break;
2998 case shift_expr:
2999 com_shift_expr(c, n);
3000 break;
3001 case arith_expr:
3002 com_arith_expr(c, n);
3003 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003004 case term:
3005 com_term(c, n);
3006 break;
3007 case factor:
3008 com_factor(c, n);
3009 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003010 case power:
3011 com_power(c, n);
3012 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003013 case atom:
3014 com_atom(c, n);
3015 break;
3016
3017 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003018 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003019 com_error(c, PyExc_SystemError,
3020 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003021 }
3022}
3023
Guido van Rossum79f25d91997-04-29 20:08:16 +00003024static void com_fplist Py_PROTO((struct compiling *, node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003025
3026static void
3027com_fpdef(c, n)
3028 struct compiling *c;
3029 node *n;
3030{
3031 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3032 if (TYPE(CHILD(n, 0)) == LPAR)
3033 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003034 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003035 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003036 com_pop(c, 1);
3037 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003038}
3039
3040static void
3041com_fplist(c, n)
3042 struct compiling *c;
3043 node *n;
3044{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003045 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003046 if (NCH(n) == 1) {
3047 com_fpdef(c, CHILD(n, 0));
3048 }
3049 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003050 int i = (NCH(n)+1)/2;
3051 com_addoparg(c, UNPACK_TUPLE, i);
3052 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003053 for (i = 0; i < NCH(n); i += 2)
3054 com_fpdef(c, CHILD(n, i));
3055 }
3056}
3057
3058static void
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003059com_arglist(c, n)
3060 struct compiling *c;
3061 node *n;
3062{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003063 int nch, i;
3064 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003065 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003066 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003067 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003068 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003069 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003070 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003071 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003072 node *ch = CHILD(n, i);
3073 node *fp;
3074 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00003075 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003076 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003077 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3078 fp = CHILD(ch, 0);
3079 if (TYPE(fp) == NAME)
3080 name = STR(fp);
3081 else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003082 name = nbuf;
3083 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003084 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003085 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003086 com_newlocal(c, name);
3087 c->c_argcount++;
3088 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003089 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003090 ch = CHILD(n, i);
3091 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003092 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003093 else
3094 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003095 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003096 /* Handle *arguments */
3097 if (i < nch) {
3098 node *ch;
3099 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003100 if (TYPE(ch) != DOUBLESTAR) {
3101 REQ(ch, STAR);
3102 ch = CHILD(n, i+1);
3103 if (TYPE(ch) == NAME) {
3104 c->c_flags |= CO_VARARGS;
3105 i += 3;
3106 com_newlocal(c, STR(ch));
3107 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003108 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003109 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003110 /* Handle **keywords */
3111 if (i < nch) {
3112 node *ch;
3113 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003114 if (TYPE(ch) != DOUBLESTAR) {
3115 REQ(ch, STAR);
3116 ch = CHILD(n, i+1);
3117 REQ(ch, STAR);
3118 ch = CHILD(n, i+2);
3119 }
3120 else
3121 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003122 REQ(ch, NAME);
3123 c->c_flags |= CO_VARKEYWORDS;
3124 com_newlocal(c, STR(ch));
3125 }
3126 if (complex) {
3127 /* Generate code for complex arguments only after
3128 having counted the simple arguments */
3129 int ilocal = 0;
3130 for (i = 0; i < nch; i++) {
3131 node *ch = CHILD(n, i);
3132 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003133 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003134 break;
3135 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3136 fp = CHILD(ch, 0);
3137 if (TYPE(fp) != NAME) {
3138 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003139 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003140 com_fpdef(c, ch);
3141 }
3142 ilocal++;
3143 if (++i >= nch)
3144 break;
3145 ch = CHILD(n, i);
3146 if (TYPE(ch) == EQUAL)
3147 i += 2;
3148 else
3149 REQ(ch, COMMA);
3150 }
3151 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003152}
3153
3154static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003155com_file_input(c, n)
3156 struct compiling *c;
3157 node *n;
3158{
3159 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003160 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003161 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003162 doc = get_docstring(n);
3163 if (doc != NULL) {
3164 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003165 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003166 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003167 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003168 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003169 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003170 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003171 for (i = 0; i < NCH(n); i++) {
3172 node *ch = CHILD(n, i);
3173 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3174 com_node(c, ch);
3175 }
3176}
3177
3178/* Top-level compile-node interface */
3179
3180static void
3181compile_funcdef(c, n)
3182 struct compiling *c;
3183 node *n;
3184{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003185 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003186 node *ch;
3187 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003188 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003189 doc = get_docstring(CHILD(n, 4));
3190 if (doc != NULL) {
3191 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003192 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003193 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003194 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003195 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003196 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3197 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003198 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003199 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003200 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003201 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003202 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003203 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003204 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003205 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003206 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003207}
3208
3209static void
Guido van Rossum590baa41993-11-30 13:40:46 +00003210compile_lambdef(c, n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003211 struct compiling *c;
3212 node *n;
3213{
Guido van Rossum590baa41993-11-30 13:40:46 +00003214 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003215 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003216 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003217
3218 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003219 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003220 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003221 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003222 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003223 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003224 else
3225 ch = CHILD(n, 2);
3226 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003227 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003228 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003229}
3230
3231static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003232compile_classdef(c, n)
3233 struct compiling *c;
3234 node *n;
3235{
3236 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003237 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003238 REQ(n, classdef);
3239 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3240 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003241#ifdef PRIVATE_NAME_MANGLING
3242 c->c_private = c->c_name;
3243#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003244 ch = CHILD(n, NCH(n)-1); /* The suite */
3245 doc = get_docstring(ch);
3246 if (doc != NULL) {
3247 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003248 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003249 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003250 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003251 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003252 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003253 }
3254 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003255 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003256 com_node(c, ch);
3257 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003258 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003259 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003260 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003261}
3262
3263static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003264compile_node(c, n)
3265 struct compiling *c;
3266 node *n;
3267{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003268 com_addoparg(c, SET_LINENO, n->n_lineno);
3269
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003270 switch (TYPE(n)) {
3271
Guido van Rossum4c417781991-01-21 16:09:22 +00003272 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003273 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003274 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003275 n = CHILD(n, 0);
3276 if (TYPE(n) != NEWLINE)
3277 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003278 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003279 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003280 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003281 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003282 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003283 break;
3284
Guido van Rossum4c417781991-01-21 16:09:22 +00003285 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003286 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003287 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003288 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003289 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003290 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003291 break;
3292
Guido van Rossum590baa41993-11-30 13:40:46 +00003293 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003294 com_node(c, CHILD(n, 0));
3295 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003296 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003297 break;
3298
Guido van Rossum590baa41993-11-30 13:40:46 +00003299 case lambdef: /* anonymous function definition */
3300 compile_lambdef(c, n);
3301 break;
3302
Guido van Rossum4c417781991-01-21 16:09:22 +00003303 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003304 compile_funcdef(c, n);
3305 break;
3306
Guido van Rossum4c417781991-01-21 16:09:22 +00003307 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003308 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003309 break;
3310
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003311 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003312 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003313 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003314 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003315 }
3316}
3317
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003318/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00003319
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003320 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
3321 instructions that refer to local variables with LOAD_FAST etc.
3322 The latter instructions are much faster because they don't need to
3323 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003324
Guido van Rossum681d79a1995-07-18 14:51:37 +00003325 To find all local variables, we check all STORE_NAME, IMPORT_FROM
3326 and DELETE_NAME instructions. This yields all local variables,
3327 function definitions, class definitions and import statements.
3328 Argument names have already been entered into the list by the
3329 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003330
3331 All remaining LOAD_NAME instructions must refer to non-local (global
3332 or builtin) variables, so are replaced by LOAD_GLOBAL.
3333
3334 There are two problems: 'from foo import *' and 'exec' may introduce
3335 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00003336 case, we can still optimize bona fide locals (since those
3337 statements will be surrounded by fast_2_locals() and
3338 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003339
Guido van Rossum681d79a1995-07-18 14:51:37 +00003340 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00003341
3342static void
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003343optimize(c)
3344 struct compiling *c;
Guido van Rossum282914b1991-04-04 10:42:56 +00003345{
Guido van Rossum0a697f61991-04-16 08:39:12 +00003346 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00003347 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00003348 int oparg = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003349 PyObject *name;
3350 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003351
Guido van Rossum282914b1991-04-04 10:42:56 +00003352#define NEXTOP() (*next_instr++)
3353#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossum79f25d91997-04-29 20:08:16 +00003354#define GETITEM(v, i) (PyList_GetItem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003355#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
3356
Guido van Rossum79f25d91997-04-29 20:08:16 +00003357 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003358
3359 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00003360
Guido van Rossum79f25d91997-04-29 20:08:16 +00003361 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003362 for (;;) {
3363 opcode = NEXTOP();
3364 if (opcode == STOP_CODE)
3365 break;
3366 if (HAS_ARG(opcode))
3367 oparg = NEXTARG();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003368 switch (opcode) {
3369 case STORE_NAME:
3370 case DELETE_NAME:
3371 case IMPORT_FROM:
3372 com_addlocal_o(c, GETNAMEOBJ(oparg));
3373 break;
3374 case EXEC_STMT:
3375 c->c_flags &= ~CO_OPTIMIZED;
3376 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00003377 }
3378 }
3379
Guido van Rossum79f25d91997-04-29 20:08:16 +00003380 if (PyDict_GetItemString(c->c_locals, "*") != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003381 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003382
Guido van Rossum79f25d91997-04-29 20:08:16 +00003383 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003384 for (;;) {
3385 cur_instr = next_instr;
3386 opcode = NEXTOP();
3387 if (opcode == STOP_CODE)
3388 break;
3389 if (HAS_ARG(opcode))
3390 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003391 if (opcode == LOAD_NAME ||
3392 opcode == STORE_NAME ||
3393 opcode == DELETE_NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003394 PyObject *v;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003395 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00003396 name = GETNAMEOBJ(oparg);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003397 v = PyDict_GetItem(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003398 if (v == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003399 if (opcode == LOAD_NAME &&
3400 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003401 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003402 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00003403 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003404 i = PyInt_AsLong(v);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003405 switch (opcode) {
3406 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
3407 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
3408 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
3409 }
3410 cur_instr[1] = i & 0xff;
3411 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00003412 }
3413 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003414
Guido van Rossum681d79a1995-07-18 14:51:37 +00003415 if (c->c_errors == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00003416 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00003417}
3418
Guido van Rossum79f25d91997-04-29 20:08:16 +00003419PyCodeObject *
3420PyNode_Compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003421 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003422 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003423{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003424 return jcompile(n, filename, NULL);
3425}
3426
Guido van Rossum79f25d91997-04-29 20:08:16 +00003427static PyCodeObject *
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003428icompile(n, base)
3429 node *n;
3430 struct compiling *base;
3431{
3432 return jcompile(n, base->c_filename, base);
3433}
3434
Guido van Rossum79f25d91997-04-29 20:08:16 +00003435static PyCodeObject *
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003436jcompile(n, filename, base)
3437 node *n;
3438 char *filename;
3439 struct compiling *base;
3440{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003441 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003442 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003443 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003444 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003445#ifdef PRIVATE_NAME_MANGLING
3446 if (base)
3447 sc.c_private = base->c_private;
3448 else
3449 sc.c_private = NULL;
3450#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003451 compile_node(&sc, n);
3452 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003453 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003454 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003455 sc.c_flags |= CO_NEWLOCALS;
3456 }
3457 else if (TYPE(n) == classdef)
3458 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00003459 co = NULL;
3460 if (sc.c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003461 PyObject *consts, *names, *varnames, *filename, *name;
3462 consts = PyList_AsTuple(sc.c_consts);
3463 names = PyList_AsTuple(sc.c_names);
3464 varnames = PyList_AsTuple(sc.c_varnames);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003465 filename = PyString_InternFromString(sc.c_filename);
3466 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003467 if (!PyErr_Occurred())
3468 co = PyCode_New(sc.c_argcount,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003469 sc.c_nlocals,
Guido van Rossum8b993a91997-01-17 21:04:03 +00003470 sc.c_maxstacklevel,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003471 sc.c_flags,
3472 sc.c_code,
3473 consts,
3474 names,
3475 varnames,
3476 filename,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003477 name,
3478 sc.c_firstlineno,
3479 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003480 Py_XDECREF(consts);
3481 Py_XDECREF(names);
3482 Py_XDECREF(varnames);
3483 Py_XDECREF(filename);
3484 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003485 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003486 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003487 return co;
3488}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003489
3490int
3491PyCode_Addr2Line(co, addrq)
3492 PyCodeObject *co;
3493 int addrq;
3494{
3495 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003496 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003497 int line = co->co_firstlineno;
3498 int addr = 0;
3499 while (--size >= 0) {
3500 addr += *p++;
3501 if (addr > addrq)
3502 break;
3503 line += *p++;
3504 }
3505 return line;
3506}