blob: 4373422f3140dbaa65ca0086eb0dab465017fc02 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum10dc2e81990-11-18 17:27:39 +000032/* Compile an expression node to intermediate code */
33
Guido van Rossum3f5da241990-12-20 15:06:42 +000034/* XXX TO DO:
Guido van Rossum8b993a91997-01-17 21:04:03 +000035 XXX add __doc__ attribute == co_doc to code object attributes?
36 XXX (it's currently the first item of the co_const tuple)
Guido van Rossum3f5da241990-12-20 15:06:42 +000037 XXX Generate simple jump for break/return outside 'try...finally'
Guido van Rossum8b993a91997-01-17 21:04:03 +000038 XXX Allow 'continue' inside try-finally
Guido van Rossum8b993a91997-01-17 21:04:03 +000039 XXX New opcode for loading the initial index for a for loop
Guido van Rossum681d79a1995-07-18 14:51:37 +000040 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000041*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000042
Guido van Rossum8ff077b1996-08-24 06:21:31 +000043#ifndef NO_PRIVATE_NAME_MANGLING
44#define PRIVATE_NAME_MANGLING
45#endif
46
Guido van Rossum79f25d91997-04-29 20:08:16 +000047#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000048
Guido van Rossum10dc2e81990-11-18 17:27:39 +000049#include "node.h"
50#include "token.h"
51#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000052#include "compile.h"
53#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000054#include "structmember.h"
55
56#include <ctype.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000057
Guido van Rossumb05a5c71997-05-07 17:46:13 +000058/* Three symbols from graminit.h are also defined in Python.h, with
59 Py_ prefixes to their names. Python.h can't include graminit.h
60 (which defines too many confusing symbols), but we can check here
61 that they haven't changed (which is very unlikely, but possible). */
62#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000063 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000064#endif
65#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000066 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000067#endif
68#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000069 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000070#endif
71
Guido van Rossum8e793d91997-03-03 19:13:14 +000072int Py_OptimizeFlag = 0;
73
Guido van Rossum8861b741996-07-30 16:49:37 +000074#define OP_DELETE 0
75#define OP_ASSIGN 1
76#define OP_APPLY 2
77
Guido van Rossum79f25d91997-04-29 20:08:16 +000078#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000079
80static struct memberlist code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000081 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
82 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000083 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000084 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000085 {"co_code", T_OBJECT, OFF(co_code), READONLY},
86 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
87 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000088 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000089 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000090 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000091 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
92 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000093 {NULL} /* Sentinel */
94};
95
Guido van Rossum79f25d91997-04-29 20:08:16 +000096static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +000097code_getattr(co, name)
Guido van Rossum79f25d91997-04-29 20:08:16 +000098 PyCodeObject *co;
Guido van Rossum3f5da241990-12-20 15:06:42 +000099 char *name;
100{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000101 return PyMember_Get((char *)co, code_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000102}
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000103
104static void
Guido van Rossum3f5da241990-12-20 15:06:42 +0000105code_dealloc(co)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000106 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000107{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000108 Py_XDECREF(co->co_code);
109 Py_XDECREF(co->co_consts);
110 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000111 Py_XDECREF(co->co_varnames);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000112 Py_XDECREF(co->co_filename);
113 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000114 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000115 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000116}
117
Guido van Rossum79f25d91997-04-29 20:08:16 +0000118static PyObject *
Guido van Rossum2dff9911992-09-03 20:50:59 +0000119code_repr(co)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000120 PyCodeObject *co;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000121{
122 char buf[500];
123 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000124 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000125 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000126
Guido van Rossuma396a882000-04-07 01:21:36 +0000127 if (co->co_firstlineno != 0)
128 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000129 if (co->co_filename && PyString_Check(co->co_filename))
130 filename = PyString_AsString(co->co_filename);
131 if (co->co_name && PyString_Check(co->co_name))
132 name = PyString_AsString(co->co_name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000133 sprintf(buf, "<code object %.100s at %lx, file \"%.300s\", line %d>",
134 name, (long)co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000135 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000136}
137
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000138static int
139code_compare(co, cp)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000140 PyCodeObject *co, *cp;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000141{
142 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000143 cmp = PyObject_Compare(co->co_name, cp->co_name);
144 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000145 cmp = co->co_argcount - cp->co_argcount;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000146 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000147 cmp = co->co_nlocals - cp->co_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000148 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000149 cmp = co->co_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000150 if (cmp) return cmp;
Guido van Rossumd076c731998-10-07 19:42:25 +0000151 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000152 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000153 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000154 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000155 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000156 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000157 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000158 return cmp;
159}
160
161static long
162code_hash(co)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000163 PyCodeObject *co;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000164{
Guido van Rossum44679592000-04-10 16:20:31 +0000165 long h, h0, h1, h2, h3, h4;
166 h0 = PyObject_Hash(co->co_name);
167 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000168 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000169 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000170 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000171 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000172 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000173 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000174 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000175 if (h4 == -1) return -1;
Guido van Rossum44679592000-04-10 16:20:31 +0000176 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000177 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000178 if (h == -1) h = -2;
179 return h;
180}
181
Guido van Rossum79f25d91997-04-29 20:08:16 +0000182PyTypeObject PyCode_Type = {
183 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000184 0,
185 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000186 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000187 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000188 (destructor)code_dealloc, /*tp_dealloc*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000189 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000190 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000191 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000192 (cmpfunc)code_compare, /*tp_compare*/
193 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000194 0, /*tp_as_number*/
195 0, /*tp_as_sequence*/
196 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000197 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000198};
199
Guido van Rossum644a12b1997-04-09 19:24:53 +0000200#define NAME_CHARS \
201 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
202
Guido van Rossum79f25d91997-04-29 20:08:16 +0000203PyCodeObject *
204PyCode_New(argcount, nlocals, stacksize, flags,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000205 code, consts, names, varnames, filename, name,
206 firstlineno, lnotab)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000207 int argcount;
208 int nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000209 int stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000210 int flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000211 PyObject *code;
212 PyObject *consts;
213 PyObject *names;
214 PyObject *varnames;
215 PyObject *filename;
216 PyObject *name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000217 int firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000218 PyObject *lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000219{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000220 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000221 int i;
Guido van Rossumd076c731998-10-07 19:42:25 +0000222 PyBufferProcs *pb;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000223 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000224 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000225 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000226 consts == NULL || !PyTuple_Check(consts) ||
227 names == NULL || !PyTuple_Check(names) ||
228 varnames == NULL || !PyTuple_Check(varnames) ||
229 name == NULL || !PyString_Check(name) ||
230 filename == NULL || !PyString_Check(filename) ||
231 lnotab == NULL || !PyString_Check(lnotab)) {
232 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000233 return NULL;
234 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000235 pb = code->ob_type->tp_as_buffer;
236 if (pb == NULL ||
237 pb->bf_getreadbuffer == NULL ||
238 pb->bf_getsegcount == NULL ||
239 (*pb->bf_getsegcount)(code, NULL) != 1)
240 {
241 PyErr_BadInternalCall();
242 return NULL;
243 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000244 /* Make sure names and varnames are all strings, & intern them */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000245 for (i = PyTuple_Size(names); --i >= 0; ) {
246 PyObject *v = PyTuple_GetItem(names, i);
247 if (v == NULL || !PyString_Check(v)) {
248 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000249 return NULL;
250 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000251 PyString_InternInPlace(&PyTuple_GET_ITEM(names, i));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000252 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000253 for (i = PyTuple_Size(varnames); --i >= 0; ) {
254 PyObject *v = PyTuple_GetItem(varnames, i);
255 if (v == NULL || !PyString_Check(v)) {
256 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000257 return NULL;
258 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000259 PyString_InternInPlace(&PyTuple_GET_ITEM(varnames, i));
260 }
261 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000262 for (i = PyTuple_Size(consts); --i >= 0; ) {
263 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000264 char *p;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000265 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000266 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000267 p = PyString_AsString(v);
Guido van Rossum582acec2000-06-28 22:07:35 +0000268 if (strspn(p, NAME_CHARS)
269 != (size_t)PyString_Size(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000270 continue;
271 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000272 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000273 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000274 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000275 co->co_argcount = argcount;
276 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000277 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000278 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000279 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000280 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000281 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000282 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000283 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000284 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000285 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000286 co->co_varnames = varnames;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000287 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000288 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000289 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000290 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000291 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000292 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000293 co->co_lnotab = lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000294 }
295 return co;
296}
297
298
299/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000300
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000301struct compiling {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000302 PyObject *c_code; /* string */
303 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000304 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000305 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000306 PyObject *c_name_dict; /* inverse of c_names */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000307 PyObject *c_globals; /* dictionary (value=None) */
308 PyObject *c_locals; /* dictionary (value=localID) */
309 PyObject *c_varnames; /* list (inverse of c_locals) */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000310 int c_nlocals; /* index of next local */
311 int c_argcount; /* number of top-level arguments */
312 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000313 int c_nexti; /* index into c_code */
314 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000315 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000316 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000317 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000318 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000319 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000320 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000321 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000322 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000323 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000324 int c_stacklevel; /* Current stack level */
325 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000326 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000327 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000328 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000329#ifdef PRIVATE_NAME_MANGLING
330 char *c_private; /* for private name mangling */
331#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000332};
333
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000334
Guido van Rossum452a9831996-09-17 14:32:04 +0000335/* Error message including line number */
336
337static void
338com_error(c, exc, msg)
339 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000340 PyObject *exc;
Guido van Rossum452a9831996-09-17 14:32:04 +0000341 char *msg;
342{
Guido van Rossum582acec2000-06-28 22:07:35 +0000343 size_t n = strlen(msg);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000344 PyObject *v;
Guido van Rossum452a9831996-09-17 14:32:04 +0000345 char buffer[30];
346 char *s;
Guido van Rossum635abd21997-01-06 22:56:52 +0000347 c->c_errors++;
Guido van Rossum452a9831996-09-17 14:32:04 +0000348 if (c->c_lineno <= 1) {
349 /* Unknown line number or single interactive command */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000350 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000351 return;
352 }
353 sprintf(buffer, " (line %d)", c->c_lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000354 v = PyString_FromStringAndSize((char *)NULL, n + strlen(buffer));
Guido van Rossum452a9831996-09-17 14:32:04 +0000355 if (v == NULL)
356 return; /* MemoryError, too bad */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000357 s = PyString_AS_STRING((PyStringObject *)v);
Guido van Rossum452a9831996-09-17 14:32:04 +0000358 strcpy(s, msg);
359 strcat(s, buffer);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000360 PyErr_SetObject(exc, v);
361 Py_DECREF(v);
Guido van Rossum452a9831996-09-17 14:32:04 +0000362}
363
364
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000365/* Interface to the block stack */
366
367static void
368block_push(c, type)
369 struct compiling *c;
370 int type;
371{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000372 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000373 com_error(c, PyExc_SystemError,
374 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000375 }
376 else {
377 c->c_block[c->c_nblocks++] = type;
378 }
379}
380
381static void
382block_pop(c, type)
383 struct compiling *c;
384 int type;
385{
386 if (c->c_nblocks > 0)
387 c->c_nblocks--;
388 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000389 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000390 }
391}
392
393
Guido van Rossum681d79a1995-07-18 14:51:37 +0000394/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000395
Guido van Rossum79f25d91997-04-29 20:08:16 +0000396static int com_init Py_PROTO((struct compiling *, char *));
397static void com_free Py_PROTO((struct compiling *));
398static void com_push Py_PROTO((struct compiling *, int));
399static void com_pop Py_PROTO((struct compiling *, int));
400static void com_done Py_PROTO((struct compiling *));
401static void com_node Py_PROTO((struct compiling *, struct _node *));
402static void com_factor Py_PROTO((struct compiling *, struct _node *));
403static void com_addbyte Py_PROTO((struct compiling *, int));
404static void com_addint Py_PROTO((struct compiling *, int));
405static void com_addoparg Py_PROTO((struct compiling *, int, int));
406static void com_addfwref Py_PROTO((struct compiling *, int, int *));
407static void com_backpatch Py_PROTO((struct compiling *, int));
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000408static int com_add Py_PROTO((struct compiling *, PyObject *, PyObject *, PyObject *));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000409static int com_addconst Py_PROTO((struct compiling *, PyObject *));
410static int com_addname Py_PROTO((struct compiling *, PyObject *));
411static void com_addopname Py_PROTO((struct compiling *, int, node *));
412static void com_list Py_PROTO((struct compiling *, node *, int));
413static int com_argdefs Py_PROTO((struct compiling *, node *));
414static int com_newlocal Py_PROTO((struct compiling *, char *));
415static PyCodeObject *icompile Py_PROTO((struct _node *, struct compiling *));
416static PyCodeObject *jcompile Py_PROTO((struct _node *, char *,
417 struct compiling *));
418static PyObject *parsestrplus Py_PROTO((node *));
419static PyObject *parsestr Py_PROTO((char *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000420
421static int
Guido van Rossum590baa41993-11-30 13:40:46 +0000422com_init(c, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000423 struct compiling *c;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000424 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000425{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000426 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000427 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
428 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000429 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000430 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000431 goto fail;
432 if ((c->c_const_dict = PyDict_New()) == NULL)
433 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000434 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000435 goto fail;
436 if ((c->c_name_dict = PyDict_New()) == NULL)
437 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000438 if ((c->c_globals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000439 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000440 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000441 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000442 if ((c->c_varnames = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000443 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000444 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
445 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000446 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000447 c->c_nlocals = 0;
448 c->c_argcount = 0;
449 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000450 c->c_nexti = 0;
451 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000452 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000453 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000454 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000455 c->c_begin = 0;
456 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000457 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000458 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000459 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000460 c->c_stacklevel = 0;
461 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000462 c->c_firstlineno = 0;
463 c->c_last_addr = 0;
464 c->c_last_line = 0;
465 c-> c_lnotab_next = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000466 return 1;
467
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000468 fail:
469 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000470 return 0;
471}
472
473static void
474com_free(c)
475 struct compiling *c;
476{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000477 Py_XDECREF(c->c_code);
478 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000479 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000480 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000481 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000482 Py_XDECREF(c->c_globals);
483 Py_XDECREF(c->c_locals);
484 Py_XDECREF(c->c_varnames);
485 Py_XDECREF(c->c_lnotab);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000486}
487
488static void
Guido van Rossum8b993a91997-01-17 21:04:03 +0000489com_push(c, n)
490 struct compiling *c;
491 int n;
492{
493 c->c_stacklevel += n;
494 if (c->c_stacklevel > c->c_maxstacklevel)
495 c->c_maxstacklevel = c->c_stacklevel;
496}
497
498static void
499com_pop(c, n)
500 struct compiling *c;
501 int n;
502{
503 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000504 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000505 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
506 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000507 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000508 c->c_stacklevel = 0;
509 }
510 else
511 c->c_stacklevel -= n;
512}
513
514static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000515com_done(c)
516 struct compiling *c;
517{
518 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000519 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000520 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000521 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000522}
523
524static void
525com_addbyte(c, byte)
526 struct compiling *c;
527 int byte;
528{
529 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000530 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000531 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000532 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000533 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000534 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000535 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000536 com_error(c, PyExc_SystemError,
537 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000538 }
539 if (c->c_code == NULL)
540 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000541 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000542 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000543 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000544 c->c_errors++;
545 return;
546 }
547 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000548 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000549}
550
551static void
552com_addint(c, x)
553 struct compiling *c;
554 int x;
555{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000556 com_addbyte(c, x & 0xff);
557 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000558}
559
560static void
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000561com_add_lnotab(c, addr, line)
562 struct compiling *c;
563 int addr;
564 int line;
565{
566 int size;
567 char *p;
568 if (c->c_lnotab == NULL)
569 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000570 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000571 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000572 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000573 c->c_errors++;
574 return;
575 }
576 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000577 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000578 *p++ = addr;
579 *p++ = line;
580 c->c_lnotab_next += 2;
581}
582
583static void
584com_set_lineno(c, lineno)
585 struct compiling *c;
586 int lineno;
587{
588 c->c_lineno = lineno;
589 if (c->c_firstlineno == 0) {
590 c->c_firstlineno = c->c_last_line = lineno;
591 }
592 else {
593 int incr_addr = c->c_nexti - c->c_last_addr;
594 int incr_line = lineno - c->c_last_line;
595 while (incr_addr > 0 || incr_line > 0) {
596 int trunc_addr = incr_addr;
597 int trunc_line = incr_line;
598 if (trunc_addr > 255)
599 trunc_addr = 255;
600 if (trunc_line > 255)
601 trunc_line = 255;
602 com_add_lnotab(c, trunc_addr, trunc_line);
603 incr_addr -= trunc_addr;
604 incr_line -= trunc_line;
605 }
606 c->c_last_addr = c->c_nexti;
607 c->c_last_line = lineno;
608 }
609}
610
611static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000612com_addoparg(c, op, arg)
613 struct compiling *c;
614 int op;
615 int arg;
616{
Guido van Rossum8e793d91997-03-03 19:13:14 +0000617 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000618 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000619 if (Py_OptimizeFlag)
620 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000621 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000622 com_addbyte(c, op);
623 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000624}
625
626static void
627com_addfwref(c, op, p_anchor)
628 struct compiling *c;
629 int op;
630 int *p_anchor;
631{
632 /* Compile a forward reference for backpatching */
633 int here;
634 int anchor;
635 com_addbyte(c, op);
636 here = c->c_nexti;
637 anchor = *p_anchor;
638 *p_anchor = here;
639 com_addint(c, anchor == 0 ? 0 : here - anchor);
640}
641
642static void
643com_backpatch(c, anchor)
644 struct compiling *c;
645 int anchor; /* Must be nonzero */
646{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000647 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000648 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000649 int dist;
650 int prev;
651 for (;;) {
652 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000653 prev = code[anchor] + (code[anchor+1] << 8);
654 dist = target - (anchor+2);
655 code[anchor] = dist & 0xff;
656 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000657 if (!prev)
658 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000659 anchor -= prev;
660 }
661}
662
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000663/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000664
665static int
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000666com_add(c, list, dict, v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000667 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000668 PyObject *list;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000669 PyObject *dict;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000670 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000671{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000672 PyObject *w, *t, *np=NULL;
673 long n;
674
675 t = Py_BuildValue("(OO)", v, v->ob_type);
676 if (t == NULL)
677 goto fail;
678 w = PyDict_GetItem(dict, t);
679 if (w != NULL) {
680 n = PyInt_AsLong(w);
681 } else {
682 n = PyList_Size(list);
683 np = PyInt_FromLong(n);
684 if (np == NULL)
685 goto fail;
686 if (PyList_Append(list, v) != 0)
687 goto fail;
688 if (PyDict_SetItem(dict, t, np) != 0)
689 goto fail;
690 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000691 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000692 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000693 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000694 fail:
695 Py_XDECREF(np);
696 Py_XDECREF(t);
697 c->c_errors++;
698 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000699}
700
701static int
702com_addconst(c, v)
703 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000704 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000705{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000706 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000707}
708
709static int
710com_addname(c, v)
711 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000712 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000713{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000714 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000715}
716
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000717#ifdef PRIVATE_NAME_MANGLING
718static int
719com_mangle(c, name, buffer, maxlen)
720 struct compiling *c;
721 char *name;
722 char *buffer;
Guido van Rossum582acec2000-06-28 22:07:35 +0000723 size_t maxlen;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000724{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000725 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000726 This is independent from how the name is used. */
727 char *p;
Guido van Rossum582acec2000-06-28 22:07:35 +0000728 size_t nlen, plen;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000729 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000730 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000731 return 0; /* Don't mangle __extremely_long_names */
732 if (name[nlen-1] == '_' && name[nlen-2] == '_')
733 return 0; /* Don't mangle __whatever__ */
734 p = c->c_private;
735 /* Strip leading underscores from class name */
736 while (*p == '_')
737 p++;
738 if (*p == '\0')
739 return 0; /* Don't mangle if class is just underscores */
740 plen = strlen(p);
741 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000742 plen = maxlen-nlen-2; /* Truncate class name if too long */
743 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000744 buffer[0] = '_';
745 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000746 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000747 /* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
748 return 1;
749}
750#endif
751
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000752static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000753com_addopnamestr(c, op, name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000754 struct compiling *c;
755 int op;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000756 char *name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000757{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000758 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000759 int i;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000760#ifdef PRIVATE_NAME_MANGLING
761 char buffer[256];
762 if (name != NULL && name[0] == '_' && name[1] == '_' &&
763 c->c_private != NULL &&
Guido van Rossum582acec2000-06-28 22:07:35 +0000764 com_mangle(c, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000765 name = buffer;
766#endif
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000767 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000768 c->c_errors++;
769 i = 255;
770 }
771 else {
772 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000773 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000774 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000775 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
776 switch (op) {
777 case LOAD_NAME:
778 case STORE_NAME:
779 case DELETE_NAME:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000780 if (PyDict_GetItemString(c->c_globals, name) != NULL) {
Guido van Rossumc5e96291991-12-10 13:53:51 +0000781 switch (op) {
782 case LOAD_NAME: op = LOAD_GLOBAL; break;
783 case STORE_NAME: op = STORE_GLOBAL; break;
784 case DELETE_NAME: op = DELETE_GLOBAL; break;
785 }
786 }
787 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000788 com_addoparg(c, op, i);
789}
790
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000791static void
792com_addopname(c, op, n)
793 struct compiling *c;
794 int op;
795 node *n;
796{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000797 char *name;
798 char buffer[1000];
799 /* XXX it is possible to write this code without the 1000
800 chars on the total length of dotted names, I just can't be
801 bothered right now */
802 if (TYPE(n) == STAR)
803 name = "*";
804 else if (TYPE(n) == dotted_name) {
805 char *p = buffer;
806 int i;
807 name = buffer;
808 for (i = 0; i < NCH(n); i += 2) {
809 char *s = STR(CHILD(n, i));
810 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000811 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000812 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +0000813 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000814 break;
815 }
816 if (p != buffer)
817 *p++ = '.';
818 strcpy(p, s);
819 p = strchr(p, '\0');
820 }
821 }
822 else {
823 REQ(n, NAME);
824 name = STR(n);
825 }
826 com_addopnamestr(c, op, name);
827}
828
Guido van Rossum79f25d91997-04-29 20:08:16 +0000829static PyObject *
Guido van Rossum452a9831996-09-17 14:32:04 +0000830parsenumber(co, s)
831 struct compiling *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000832 char *s;
833{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000834 extern double atof Py_PROTO((const char *));
Guido van Rossumc5e96291991-12-10 13:53:51 +0000835 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000836 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000837 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +0000838#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +0000839 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +0000840 int imflag;
841#endif
842
Guido van Rossum282914b1991-04-04 10:42:56 +0000843 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000844 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +0000845#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +0000846 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +0000847#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000848 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000849 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000850 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000851 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000852 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000853 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000854 if (*end == '\0') {
855 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000856 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000857 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000858 return NULL;
859 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000860 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000861 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000862 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +0000863#ifndef WITHOUT_COMPLEX
864 if (imflag) {
865 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000866 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +0000867 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000868 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000869 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +0000870 }
Guido van Rossumac1fc951997-10-08 15:23:55 +0000871 else
Guido van Rossum50564e81996-01-12 01:13:16 +0000872#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +0000873 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000874 PyFPE_START_PROTECT("atof", return 0)
875 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000876 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000877 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000878 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000879}
880
Guido van Rossum79f25d91997-04-29 20:08:16 +0000881static PyObject *
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000882parsestr(s)
883 char *s;
884{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000885 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +0000886 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000887 char *buf;
888 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000889 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000890 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +0000891 int first = *s;
892 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000893 int rawmode = 0;
894 int unicode = 0;
895 if (isalpha(quote) || quote == '_') {
896 if (quote == 'u' || quote == 'U') {
897 quote = *++s;
898 unicode = 1;
899 }
900 if (quote == 'r' || quote == 'R') {
901 quote = *++s;
902 rawmode = 1;
903 }
904 }
Guido van Rossum8054fad1993-10-26 15:19:44 +0000905 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000906 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000907 return NULL;
908 }
909 s++;
910 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +0000911 if (len > INT_MAX) {
912 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
913 return NULL;
914 }
Guido van Rossum8054fad1993-10-26 15:19:44 +0000915 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000916 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000917 return NULL;
918 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000919 if (len >= 4 && s[0] == quote && s[1] == quote) {
920 s += 2;
921 len -= 2;
922 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000923 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000924 return NULL;
925 }
926 }
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +0000927 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000928 if (rawmode)
929 return PyUnicode_DecodeRawUnicodeEscape(
930 s, len, NULL);
931 else
932 return PyUnicode_DecodeUnicodeEscape(
933 s, len, NULL);
934 }
935 else if (rawmode || strchr(s, '\\') == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000936 return PyString_FromStringAndSize(s, len);
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000937 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000938 v = PyString_FromStringAndSize((char *)NULL, len);
939 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000940 end = s + len;
941 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000942 if (*s != '\\') {
943 *p++ = *s++;
944 continue;
945 }
946 s++;
947 switch (*s++) {
948 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000949 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000950 case '\\': *p++ = '\\'; break;
951 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000952 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000953 case 'b': *p++ = '\b'; break;
954 case 'f': *p++ = '\014'; break; /* FF */
955 case 't': *p++ = '\t'; break;
956 case 'n': *p++ = '\n'; break;
957 case 'r': *p++ = '\r'; break;
958 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000959 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
960 case '0': case '1': case '2': case '3':
961 case '4': case '5': case '6': case '7':
962 c = s[-1] - '0';
963 if ('0' <= *s && *s <= '7') {
964 c = (c<<3) + *s++ - '0';
965 if ('0' <= *s && *s <= '7')
966 c = (c<<3) + *s++ - '0';
967 }
968 *p++ = c;
969 break;
970 case 'x':
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000971 if (isxdigit(Py_CHARMASK(*s))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000972 unsigned int x = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000973 do {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000974 c = Py_CHARMASK(*s);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000975 s++;
Guido van Rossumed1100f1997-10-20 23:24:07 +0000976 x = (x<<4) & ~0xF;
977 if (isdigit(c))
978 x += c - '0';
979 else if (islower(c))
980 x += 10 + c - 'a';
981 else
982 x += 10 + c - 'A';
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000983 } while (isxdigit(Py_CHARMASK(*s)));
Guido van Rossumed1100f1997-10-20 23:24:07 +0000984 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000985 break;
986 }
987 /* FALLTHROUGH */
988 default: *p++ = '\\'; *p++ = s[-1]; break;
989 }
990 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000991 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000992 return v;
993}
994
Guido van Rossum79f25d91997-04-29 20:08:16 +0000995static PyObject *
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000996parsestrplus(n)
997 node *n;
998{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000999 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001000 int i;
1001 REQ(CHILD(n, 0), STRING);
1002 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
1003 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001004 for (i = 1; i < NCH(n); i++) {
1005 PyObject *s;
1006 s = parsestr(STR(CHILD(n, i)));
1007 if (s == NULL)
1008 goto onError;
1009 if (PyString_Check(v) && PyString_Check(s)) {
1010 PyString_ConcatAndDel(&v, s);
1011 if (v == NULL)
1012 goto onError;
1013 }
1014 else {
1015 PyObject *temp;
1016 temp = PyUnicode_Concat(v, s);
1017 Py_DECREF(s);
1018 if (temp == NULL)
1019 goto onError;
1020 Py_DECREF(v);
1021 v = temp;
1022 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001023 }
1024 }
1025 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001026
1027 onError:
1028 Py_XDECREF(v);
1029 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001030}
1031
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001032static void
1033com_list_constructor(c, n)
1034 struct compiling *c;
1035 node *n;
1036{
1037 int len;
1038 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001039 if (TYPE(n) != testlist)
1040 REQ(n, exprlist);
1041 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
1042 len = (NCH(n) + 1) / 2;
1043 for (i = 0; i < NCH(n); i += 2)
1044 com_node(c, CHILD(n, i));
1045 com_addoparg(c, BUILD_LIST, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001046 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001047}
1048
1049static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001050com_dictmaker(c, n)
1051 struct compiling *c;
1052 node *n;
1053{
1054 int i;
1055 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1056 for (i = 0; i+2 < NCH(n); i += 4) {
1057 /* We must arrange things just right for STORE_SUBSCR.
1058 It wants the stack to look like (value) (dict) (key) */
1059 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001060 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001061 com_node(c, CHILD(n, i+2)); /* value */
1062 com_addbyte(c, ROT_TWO);
1063 com_node(c, CHILD(n, i)); /* key */
1064 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001065 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001066 }
1067}
1068
1069static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001070com_atom(c, n)
1071 struct compiling *c;
1072 node *n;
1073{
1074 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001075 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001076 int i;
1077 REQ(n, atom);
1078 ch = CHILD(n, 0);
1079 switch (TYPE(ch)) {
1080 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001081 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001082 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001083 com_push(c, 1);
1084 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001085 else
1086 com_node(c, CHILD(n, 1));
1087 break;
1088 case LSQB:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001089 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001090 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001091 com_push(c, 1);
1092 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001093 else
1094 com_list_constructor(c, CHILD(n, 1));
1095 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001096 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001097 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001098 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001099 if (TYPE(CHILD(n, 1)) != RBRACE)
1100 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001101 break;
1102 case BACKQUOTE:
1103 com_node(c, CHILD(n, 1));
1104 com_addbyte(c, UNARY_CONVERT);
1105 break;
1106 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001107 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001108 i = 255;
1109 }
1110 else {
1111 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001112 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001113 }
1114 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001115 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001116 break;
1117 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001118 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001119 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001120 c->c_errors++;
1121 i = 255;
1122 }
1123 else {
1124 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001125 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001126 }
1127 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001128 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001129 break;
1130 case NAME:
1131 com_addopname(c, LOAD_NAME, ch);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001132 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001133 break;
1134 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001135 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001136 com_error(c, PyExc_SystemError,
1137 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001138 }
1139}
1140
1141static void
1142com_slice(c, n, op)
1143 struct compiling *c;
1144 node *n;
1145 int op;
1146{
1147 if (NCH(n) == 1) {
1148 com_addbyte(c, op);
1149 }
1150 else if (NCH(n) == 2) {
1151 if (TYPE(CHILD(n, 0)) != COLON) {
1152 com_node(c, CHILD(n, 0));
1153 com_addbyte(c, op+1);
1154 }
1155 else {
1156 com_node(c, CHILD(n, 1));
1157 com_addbyte(c, op+2);
1158 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001159 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001160 }
1161 else {
1162 com_node(c, CHILD(n, 0));
1163 com_node(c, CHILD(n, 2));
1164 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001165 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001166 }
1167}
1168
Guido van Rossum635abd21997-01-06 22:56:52 +00001169static void
1170com_argument(c, n, pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001171 struct compiling *c;
1172 node *n; /* argument */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001173 PyObject **pkeywords;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001174{
1175 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001176 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001177 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001178 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001179 com_error(c, PyExc_SyntaxError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001180 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001181 }
1182 else {
1183 com_node(c, CHILD(n, 0));
1184 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001185 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001186 }
1187 m = n;
1188 do {
1189 m = CHILD(m, 0);
1190 } while (NCH(m) == 1);
1191 if (TYPE(m) != NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001192 com_error(c, PyExc_SyntaxError,
1193 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001194 }
1195 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001196 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001197 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001198 *pkeywords = PyDict_New();
Guido van Rossum635abd21997-01-06 22:56:52 +00001199 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001200 c->c_errors++;
1201 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001202 if (PyDict_GetItem(*pkeywords, v) != NULL)
1203 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001204 "duplicate keyword argument");
1205 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001206 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001207 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001208 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001209 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001210 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001211 }
1212 }
1213 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001214}
1215
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001216static void
1217com_call_function(c, n)
1218 struct compiling *c;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001219 node *n; /* EITHER arglist OR ')' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001220{
1221 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001222 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001223 }
1224 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001225 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001226 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001227 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001228 int star_flag = 0;
1229 int starstar_flag = 0;
1230 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001231 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001232 na = 0;
1233 nk = 0;
1234 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001235 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001236 if (TYPE(ch) == STAR ||
1237 TYPE(ch) == DOUBLESTAR)
1238 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001239 if (ch->n_lineno != lineno) {
1240 lineno = ch->n_lineno;
1241 com_addoparg(c, SET_LINENO, lineno);
1242 }
1243 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001244 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001245 na++;
1246 else
1247 nk++;
1248 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001249 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001250 while (i < NCH(n)) {
1251 node *tok = CHILD(n, i);
1252 node *ch = CHILD(n, i+1);
1253 i += 3;
1254 switch (TYPE(tok)) {
1255 case STAR: star_flag = 1; break;
1256 case DOUBLESTAR: starstar_flag = 1; break;
1257 }
1258 com_node(c, ch);
1259 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001260 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001261 com_error(c, PyExc_SyntaxError,
1262 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001263 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001264 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001265 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001266 star_flag + (starstar_flag << 1);
1267 else
1268 opcode = CALL_FUNCTION;
1269 com_addoparg(c, opcode, na | (nk << 8));
1270 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001271 }
1272}
1273
1274static void
1275com_select_member(c, n)
1276 struct compiling *c;
1277 node *n;
1278{
1279 com_addopname(c, LOAD_ATTR, n);
1280}
1281
1282static void
Guido van Rossum8861b741996-07-30 16:49:37 +00001283com_sliceobj(c, n)
1284 struct compiling *c;
1285 node *n;
1286{
1287 int i=0;
1288 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001289 node *ch;
1290
1291 /* first argument */
1292 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001293 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001294 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001295 i++;
1296 }
1297 else {
1298 com_node(c, CHILD(n,i));
1299 i++;
1300 REQ(CHILD(n,i),COLON);
1301 i++;
1302 }
1303 /* second argument */
1304 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1305 com_node(c, CHILD(n,i));
1306 i++;
1307 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001308 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001309 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001310 com_push(c, 1);
1311 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001312 /* remaining arguments */
1313 for (; i < NCH(n); i++) {
1314 ns++;
1315 ch=CHILD(n,i);
1316 REQ(ch, sliceop);
1317 if (NCH(ch) == 1) {
1318 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001319 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001320 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001321 }
1322 else
1323 com_node(c, CHILD(ch,1));
1324 }
1325 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001326 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001327}
1328
1329static void
1330com_subscript(c, n)
1331 struct compiling *c;
1332 node *n;
1333{
1334 node *ch;
1335 REQ(n, subscript);
1336 ch = CHILD(n,0);
1337 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001338 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001339 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001340 com_push(c, 1);
1341 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001342 else {
1343 /* check for slice */
1344 if ((TYPE(ch) == COLON || NCH(n) > 1))
1345 com_sliceobj(c, n);
1346 else {
1347 REQ(ch, test);
1348 com_node(c, ch);
1349 }
1350 }
1351}
1352
1353static void
1354com_subscriptlist(c, n, assigning)
1355 struct compiling *c;
1356 node *n;
1357 int assigning;
1358{
1359 int i, op;
1360 REQ(n, subscriptlist);
1361 /* Check to make backward compatible slice behavior for '[i:j]' */
1362 if (NCH(n) == 1) {
1363 node *sub = CHILD(n, 0); /* subscript */
1364 /* Make it is a simple slice.
Guido van Rossum8b993a91997-01-17 21:04:03 +00001365 Should have exactly one colon. */
Guido van Rossum8861b741996-07-30 16:49:37 +00001366 if ((TYPE(CHILD(sub, 0)) == COLON
1367 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
Guido van Rossum8b993a91997-01-17 21:04:03 +00001368 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1369 {
Guido van Rossum8861b741996-07-30 16:49:37 +00001370 if (assigning == OP_APPLY)
1371 op = SLICE;
1372 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001373 op = ((assigning == OP_ASSIGN) ?
1374 STORE_SLICE : DELETE_SLICE);
Guido van Rossum8861b741996-07-30 16:49:37 +00001375 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001376 if (op == STORE_SLICE)
1377 com_pop(c, 2);
1378 else if (op == DELETE_SLICE)
1379 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001380 return;
1381 }
1382 }
1383 /* Else normal subscriptlist. Compile each subscript. */
1384 for (i = 0; i < NCH(n); i += 2)
1385 com_subscript(c, CHILD(n, i));
1386 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001387 if (NCH(n) > 1) {
1388 i = (NCH(n)+1) / 2;
1389 com_addoparg(c, BUILD_TUPLE, i);
1390 com_pop(c, i-1);
1391 }
1392 if (assigning == OP_APPLY) {
Guido van Rossum8861b741996-07-30 16:49:37 +00001393 op = BINARY_SUBSCR;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001394 i = 1;
1395 }
1396 else if (assigning == OP_ASSIGN) {
1397 op = STORE_SUBSCR;
1398 i = 3;
1399 }
1400 else {
1401 op = DELETE_SUBSCR;
1402 i = 2;
1403 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001404 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001405 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001406}
1407
1408static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001409com_apply_trailer(c, n)
1410 struct compiling *c;
1411 node *n;
1412{
1413 REQ(n, trailer);
1414 switch (TYPE(CHILD(n, 0))) {
1415 case LPAR:
1416 com_call_function(c, CHILD(n, 1));
1417 break;
1418 case DOT:
1419 com_select_member(c, CHILD(n, 1));
1420 break;
1421 case LSQB:
Guido van Rossum8861b741996-07-30 16:49:37 +00001422 com_subscriptlist(c, CHILD(n, 1), OP_APPLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001423 break;
1424 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001425 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001426 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001427 }
1428}
1429
1430static void
Guido van Rossum50564e81996-01-12 01:13:16 +00001431com_power(c, n)
1432 struct compiling *c;
1433 node *n;
1434{
1435 int i;
1436 REQ(n, power);
1437 com_atom(c, CHILD(n, 0));
1438 for (i = 1; i < NCH(n); i++) {
1439 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1440 com_factor(c, CHILD(n, i+1));
1441 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001442 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001443 break;
1444 }
1445 else
1446 com_apply_trailer(c, CHILD(n, i));
1447 }
1448}
1449
1450static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001451com_factor(c, n)
1452 struct compiling *c;
1453 node *n;
1454{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001455 REQ(n, factor);
1456 if (TYPE(CHILD(n, 0)) == PLUS) {
1457 com_factor(c, CHILD(n, 1));
1458 com_addbyte(c, UNARY_POSITIVE);
1459 }
1460 else if (TYPE(CHILD(n, 0)) == MINUS) {
1461 com_factor(c, CHILD(n, 1));
1462 com_addbyte(c, UNARY_NEGATIVE);
1463 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001464 else if (TYPE(CHILD(n, 0)) == TILDE) {
1465 com_factor(c, CHILD(n, 1));
1466 com_addbyte(c, UNARY_INVERT);
1467 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001468 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001469 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001470 }
1471}
1472
1473static void
1474com_term(c, n)
1475 struct compiling *c;
1476 node *n;
1477{
1478 int i;
1479 int op;
1480 REQ(n, term);
1481 com_factor(c, CHILD(n, 0));
1482 for (i = 2; i < NCH(n); i += 2) {
1483 com_factor(c, CHILD(n, i));
1484 switch (TYPE(CHILD(n, i-1))) {
1485 case STAR:
1486 op = BINARY_MULTIPLY;
1487 break;
1488 case SLASH:
1489 op = BINARY_DIVIDE;
1490 break;
1491 case PERCENT:
1492 op = BINARY_MODULO;
1493 break;
1494 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001495 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001496 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001497 op = 255;
1498 }
1499 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001500 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001501 }
1502}
1503
1504static void
1505com_arith_expr(c, n)
1506 struct compiling *c;
1507 node *n;
1508{
1509 int i;
1510 int op;
1511 REQ(n, arith_expr);
1512 com_term(c, CHILD(n, 0));
1513 for (i = 2; i < NCH(n); i += 2) {
1514 com_term(c, CHILD(n, i));
1515 switch (TYPE(CHILD(n, i-1))) {
1516 case PLUS:
1517 op = BINARY_ADD;
1518 break;
1519 case MINUS:
1520 op = BINARY_SUBTRACT;
1521 break;
1522 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001523 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001524 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001525 op = 255;
1526 }
1527 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001528 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001529 }
1530}
1531
1532static void
1533com_shift_expr(c, n)
1534 struct compiling *c;
1535 node *n;
1536{
1537 int i;
1538 int op;
1539 REQ(n, shift_expr);
1540 com_arith_expr(c, CHILD(n, 0));
1541 for (i = 2; i < NCH(n); i += 2) {
1542 com_arith_expr(c, CHILD(n, i));
1543 switch (TYPE(CHILD(n, i-1))) {
1544 case LEFTSHIFT:
1545 op = BINARY_LSHIFT;
1546 break;
1547 case RIGHTSHIFT:
1548 op = BINARY_RSHIFT;
1549 break;
1550 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001551 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001552 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001553 op = 255;
1554 }
1555 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001556 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001557 }
1558}
1559
1560static void
1561com_and_expr(c, n)
1562 struct compiling *c;
1563 node *n;
1564{
1565 int i;
1566 int op;
1567 REQ(n, and_expr);
1568 com_shift_expr(c, CHILD(n, 0));
1569 for (i = 2; i < NCH(n); i += 2) {
1570 com_shift_expr(c, CHILD(n, i));
1571 if (TYPE(CHILD(n, i-1)) == AMPER) {
1572 op = BINARY_AND;
1573 }
1574 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001575 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001576 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001577 op = 255;
1578 }
1579 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001580 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001581 }
1582}
1583
1584static void
1585com_xor_expr(c, n)
1586 struct compiling *c;
1587 node *n;
1588{
1589 int i;
1590 int op;
1591 REQ(n, xor_expr);
1592 com_and_expr(c, CHILD(n, 0));
1593 for (i = 2; i < NCH(n); i += 2) {
1594 com_and_expr(c, CHILD(n, i));
1595 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1596 op = BINARY_XOR;
1597 }
1598 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001599 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001600 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001601 op = 255;
1602 }
1603 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001604 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001605 }
1606}
1607
1608static void
1609com_expr(c, n)
1610 struct compiling *c;
1611 node *n;
1612{
1613 int i;
1614 int op;
1615 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001616 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001617 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001618 com_xor_expr(c, CHILD(n, i));
1619 if (TYPE(CHILD(n, i-1)) == VBAR) {
1620 op = BINARY_OR;
1621 }
1622 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001623 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001624 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001625 op = 255;
1626 }
1627 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001628 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001629 }
1630}
1631
1632static enum cmp_op
1633cmp_type(n)
1634 node *n;
1635{
1636 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001637 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001638 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1639 if (NCH(n) == 1) {
1640 n = CHILD(n, 0);
1641 switch (TYPE(n)) {
1642 case LESS: return LT;
1643 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001644 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001645 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001646 case LESSEQUAL: return LE;
1647 case GREATEREQUAL: return GE;
1648 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001649 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1650 if (strcmp(STR(n), "is") == 0) return IS;
1651 }
1652 }
1653 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001654 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001655 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1656 return NOT_IN;
1657 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1658 return IS_NOT;
1659 }
1660 }
1661 return BAD;
1662}
1663
1664static void
1665com_comparison(c, n)
1666 struct compiling *c;
1667 node *n;
1668{
1669 int i;
1670 enum cmp_op op;
1671 int anchor;
1672 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1673 com_expr(c, CHILD(n, 0));
1674 if (NCH(n) == 1)
1675 return;
1676
1677 /****************************************************************
1678 The following code is generated for all but the last
1679 comparison in a chain:
1680
1681 label: on stack: opcode: jump to:
1682
1683 a <code to load b>
1684 a, b DUP_TOP
1685 a, b, b ROT_THREE
1686 b, a, b COMPARE_OP
1687 b, 0-or-1 JUMP_IF_FALSE L1
1688 b, 1 POP_TOP
1689 b
1690
1691 We are now ready to repeat this sequence for the next
1692 comparison in the chain.
1693
1694 For the last we generate:
1695
1696 b <code to load c>
1697 b, c COMPARE_OP
1698 0-or-1
1699
1700 If there were any jumps to L1 (i.e., there was more than one
1701 comparison), we generate:
1702
1703 0-or-1 JUMP_FORWARD L2
1704 L1: b, 0 ROT_TWO
1705 0, b POP_TOP
1706 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00001707 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001708 ****************************************************************/
1709
1710 anchor = 0;
1711
1712 for (i = 2; i < NCH(n); i += 2) {
1713 com_expr(c, CHILD(n, i));
1714 if (i+2 < NCH(n)) {
1715 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001716 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001717 com_addbyte(c, ROT_THREE);
1718 }
1719 op = cmp_type(CHILD(n, i-1));
1720 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001721 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001722 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001723 }
1724 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001725 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001726 if (i+2 < NCH(n)) {
1727 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1728 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001729 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001730 }
1731 }
1732
1733 if (anchor) {
1734 int anchor2 = 0;
1735 com_addfwref(c, JUMP_FORWARD, &anchor2);
1736 com_backpatch(c, anchor);
1737 com_addbyte(c, ROT_TWO);
1738 com_addbyte(c, POP_TOP);
1739 com_backpatch(c, anchor2);
1740 }
1741}
1742
1743static void
1744com_not_test(c, n)
1745 struct compiling *c;
1746 node *n;
1747{
1748 REQ(n, not_test); /* 'not' not_test | comparison */
1749 if (NCH(n) == 1) {
1750 com_comparison(c, CHILD(n, 0));
1751 }
1752 else {
1753 com_not_test(c, CHILD(n, 1));
1754 com_addbyte(c, UNARY_NOT);
1755 }
1756}
1757
1758static void
1759com_and_test(c, n)
1760 struct compiling *c;
1761 node *n;
1762{
1763 int i;
1764 int anchor;
1765 REQ(n, and_test); /* not_test ('and' not_test)* */
1766 anchor = 0;
1767 i = 0;
1768 for (;;) {
1769 com_not_test(c, CHILD(n, i));
1770 if ((i += 2) >= NCH(n))
1771 break;
1772 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1773 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001774 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001775 }
1776 if (anchor)
1777 com_backpatch(c, anchor);
1778}
1779
1780static void
1781com_test(c, n)
1782 struct compiling *c;
1783 node *n;
1784{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001785 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00001786 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001787 PyObject *v;
Guido van Rossum57531fe1993-11-30 14:57:42 +00001788 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001789 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001790 v = (PyObject *) icompile(CHILD(n, 0), c);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001791 if (v == NULL) {
1792 c->c_errors++;
1793 i = 255;
1794 }
1795 else {
1796 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001797 Py_DECREF(v);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001798 }
1799 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001800 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001801 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001802 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001803 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001804 else {
1805 int anchor = 0;
1806 int i = 0;
1807 for (;;) {
1808 com_and_test(c, CHILD(n, i));
1809 if ((i += 2) >= NCH(n))
1810 break;
1811 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1812 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001813 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001814 }
1815 if (anchor)
1816 com_backpatch(c, anchor);
1817 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001818}
1819
1820static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001821com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001822 struct compiling *c;
1823 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001824 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001825{
1826 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001827 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001828 com_node(c, CHILD(n, 0));
1829 }
1830 else {
1831 int i;
1832 int len;
1833 len = (NCH(n) + 1) / 2;
1834 for (i = 0; i < NCH(n); i += 2)
1835 com_node(c, CHILD(n, i));
1836 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001837 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001838 }
1839}
1840
1841
1842/* Begin of assignment compilation */
1843
Guido van Rossum79f25d91997-04-29 20:08:16 +00001844static void com_assign_name Py_PROTO((struct compiling *, node *, int));
1845static void com_assign Py_PROTO((struct compiling *, node *, int));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001846
1847static void
1848com_assign_attr(c, n, assigning)
1849 struct compiling *c;
1850 node *n;
1851 int assigning;
1852{
1853 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001854 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001855}
1856
1857static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001858com_assign_trailer(c, n, assigning)
1859 struct compiling *c;
1860 node *n;
1861 int assigning;
1862{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001863 REQ(n, trailer);
1864 switch (TYPE(CHILD(n, 0))) {
1865 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001866 com_error(c, PyExc_SyntaxError,
1867 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001868 break;
1869 case DOT: /* '.' NAME */
1870 com_assign_attr(c, CHILD(n, 1), assigning);
1871 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001872 case LSQB: /* '[' subscriptlist ']' */
1873 com_subscriptlist(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001874 break;
1875 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001876 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001877 }
1878}
1879
1880static void
1881com_assign_tuple(c, n, assigning)
1882 struct compiling *c;
1883 node *n;
1884 int assigning;
1885{
1886 int i;
1887 if (TYPE(n) != testlist)
1888 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001889 if (assigning) {
1890 i = (NCH(n)+1)/2;
1891 com_addoparg(c, UNPACK_TUPLE, i);
1892 com_push(c, i-1);
1893 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001894 for (i = 0; i < NCH(n); i += 2)
1895 com_assign(c, CHILD(n, i), assigning);
1896}
1897
1898static void
1899com_assign_list(c, n, assigning)
1900 struct compiling *c;
1901 node *n;
1902 int assigning;
1903{
1904 int i;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001905 if (assigning) {
1906 i = (NCH(n)+1)/2;
1907 com_addoparg(c, UNPACK_LIST, i);
1908 com_push(c, i-1);
1909 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001910 for (i = 0; i < NCH(n); i += 2)
1911 com_assign(c, CHILD(n, i), assigning);
1912}
1913
1914static void
1915com_assign_name(c, n, assigning)
1916 struct compiling *c;
1917 node *n;
1918 int assigning;
1919{
1920 REQ(n, NAME);
1921 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001922 if (assigning)
1923 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001924}
1925
1926static void
1927com_assign(c, n, assigning)
1928 struct compiling *c;
1929 node *n;
1930 int assigning;
1931{
1932 /* Loop to avoid trivial recursion */
1933 for (;;) {
1934 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001935
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001936 case exprlist:
1937 case testlist:
1938 if (NCH(n) > 1) {
1939 com_assign_tuple(c, n, assigning);
1940 return;
1941 }
1942 n = CHILD(n, 0);
1943 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001944
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001945 case test:
1946 case and_test:
1947 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001948 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001949 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001950 case xor_expr:
1951 case and_expr:
1952 case shift_expr:
1953 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001954 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00001955 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001956 if (NCH(n) > 1) {
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 operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001959 return;
1960 }
1961 n = CHILD(n, 0);
1962 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001963
Guido van Rossum50564e81996-01-12 01:13:16 +00001964 case power: /* atom trailer* ('**' power)* */
1965/* ('+'|'-'|'~') factor | atom trailer* */
1966 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001967 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001968 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001969 return;
1970 }
Guido van Rossum50564e81996-01-12 01:13:16 +00001971 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001972 int i;
1973 com_node(c, CHILD(n, 0));
1974 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00001975 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001976 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001977 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00001978 return;
1979 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001980 com_apply_trailer(c, CHILD(n, i));
1981 } /* NB i is still alive */
1982 com_assign_trailer(c,
1983 CHILD(n, i), assigning);
1984 return;
1985 }
1986 n = CHILD(n, 0);
1987 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001988
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001989 case atom:
1990 switch (TYPE(CHILD(n, 0))) {
1991 case LPAR:
1992 n = CHILD(n, 1);
1993 if (TYPE(n) == RPAR) {
1994 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001995 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001996 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001997 return;
1998 }
1999 break;
2000 case LSQB:
2001 n = CHILD(n, 1);
2002 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002003 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002004 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002005 return;
2006 }
2007 com_assign_list(c, n, assigning);
2008 return;
2009 case NAME:
2010 com_assign_name(c, CHILD(n, 0), assigning);
2011 return;
2012 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002013 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002014 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002015 return;
2016 }
2017 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002018
2019 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002020 com_error(c, PyExc_SyntaxError,
2021 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002022 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002023
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002024 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002025 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002026 com_error(c, PyExc_SystemError,
2027 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002028 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002029
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002030 }
2031 }
2032}
Guido van Rossum7c531111997-03-11 18:42:21 +00002033
Guido van Rossum79f25d91997-04-29 20:08:16 +00002034/* Forward */ static node *get_rawdocstring Py_PROTO((node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002035
2036static void
2037com_expr_stmt(c, n)
2038 struct compiling *c;
2039 node *n;
2040{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002041 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002042 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002043 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002044 return;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002045 com_node(c, CHILD(n, NCH(n)-1));
2046 if (NCH(n) == 1) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002047 if (c->c_interactive)
2048 com_addbyte(c, PRINT_EXPR);
2049 else
2050 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002051 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002052 }
2053 else {
2054 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002055 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002056 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002057 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002058 com_push(c, 1);
2059 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002060 com_assign(c, CHILD(n, i), OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002061 }
2062 }
2063}
2064
2065static void
Guido van Rossum228d7f31997-04-02 05:24:36 +00002066com_assert_stmt(c, n)
2067 struct compiling *c;
2068 node *n;
2069{
2070 int a = 0, b = 0;
2071 int i;
2072 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2073 /* Generate code like for
2074
2075 if __debug__:
2076 if not <test>:
2077 raise AssertionError [, <message>]
2078
2079 where <message> is the second test, if present.
2080 */
2081 if (Py_OptimizeFlag)
2082 return;
2083 com_addopnamestr(c, LOAD_GLOBAL, "__debug__");
2084 com_push(c, 1);
2085 com_addfwref(c, JUMP_IF_FALSE, &a);
2086 com_addbyte(c, POP_TOP);
2087 com_pop(c, 1);
2088 com_node(c, CHILD(n, 1));
2089 com_addfwref(c, JUMP_IF_TRUE, &b);
2090 com_addbyte(c, POP_TOP);
2091 com_pop(c, 1);
2092 /* Raise that exception! */
2093 com_addopnamestr(c, LOAD_GLOBAL, "AssertionError");
2094 com_push(c, 1);
2095 i = NCH(n)/2; /* Either 2 or 4 */
2096 if (i > 1)
2097 com_node(c, CHILD(n, 3));
2098 com_addoparg(c, RAISE_VARARGS, i);
2099 com_pop(c, i);
2100 /* The interpreter does not fall through */
2101 /* All jumps converge here */
2102 com_backpatch(c, a);
2103 com_backpatch(c, b);
2104 com_addbyte(c, POP_TOP);
2105}
2106
2107static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002108com_print_stmt(c, n)
2109 struct compiling *c;
2110 node *n;
2111{
2112 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002113 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
2114 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002115 com_node(c, CHILD(n, i));
2116 com_addbyte(c, PRINT_ITEM);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002117 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002118 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002119 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002120 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002121 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002122}
2123
2124static void
2125com_return_stmt(c, n)
2126 struct compiling *c;
2127 node *n;
2128{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002129 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002130 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002131 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002132 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002133 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002134 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002135 com_push(c, 1);
2136 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002137 else
2138 com_node(c, CHILD(n, 1));
2139 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002140 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002141}
2142
2143static void
2144com_raise_stmt(c, n)
2145 struct compiling *c;
2146 node *n;
2147{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002148 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002149 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2150 if (NCH(n) > 1) {
2151 com_node(c, CHILD(n, 1));
2152 if (NCH(n) > 3) {
2153 com_node(c, CHILD(n, 3));
2154 if (NCH(n) > 5)
2155 com_node(c, CHILD(n, 5));
2156 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002157 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002158 i = NCH(n)/2;
2159 com_addoparg(c, RAISE_VARARGS, i);
2160 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002161}
2162
2163static void
2164com_import_stmt(c, n)
2165 struct compiling *c;
2166 node *n;
2167{
2168 int i;
2169 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002170 /* 'import' dotted_name (',' dotted_name)* |
2171 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002172 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002173 /* 'from' dotted_name 'import' ... */
2174 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002175 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002176 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002177 for (i = 3; i < NCH(n); i += 2)
2178 com_addopname(c, IMPORT_FROM, CHILD(n, i));
2179 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002180 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002181 }
2182 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002183 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002184 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002185 REQ(CHILD(n, i), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002186 com_addopname(c, IMPORT_NAME, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002187 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002188 com_addopname(c, STORE_NAME, CHILD(CHILD(n, i), 0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002189 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002190 }
2191 }
2192}
2193
2194static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00002195com_global_stmt(c, n)
2196 struct compiling *c;
2197 node *n;
2198{
2199 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002200 REQ(n, global_stmt);
2201 /* 'global' NAME (',' NAME)* */
2202 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002203 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002204#ifdef PRIVATE_NAME_MANGLING
2205 char buffer[256];
2206 if (s != NULL && s[0] == '_' && s[1] == '_' &&
2207 c->c_private != NULL &&
Guido van Rossum582acec2000-06-28 22:07:35 +00002208 com_mangle(c, s, buffer, sizeof(buffer)))
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002209 s = buffer;
2210#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +00002211 if (PyDict_GetItemString(c->c_locals, s) != NULL) {
2212 com_error(c, PyExc_SyntaxError,
2213 "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002214 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002215 else if (PyDict_SetItemString(c->c_globals, s, Py_None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002216 c->c_errors++;
2217 }
2218}
2219
Guido van Rossum681d79a1995-07-18 14:51:37 +00002220static int
2221com_newlocal_o(c, nameval)
2222 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002223 PyObject *nameval;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002224{
2225 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002226 PyObject *ival;
2227 if (PyList_Size(c->c_varnames) != c->c_nlocals) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002228 /* This is usually caused by an error on a previous call */
2229 if (c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002230 com_error(c, PyExc_SystemError,
2231 "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002232 }
2233 return 0;
2234 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002235 ival = PyInt_FromLong(i = c->c_nlocals++);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002236 if (ival == NULL)
2237 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002238 else if (PyDict_SetItem(c->c_locals, nameval, ival) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002239 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002240 else if (PyList_Append(c->c_varnames, nameval) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002241 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002242 Py_XDECREF(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002243 return i;
2244}
2245
2246static int
2247com_addlocal_o(c, nameval)
2248 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002249 PyObject *nameval;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002250{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002251 PyObject *ival = PyDict_GetItem(c->c_locals, nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002252 if (ival != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002253 return PyInt_AsLong(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002254 return com_newlocal_o(c, nameval);
2255}
2256
2257static int
2258com_newlocal(c, name)
2259 struct compiling *c;
2260 char *name;
2261{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002262 PyObject *nameval = PyString_InternFromString(name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002263 int i;
2264 if (nameval == NULL) {
2265 c->c_errors++;
2266 return 0;
2267 }
2268 i = com_newlocal_o(c, nameval);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002269 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002270 return i;
2271}
2272
Guido van Rossumc5e96291991-12-10 13:53:51 +00002273static void
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002274com_exec_stmt(c, n)
2275 struct compiling *c;
2276 node *n;
2277{
2278 REQ(n, exec_stmt);
2279 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2280 com_node(c, CHILD(n, 1));
2281 if (NCH(n) >= 4)
2282 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002283 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002284 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002285 com_push(c, 1);
2286 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002287 if (NCH(n) >= 6)
2288 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002289 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002290 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002291 com_push(c, 1);
2292 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002293 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002294 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002295}
2296
Guido van Rossum7c531111997-03-11 18:42:21 +00002297static int
2298is_constant_false(c, n)
2299 struct compiling *c;
2300 node *n;
2301{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002302 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002303 int i;
2304
2305 /* Label to avoid tail recursion */
2306 next:
2307 switch (TYPE(n)) {
2308
2309 case suite:
2310 if (NCH(n) == 1) {
2311 n = CHILD(n, 0);
2312 goto next;
2313 }
2314 /* Fall through */
2315 case file_input:
2316 for (i = 0; i < NCH(n); i++) {
2317 node *ch = CHILD(n, i);
2318 if (TYPE(ch) == stmt) {
2319 n = ch;
2320 goto next;
2321 }
2322 }
2323 break;
2324
2325 case stmt:
2326 case simple_stmt:
2327 case small_stmt:
2328 n = CHILD(n, 0);
2329 goto next;
2330
2331 case expr_stmt:
2332 case testlist:
2333 case test:
2334 case and_test:
2335 case not_test:
2336 case comparison:
2337 case expr:
2338 case xor_expr:
2339 case and_expr:
2340 case shift_expr:
2341 case arith_expr:
2342 case term:
2343 case factor:
2344 case power:
2345 case atom:
2346 if (NCH(n) == 1) {
2347 n = CHILD(n, 0);
2348 goto next;
2349 }
2350 break;
2351
2352 case NAME:
2353 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2354 return 1;
2355 break;
2356
2357 case NUMBER:
2358 v = parsenumber(c, STR(n));
2359 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002360 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002361 break;
2362 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002363 i = PyObject_IsTrue(v);
2364 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002365 return i == 0;
2366
2367 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002368 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002369 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002370 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002371 break;
2372 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002373 i = PyObject_IsTrue(v);
2374 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002375 return i == 0;
2376
2377 }
2378 return 0;
2379}
2380
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002381static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002382com_if_stmt(c, n)
2383 struct compiling *c;
2384 node *n;
2385{
2386 int i;
2387 int anchor = 0;
2388 REQ(n, if_stmt);
2389 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2390 for (i = 0; i+3 < NCH(n); i+=4) {
2391 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002392 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002393 if (is_constant_false(c, ch))
2394 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002395 if (i > 0)
2396 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002397 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002398 com_addfwref(c, JUMP_IF_FALSE, &a);
2399 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002400 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002401 com_node(c, CHILD(n, i+3));
2402 com_addfwref(c, JUMP_FORWARD, &anchor);
2403 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002404 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002405 com_addbyte(c, POP_TOP);
2406 }
2407 if (i+2 < NCH(n))
2408 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002409 if (anchor)
2410 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002411}
2412
2413static void
2414com_while_stmt(c, n)
2415 struct compiling *c;
2416 node *n;
2417{
2418 int break_anchor = 0;
2419 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002420 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002421 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2422 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002423 block_push(c, SETUP_LOOP);
2424 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002425 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002426 com_node(c, CHILD(n, 1));
2427 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2428 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002429 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002430 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002431 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002432 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002433 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2434 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002435 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002436 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002437 com_addbyte(c, POP_TOP);
2438 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002439 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002440 if (NCH(n) > 4)
2441 com_node(c, CHILD(n, 6));
2442 com_backpatch(c, break_anchor);
2443}
2444
2445static void
2446com_for_stmt(c, n)
2447 struct compiling *c;
2448 node *n;
2449{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002450 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002451 int break_anchor = 0;
2452 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002453 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002454 REQ(n, for_stmt);
2455 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2456 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002457 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002458 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002459 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002460 if (v == NULL)
2461 c->c_errors++;
2462 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002463 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002464 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002465 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002466 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002467 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002468 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002469 com_assign(c, CHILD(n, 1), OP_ASSIGN);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002470 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002471 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002472 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002473 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2474 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002475 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002476 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002477 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002478 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002479 if (NCH(n) > 8)
2480 com_node(c, CHILD(n, 8));
2481 com_backpatch(c, break_anchor);
2482}
2483
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002484/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002485
2486 SETUP_FINALLY L
2487 <code for S>
2488 POP_BLOCK
2489 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002490 L: <code for Sf>
2491 END_FINALLY
2492
2493 The special instructions use the block stack. Each block
2494 stack entry contains the instruction that created it (here
2495 SETUP_FINALLY), the level of the value stack at the time the
2496 block stack entry was created, and a label (here L).
2497
2498 SETUP_FINALLY:
2499 Pushes the current value stack level and the label
2500 onto the block stack.
2501 POP_BLOCK:
2502 Pops en entry from the block stack, and pops the value
2503 stack until its level is the same as indicated on the
2504 block stack. (The label is ignored.)
2505 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002506 Pops a variable number of entries from the *value* stack
2507 and re-raises the exception they specify. The number of
2508 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002509
2510 The block stack is unwound when an exception is raised:
2511 when a SETUP_FINALLY entry is found, the exception is pushed
2512 onto the value stack (and the exception condition is cleared),
2513 and the interpreter jumps to the label gotten from the block
2514 stack.
2515
2516 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002517 (The contents of the value stack is shown in [], with the top
2518 at the right; 'tb' is trace-back info, 'val' the exception's
2519 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002520
2521 Value stack Label Instruction Argument
2522 [] SETUP_EXCEPT L1
2523 [] <code for S>
2524 [] POP_BLOCK
2525 [] JUMP_FORWARD L0
2526
Guido van Rossum3f5da241990-12-20 15:06:42 +00002527 [tb, val, exc] L1: DUP )
2528 [tb, val, exc, exc] <evaluate E1> )
2529 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2530 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2531 [tb, val, exc, 1] POP )
2532 [tb, val, exc] POP
2533 [tb, val] <assign to V1> (or POP if no V1)
2534 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002535 [] <code for S1>
2536 JUMP_FORWARD L0
2537
Guido van Rossum3f5da241990-12-20 15:06:42 +00002538 [tb, val, exc, 0] L2: POP
2539 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002540 .............................etc.......................
2541
Guido van Rossum3f5da241990-12-20 15:06:42 +00002542 [tb, val, exc, 0] Ln+1: POP
2543 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002544
2545 [] L0: <next statement>
2546
2547 Of course, parts are not generated if Vi or Ei is not present.
2548*/
2549
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002550static void
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002551com_try_except(c, n)
2552 struct compiling *c;
2553 node *n;
2554{
2555 int except_anchor = 0;
2556 int end_anchor = 0;
2557 int else_anchor = 0;
2558 int i;
2559 node *ch;
2560
2561 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2562 block_push(c, SETUP_EXCEPT);
2563 com_node(c, CHILD(n, 2));
2564 com_addbyte(c, POP_BLOCK);
2565 block_pop(c, SETUP_EXCEPT);
2566 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2567 com_backpatch(c, except_anchor);
2568 for (i = 3;
2569 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2570 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002571 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002572 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002573 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002574 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002575 break;
2576 }
2577 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002578 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002579 com_addoparg(c, SET_LINENO, ch->n_lineno);
2580 if (NCH(ch) > 1) {
2581 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002582 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002583 com_node(c, CHILD(ch, 1));
2584 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002585 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002586 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2587 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002588 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002589 }
2590 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002591 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002592 if (NCH(ch) > 3)
Guido van Rossum8861b741996-07-30 16:49:37 +00002593 com_assign(c, CHILD(ch, 3), OP_ASSIGN);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002594 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002595 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002596 com_pop(c, 1);
2597 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002598 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002599 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002600 com_node(c, CHILD(n, i+2));
2601 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2602 if (except_anchor) {
2603 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002604 /* We come in with [tb, val, exc, 0] on the
2605 stack; one pop and it's the same as
2606 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002607 com_addbyte(c, POP_TOP);
2608 }
2609 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002610 /* We actually come in here with [tb, val, exc] but the
2611 END_FINALLY will zap those and jump around.
2612 The c_stacklevel does not reflect them so we need not pop
2613 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002614 com_addbyte(c, END_FINALLY);
2615 com_backpatch(c, else_anchor);
2616 if (i < NCH(n))
2617 com_node(c, CHILD(n, i+2));
2618 com_backpatch(c, end_anchor);
2619}
2620
2621static void
2622com_try_finally(c, n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002623 struct compiling *c;
2624 node *n;
2625{
2626 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002627 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002628
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002629 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2630 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002631 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002632 com_addbyte(c, POP_BLOCK);
2633 block_pop(c, SETUP_FINALLY);
2634 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002635 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002636 /* While the generated code pushes only one item,
2637 the try-finally handling can enter here with
2638 up to three items. OK, here are the details:
2639 3 for an exception, 2 for RETURN, 1 for BREAK. */
2640 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002641 com_backpatch(c, finally_anchor);
2642 ch = CHILD(n, NCH(n)-1);
2643 com_addoparg(c, SET_LINENO, ch->n_lineno);
2644 com_node(c, ch);
2645 com_addbyte(c, END_FINALLY);
2646 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002647 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002648}
2649
2650static void
2651com_try_stmt(c, n)
2652 struct compiling *c;
2653 node *n;
2654{
2655 REQ(n, try_stmt);
2656 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2657 | 'try' ':' suite 'finally' ':' suite */
2658 if (TYPE(CHILD(n, 3)) != except_clause)
2659 com_try_finally(c, n);
2660 else
2661 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002662}
2663
Guido van Rossum8b993a91997-01-17 21:04:03 +00002664static node *
2665get_rawdocstring(n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002666 node *n;
2667{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002668 int i;
2669
Guido van Rossum8b993a91997-01-17 21:04:03 +00002670 /* Label to avoid tail recursion */
2671 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002672 switch (TYPE(n)) {
2673
2674 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002675 if (NCH(n) == 1) {
2676 n = CHILD(n, 0);
2677 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002678 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002679 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002680 case file_input:
2681 for (i = 0; i < NCH(n); i++) {
2682 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002683 if (TYPE(ch) == stmt) {
2684 n = ch;
2685 goto next;
2686 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002687 }
2688 break;
2689
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002690 case stmt:
2691 case simple_stmt:
2692 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002693 n = CHILD(n, 0);
2694 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002695
2696 case expr_stmt:
2697 case testlist:
2698 case test:
2699 case and_test:
2700 case not_test:
2701 case comparison:
2702 case expr:
2703 case xor_expr:
2704 case and_expr:
2705 case shift_expr:
2706 case arith_expr:
2707 case term:
2708 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002709 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002710 if (NCH(n) == 1) {
2711 n = CHILD(n, 0);
2712 goto next;
2713 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002714 break;
2715
2716 case atom:
2717 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002718 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002719 break;
2720
2721 }
2722 return NULL;
2723}
2724
Guido van Rossum79f25d91997-04-29 20:08:16 +00002725static PyObject *
Guido van Rossum8b993a91997-01-17 21:04:03 +00002726get_docstring(n)
2727 node *n;
2728{
Guido van Rossum541563e1999-01-28 15:08:09 +00002729 /* Don't generate doc-strings if run with -OO */
2730 if (Py_OptimizeFlag > 1)
2731 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002732 n = get_rawdocstring(n);
2733 if (n == NULL)
2734 return NULL;
2735 return parsestrplus(n);
2736}
2737
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002738static void
2739com_suite(c, n)
2740 struct compiling *c;
2741 node *n;
2742{
2743 REQ(n, suite);
2744 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2745 if (NCH(n) == 1) {
2746 com_node(c, CHILD(n, 0));
2747 }
2748 else {
2749 int i;
2750 for (i = 0; i < NCH(n); i++) {
2751 node *ch = CHILD(n, i);
2752 if (TYPE(ch) == stmt)
2753 com_node(c, ch);
2754 }
2755 }
2756}
2757
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002758/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002759static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002760com_continue_stmt(c, n)
2761 struct compiling *c;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002762 node *n; /* Not used, but passed for consistency */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002763{
2764 int i = c->c_nblocks;
2765 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2766 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2767 }
2768 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002769 com_error(c, PyExc_SyntaxError,
2770 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002771 }
2772 /* XXX Could allow it inside a 'finally' clause
2773 XXX if we could pop the exception still on the stack */
2774}
2775
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002776static int
Guido van Rossum681d79a1995-07-18 14:51:37 +00002777com_argdefs(c, n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002778 struct compiling *c;
2779 node *n;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002780{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002781 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002782 if (TYPE(n) == lambdef) {
2783 /* lambdef: 'lambda' [varargslist] ':' test */
2784 n = CHILD(n, 1);
2785 }
2786 else {
2787 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2788 n = CHILD(n, 2);
2789 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2790 n = CHILD(n, 1);
2791 }
2792 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002793 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002794 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002795 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002796 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2797 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002798 nargs = 0;
2799 ndefs = 0;
2800 for (i = 0; i < nch; i++) {
2801 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002802 if (TYPE(CHILD(n, i)) == STAR ||
2803 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002804 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002805 nargs++;
2806 i++;
2807 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002808 t = RPAR; /* Anything except EQUAL or COMMA */
2809 else
2810 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002811 if (t == EQUAL) {
2812 i++;
2813 ndefs++;
2814 com_node(c, CHILD(n, i));
2815 i++;
2816 if (i >= nch)
2817 break;
2818 t = TYPE(CHILD(n, i));
2819 }
2820 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00002821 /* Treat "(a=1, b)" as an error */
2822 if (ndefs)
2823 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00002824 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002825 }
2826 if (t != COMMA)
2827 break;
2828 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002829 return ndefs;
2830}
2831
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002832static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002833com_funcdef(c, n)
2834 struct compiling *c;
2835 node *n;
2836{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002837 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002838 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002839 v = (PyObject *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002840 if (v == NULL)
2841 c->c_errors++;
2842 else {
2843 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002844 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002845 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002846 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002847 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002848 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002849 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002850 com_pop(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002851 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002852 }
2853}
2854
2855static void
Guido van Rossum25831651993-05-19 14:50:45 +00002856com_bases(c, n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002857 struct compiling *c;
2858 node *n;
2859{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002860 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002861 REQ(n, testlist);
2862 /* testlist: test (',' test)* [','] */
2863 for (i = 0; i < NCH(n); i += 2)
2864 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002865 i = (NCH(n)+1) / 2;
2866 com_addoparg(c, BUILD_TUPLE, i);
2867 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00002868}
2869
2870static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002871com_classdef(c, n)
2872 struct compiling *c;
2873 node *n;
2874{
Guido van Rossum25831651993-05-19 14:50:45 +00002875 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002876 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002877 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002878 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00002879 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00002880 c->c_errors++;
2881 return;
2882 }
2883 /* Push the class name on the stack */
2884 i = com_addconst(c, v);
2885 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002886 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002887 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00002888 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002889 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00002890 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002891 com_push(c, 1);
2892 }
Guido van Rossum25831651993-05-19 14:50:45 +00002893 else
2894 com_bases(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002895 v = (PyObject *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002896 if (v == NULL)
2897 c->c_errors++;
2898 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002899 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002900 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002901 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002902 com_addoparg(c, MAKE_FUNCTION, 0);
2903 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002904 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002905 com_pop(c, 2);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002906 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002907 Py_DECREF(v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002908 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002909}
2910
2911static void
2912com_node(c, n)
2913 struct compiling *c;
2914 node *n;
2915{
2916 switch (TYPE(n)) {
2917
2918 /* Definition nodes */
2919
2920 case funcdef:
2921 com_funcdef(c, n);
2922 break;
2923 case classdef:
2924 com_classdef(c, n);
2925 break;
2926
2927 /* Trivial parse tree nodes */
2928
2929 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002930 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002931 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002932 com_node(c, CHILD(n, 0));
2933 break;
2934
2935 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002936 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2937 com_addoparg(c, SET_LINENO, n->n_lineno);
2938 {
2939 int i;
2940 for (i = 0; i < NCH(n)-1; i += 2)
2941 com_node(c, CHILD(n, i));
2942 }
2943 break;
2944
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002945 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002946 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002947 com_node(c, CHILD(n, 0));
2948 break;
2949
2950 /* Statement nodes */
2951
2952 case expr_stmt:
2953 com_expr_stmt(c, n);
2954 break;
2955 case print_stmt:
2956 com_print_stmt(c, n);
2957 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002958 case del_stmt: /* 'del' exprlist */
Guido van Rossum8861b741996-07-30 16:49:37 +00002959 com_assign(c, CHILD(n, 1), OP_DELETE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002960 break;
2961 case pass_stmt:
2962 break;
2963 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002964 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002965 com_error(c, PyExc_SyntaxError,
2966 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002967 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002968 com_addbyte(c, BREAK_LOOP);
2969 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002970 case continue_stmt:
2971 com_continue_stmt(c, n);
2972 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002973 case return_stmt:
2974 com_return_stmt(c, n);
2975 break;
2976 case raise_stmt:
2977 com_raise_stmt(c, n);
2978 break;
2979 case import_stmt:
2980 com_import_stmt(c, n);
2981 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002982 case global_stmt:
2983 com_global_stmt(c, n);
2984 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002985 case exec_stmt:
2986 com_exec_stmt(c, n);
2987 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002988 case assert_stmt:
2989 com_assert_stmt(c, n);
2990 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002991 case if_stmt:
2992 com_if_stmt(c, n);
2993 break;
2994 case while_stmt:
2995 com_while_stmt(c, n);
2996 break;
2997 case for_stmt:
2998 com_for_stmt(c, n);
2999 break;
3000 case try_stmt:
3001 com_try_stmt(c, n);
3002 break;
3003 case suite:
3004 com_suite(c, n);
3005 break;
3006
3007 /* Expression nodes */
3008
3009 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003010 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003011 break;
3012 case test:
3013 com_test(c, n);
3014 break;
3015 case and_test:
3016 com_and_test(c, n);
3017 break;
3018 case not_test:
3019 com_not_test(c, n);
3020 break;
3021 case comparison:
3022 com_comparison(c, n);
3023 break;
3024 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003025 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003026 break;
3027 case expr:
3028 com_expr(c, n);
3029 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003030 case xor_expr:
3031 com_xor_expr(c, n);
3032 break;
3033 case and_expr:
3034 com_and_expr(c, n);
3035 break;
3036 case shift_expr:
3037 com_shift_expr(c, n);
3038 break;
3039 case arith_expr:
3040 com_arith_expr(c, n);
3041 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003042 case term:
3043 com_term(c, n);
3044 break;
3045 case factor:
3046 com_factor(c, n);
3047 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003048 case power:
3049 com_power(c, n);
3050 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003051 case atom:
3052 com_atom(c, n);
3053 break;
3054
3055 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003056 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003057 com_error(c, PyExc_SystemError,
3058 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003059 }
3060}
3061
Guido van Rossum79f25d91997-04-29 20:08:16 +00003062static void com_fplist Py_PROTO((struct compiling *, node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003063
3064static void
3065com_fpdef(c, n)
3066 struct compiling *c;
3067 node *n;
3068{
3069 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3070 if (TYPE(CHILD(n, 0)) == LPAR)
3071 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003072 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003073 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003074 com_pop(c, 1);
3075 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003076}
3077
3078static void
3079com_fplist(c, n)
3080 struct compiling *c;
3081 node *n;
3082{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003083 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003084 if (NCH(n) == 1) {
3085 com_fpdef(c, CHILD(n, 0));
3086 }
3087 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003088 int i = (NCH(n)+1)/2;
3089 com_addoparg(c, UNPACK_TUPLE, i);
3090 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003091 for (i = 0; i < NCH(n); i += 2)
3092 com_fpdef(c, CHILD(n, i));
3093 }
3094}
3095
3096static void
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003097com_arglist(c, n)
3098 struct compiling *c;
3099 node *n;
3100{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003101 int nch, i;
3102 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003103 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003104 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003105 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003106 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003107 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003108 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003109 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003110 node *ch = CHILD(n, i);
3111 node *fp;
3112 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00003113 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003114 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003115 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3116 fp = CHILD(ch, 0);
3117 if (TYPE(fp) == NAME)
3118 name = STR(fp);
3119 else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003120 name = nbuf;
3121 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003122 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003123 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003124 com_newlocal(c, name);
3125 c->c_argcount++;
3126 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003127 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003128 ch = CHILD(n, i);
3129 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003130 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003131 else
3132 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003133 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003134 /* Handle *arguments */
3135 if (i < nch) {
3136 node *ch;
3137 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003138 if (TYPE(ch) != DOUBLESTAR) {
3139 REQ(ch, STAR);
3140 ch = CHILD(n, i+1);
3141 if (TYPE(ch) == NAME) {
3142 c->c_flags |= CO_VARARGS;
3143 i += 3;
3144 com_newlocal(c, STR(ch));
3145 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003146 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003147 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003148 /* Handle **keywords */
3149 if (i < nch) {
3150 node *ch;
3151 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003152 if (TYPE(ch) != DOUBLESTAR) {
3153 REQ(ch, STAR);
3154 ch = CHILD(n, i+1);
3155 REQ(ch, STAR);
3156 ch = CHILD(n, i+2);
3157 }
3158 else
3159 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003160 REQ(ch, NAME);
3161 c->c_flags |= CO_VARKEYWORDS;
3162 com_newlocal(c, STR(ch));
3163 }
3164 if (complex) {
3165 /* Generate code for complex arguments only after
3166 having counted the simple arguments */
3167 int ilocal = 0;
3168 for (i = 0; i < nch; i++) {
3169 node *ch = CHILD(n, i);
3170 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003171 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003172 break;
3173 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3174 fp = CHILD(ch, 0);
3175 if (TYPE(fp) != NAME) {
3176 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003177 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003178 com_fpdef(c, ch);
3179 }
3180 ilocal++;
3181 if (++i >= nch)
3182 break;
3183 ch = CHILD(n, i);
3184 if (TYPE(ch) == EQUAL)
3185 i += 2;
3186 else
3187 REQ(ch, COMMA);
3188 }
3189 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003190}
3191
3192static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003193com_file_input(c, n)
3194 struct compiling *c;
3195 node *n;
3196{
3197 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003198 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003199 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003200 doc = get_docstring(n);
3201 if (doc != NULL) {
3202 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003203 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003204 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003205 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003206 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003207 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003208 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003209 for (i = 0; i < NCH(n); i++) {
3210 node *ch = CHILD(n, i);
3211 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3212 com_node(c, ch);
3213 }
3214}
3215
3216/* Top-level compile-node interface */
3217
3218static void
3219compile_funcdef(c, n)
3220 struct compiling *c;
3221 node *n;
3222{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003223 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003224 node *ch;
3225 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003226 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003227 doc = get_docstring(CHILD(n, 4));
3228 if (doc != NULL) {
3229 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003230 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003231 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003232 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003233 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003234 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3235 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003236 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003237 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003238 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003239 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003240 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003241 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003242 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003243 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003244 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003245}
3246
3247static void
Guido van Rossum590baa41993-11-30 13:40:46 +00003248compile_lambdef(c, n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003249 struct compiling *c;
3250 node *n;
3251{
Guido van Rossum590baa41993-11-30 13:40:46 +00003252 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003253 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003254 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003255
3256 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003257 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003258 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003259 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003260 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003261 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003262 else
3263 ch = CHILD(n, 2);
3264 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003265 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003266 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003267}
3268
3269static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003270compile_classdef(c, n)
3271 struct compiling *c;
3272 node *n;
3273{
3274 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003275 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003276 REQ(n, classdef);
3277 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3278 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003279#ifdef PRIVATE_NAME_MANGLING
3280 c->c_private = c->c_name;
3281#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003282 ch = CHILD(n, NCH(n)-1); /* The suite */
3283 doc = get_docstring(ch);
3284 if (doc != NULL) {
3285 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003286 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003287 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003288 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003289 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003290 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003291 }
3292 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003293 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003294 com_node(c, ch);
3295 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003296 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003297 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003298 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003299}
3300
3301static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003302compile_node(c, n)
3303 struct compiling *c;
3304 node *n;
3305{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003306 com_addoparg(c, SET_LINENO, n->n_lineno);
3307
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003308 switch (TYPE(n)) {
3309
Guido van Rossum4c417781991-01-21 16:09:22 +00003310 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003311 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003312 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003313 n = CHILD(n, 0);
3314 if (TYPE(n) != NEWLINE)
3315 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003316 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003317 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003318 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003319 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003320 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003321 break;
3322
Guido van Rossum4c417781991-01-21 16:09:22 +00003323 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003324 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003325 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003326 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003327 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003328 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003329 break;
3330
Guido van Rossum590baa41993-11-30 13:40:46 +00003331 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003332 com_node(c, CHILD(n, 0));
3333 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003334 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003335 break;
3336
Guido van Rossum590baa41993-11-30 13:40:46 +00003337 case lambdef: /* anonymous function definition */
3338 compile_lambdef(c, n);
3339 break;
3340
Guido van Rossum4c417781991-01-21 16:09:22 +00003341 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003342 compile_funcdef(c, n);
3343 break;
3344
Guido van Rossum4c417781991-01-21 16:09:22 +00003345 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003346 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003347 break;
3348
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003349 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003350 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003351 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003352 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003353 }
3354}
3355
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003356/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00003357
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003358 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
3359 instructions that refer to local variables with LOAD_FAST etc.
3360 The latter instructions are much faster because they don't need to
3361 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003362
Guido van Rossum681d79a1995-07-18 14:51:37 +00003363 To find all local variables, we check all STORE_NAME, IMPORT_FROM
3364 and DELETE_NAME instructions. This yields all local variables,
3365 function definitions, class definitions and import statements.
3366 Argument names have already been entered into the list by the
3367 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003368
3369 All remaining LOAD_NAME instructions must refer to non-local (global
3370 or builtin) variables, so are replaced by LOAD_GLOBAL.
3371
3372 There are two problems: 'from foo import *' and 'exec' may introduce
3373 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00003374 case, we can still optimize bona fide locals (since those
3375 statements will be surrounded by fast_2_locals() and
3376 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003377
Guido van Rossum681d79a1995-07-18 14:51:37 +00003378 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00003379
3380static void
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003381optimize(c)
3382 struct compiling *c;
Guido van Rossum282914b1991-04-04 10:42:56 +00003383{
Guido van Rossum0a697f61991-04-16 08:39:12 +00003384 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00003385 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00003386 int oparg = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003387 PyObject *name;
3388 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003389
Guido van Rossum282914b1991-04-04 10:42:56 +00003390#define NEXTOP() (*next_instr++)
3391#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossum79f25d91997-04-29 20:08:16 +00003392#define GETITEM(v, i) (PyList_GetItem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003393#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
3394
Guido van Rossum79f25d91997-04-29 20:08:16 +00003395 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003396
3397 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00003398
Guido van Rossum79f25d91997-04-29 20:08:16 +00003399 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003400 for (;;) {
3401 opcode = NEXTOP();
3402 if (opcode == STOP_CODE)
3403 break;
3404 if (HAS_ARG(opcode))
3405 oparg = NEXTARG();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003406 switch (opcode) {
3407 case STORE_NAME:
3408 case DELETE_NAME:
3409 case IMPORT_FROM:
3410 com_addlocal_o(c, GETNAMEOBJ(oparg));
3411 break;
3412 case EXEC_STMT:
3413 c->c_flags &= ~CO_OPTIMIZED;
3414 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00003415 }
3416 }
3417
Guido van Rossum79f25d91997-04-29 20:08:16 +00003418 if (PyDict_GetItemString(c->c_locals, "*") != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003419 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003420
Guido van Rossum79f25d91997-04-29 20:08:16 +00003421 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003422 for (;;) {
3423 cur_instr = next_instr;
3424 opcode = NEXTOP();
3425 if (opcode == STOP_CODE)
3426 break;
3427 if (HAS_ARG(opcode))
3428 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003429 if (opcode == LOAD_NAME ||
3430 opcode == STORE_NAME ||
3431 opcode == DELETE_NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003432 PyObject *v;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003433 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00003434 name = GETNAMEOBJ(oparg);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003435 v = PyDict_GetItem(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003436 if (v == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003437 if (opcode == LOAD_NAME &&
3438 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003439 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003440 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00003441 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003442 i = PyInt_AsLong(v);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003443 switch (opcode) {
3444 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
3445 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
3446 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
3447 }
3448 cur_instr[1] = i & 0xff;
3449 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00003450 }
3451 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003452
Guido van Rossum681d79a1995-07-18 14:51:37 +00003453 if (c->c_errors == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00003454 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00003455}
3456
Guido van Rossum79f25d91997-04-29 20:08:16 +00003457PyCodeObject *
3458PyNode_Compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003459 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003460 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003461{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003462 return jcompile(n, filename, NULL);
3463}
3464
Guido van Rossum79f25d91997-04-29 20:08:16 +00003465static PyCodeObject *
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003466icompile(n, base)
3467 node *n;
3468 struct compiling *base;
3469{
3470 return jcompile(n, base->c_filename, base);
3471}
3472
Guido van Rossum79f25d91997-04-29 20:08:16 +00003473static PyCodeObject *
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003474jcompile(n, filename, base)
3475 node *n;
3476 char *filename;
3477 struct compiling *base;
3478{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003479 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003480 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003481 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003482 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003483#ifdef PRIVATE_NAME_MANGLING
3484 if (base)
3485 sc.c_private = base->c_private;
3486 else
3487 sc.c_private = NULL;
3488#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003489 compile_node(&sc, n);
3490 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003491 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003492 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003493 sc.c_flags |= CO_NEWLOCALS;
3494 }
3495 else if (TYPE(n) == classdef)
3496 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00003497 co = NULL;
3498 if (sc.c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003499 PyObject *consts, *names, *varnames, *filename, *name;
3500 consts = PyList_AsTuple(sc.c_consts);
3501 names = PyList_AsTuple(sc.c_names);
3502 varnames = PyList_AsTuple(sc.c_varnames);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003503 filename = PyString_InternFromString(sc.c_filename);
3504 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003505 if (!PyErr_Occurred())
3506 co = PyCode_New(sc.c_argcount,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003507 sc.c_nlocals,
Guido van Rossum8b993a91997-01-17 21:04:03 +00003508 sc.c_maxstacklevel,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003509 sc.c_flags,
3510 sc.c_code,
3511 consts,
3512 names,
3513 varnames,
3514 filename,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003515 name,
3516 sc.c_firstlineno,
3517 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003518 Py_XDECREF(consts);
3519 Py_XDECREF(names);
3520 Py_XDECREF(varnames);
3521 Py_XDECREF(filename);
3522 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003523 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003524 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003525 return co;
3526}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003527
3528int
3529PyCode_Addr2Line(co, addrq)
3530 PyCodeObject *co;
3531 int addrq;
3532{
3533 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003534 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003535 int line = co->co_firstlineno;
3536 int addr = 0;
3537 while (--size >= 0) {
3538 addr += *p++;
3539 if (addr > addrq)
3540 break;
3541 line += *p++;
3542 }
3543 return line;
3544}