blob: 5eb52d5f814725269269d3da1b876c30e3a6bba3 [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 Rossum681d79a1995-07-18 14:51:37 +000039 XXX get rid of SET_LINENO instructions, use JAR's table trick
40 XXX (need an option to put them back in, for debugger!)
Guido van Rossum8b993a91997-01-17 21:04:03 +000041 XXX New 1-byte opcode for loading None
42 XXX New opcode for loading the initial index for a for loop
Guido van Rossum681d79a1995-07-18 14:51:37 +000043 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000044*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000045
Guido van Rossum8ff077b1996-08-24 06:21:31 +000046#ifndef NO_PRIVATE_NAME_MANGLING
47#define PRIVATE_NAME_MANGLING
48#endif
49
Guido van Rossum79f25d91997-04-29 20:08:16 +000050#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000051
Guido van Rossum10dc2e81990-11-18 17:27:39 +000052#include "node.h"
53#include "token.h"
54#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000055#include "compile.h"
56#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000057#include "structmember.h"
58
59#include <ctype.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000060
Guido van Rossumb05a5c71997-05-07 17:46:13 +000061/* Three symbols from graminit.h are also defined in Python.h, with
62 Py_ prefixes to their names. Python.h can't include graminit.h
63 (which defines too many confusing symbols), but we can check here
64 that they haven't changed (which is very unlikely, but possible). */
65#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000066 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000067#endif
68#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000069 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000070#endif
71#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000072 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000073#endif
74
Guido van Rossum8e793d91997-03-03 19:13:14 +000075int Py_OptimizeFlag = 0;
76
Guido van Rossum8861b741996-07-30 16:49:37 +000077#define OP_DELETE 0
78#define OP_ASSIGN 1
79#define OP_APPLY 2
80
Guido van Rossum79f25d91997-04-29 20:08:16 +000081#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000082
83static struct memberlist code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000084 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
85 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000086 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000087 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000088 {"co_code", T_OBJECT, OFF(co_code), READONLY},
89 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
90 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000091 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000092 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000093 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000094 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
95 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000096 {NULL} /* Sentinel */
97};
98
Guido van Rossum79f25d91997-04-29 20:08:16 +000099static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000100code_getattr(co, name)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000101 PyCodeObject *co;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000102 char *name;
103{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000104 return PyMember_Get((char *)co, code_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000105}
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000106
107static void
Guido van Rossum3f5da241990-12-20 15:06:42 +0000108code_dealloc(co)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000109 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000110{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000111 Py_XDECREF(co->co_code);
112 Py_XDECREF(co->co_consts);
113 Py_XDECREF(co->co_names);
114 Py_XDECREF(co->co_filename);
115 Py_XDECREF(co->co_name);
116 Py_XDECREF(co->co_varnames);
117 PyMem_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000118}
119
Guido van Rossum79f25d91997-04-29 20:08:16 +0000120static PyObject *
Guido van Rossum2dff9911992-09-03 20:50:59 +0000121code_repr(co)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000122 PyCodeObject *co;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000123{
124 char buf[500];
125 int lineno = -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000126 char *p = PyString_AS_STRING(co->co_code);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000127 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000128 char *name = "???";
Guido van Rossum2dff9911992-09-03 20:50:59 +0000129 if (*p == SET_LINENO)
130 lineno = (p[1] & 0xff) | ((p[2] & 0xff) << 8);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000131 if (co->co_filename && PyString_Check(co->co_filename))
132 filename = PyString_AsString(co->co_filename);
133 if (co->co_name && PyString_Check(co->co_name))
134 name = PyString_AsString(co->co_name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000135 sprintf(buf, "<code object %.100s at %lx, file \"%.300s\", line %d>",
136 name, (long)co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000137 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000138}
139
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000140static int
141code_compare(co, cp)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000142 PyCodeObject *co, *cp;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000143{
144 int cmp;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000145 cmp = cp->co_argcount - cp->co_argcount;
146 if (cmp) return cmp;
147 cmp = cp->co_nlocals - cp->co_nlocals;
148 if (cmp) return cmp;
149 cmp = cp->co_flags - cp->co_flags;
150 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000151 cmp = PyObject_Compare((PyObject *)co->co_code,
152 (PyObject *)cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000153 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000154 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000155 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000156 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000157 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000158 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000159 return cmp;
160}
161
162static long
163code_hash(co)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000164 PyCodeObject *co;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000165{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000166 long h, h1, h2, h3, h4;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000167 h1 = PyObject_Hash((PyObject *)co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000168 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000169 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000170 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000171 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000172 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000173 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000174 if (h4 == -1) return -1;
175 h = h1 ^ h2 ^ h3 ^ h4 ^
176 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000177 if (h == -1) h = -2;
178 return h;
179}
180
Guido van Rossum79f25d91997-04-29 20:08:16 +0000181PyTypeObject PyCode_Type = {
182 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000183 0,
184 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000185 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000186 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000187 (destructor)code_dealloc, /*tp_dealloc*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000188 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000189 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000190 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000191 (cmpfunc)code_compare, /*tp_compare*/
192 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000193 0, /*tp_as_number*/
194 0, /*tp_as_sequence*/
195 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000196 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000197};
198
Guido van Rossum644a12b1997-04-09 19:24:53 +0000199#define NAME_CHARS \
200 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
201
Guido van Rossum79f25d91997-04-29 20:08:16 +0000202PyCodeObject *
203PyCode_New(argcount, nlocals, stacksize, flags,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000204 code, consts, names, varnames, filename, name,
205 firstlineno, lnotab)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000206 int argcount;
207 int nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000208 int stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000209 int flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000210 PyObject *code;
211 PyObject *consts;
212 PyObject *names;
213 PyObject *varnames;
214 PyObject *filename;
215 PyObject *name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000216 int firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000217 PyObject *lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000218{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000219 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000220 int i;
221 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000222 if (argcount < 0 || nlocals < 0 ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000223 code == NULL || !PyString_Check(code) ||
224 consts == NULL || !PyTuple_Check(consts) ||
225 names == NULL || !PyTuple_Check(names) ||
226 varnames == NULL || !PyTuple_Check(varnames) ||
227 name == NULL || !PyString_Check(name) ||
228 filename == NULL || !PyString_Check(filename) ||
229 lnotab == NULL || !PyString_Check(lnotab)) {
230 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000231 return NULL;
232 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000233 /* Make sure names and varnames are all strings, & intern them */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000234 for (i = PyTuple_Size(names); --i >= 0; ) {
235 PyObject *v = PyTuple_GetItem(names, i);
236 if (v == NULL || !PyString_Check(v)) {
237 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000238 return NULL;
239 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000240 PyString_InternInPlace(&PyTuple_GET_ITEM(names, i));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000241 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000242 for (i = PyTuple_Size(varnames); --i >= 0; ) {
243 PyObject *v = PyTuple_GetItem(varnames, i);
244 if (v == NULL || !PyString_Check(v)) {
245 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000246 return NULL;
247 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000248 PyString_InternInPlace(&PyTuple_GET_ITEM(varnames, i));
249 }
250 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000251 for (i = PyTuple_Size(consts); --i >= 0; ) {
252 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000253 char *p;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000254 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000255 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000256 p = PyString_AsString(v);
Guido van Rossum644a12b1997-04-09 19:24:53 +0000257 if ((int)strspn(p, NAME_CHARS)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000258 != PyString_Size(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000259 continue;
260 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000261 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000262 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000263 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000264 co->co_argcount = argcount;
265 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000266 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000267 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000268 Py_INCREF(code);
269 co->co_code = (PyStringObject *)code;
270 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000271 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000272 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000273 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000274 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000275 co->co_varnames = varnames;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000276 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000277 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000278 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000279 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000280 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000281 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000282 co->co_lnotab = lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000283 }
284 return co;
285}
286
287
288/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000289
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000290struct compiling {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000291 PyObject *c_code; /* string */
292 PyObject *c_consts; /* list of objects */
293 PyObject *c_names; /* list of strings (names) */
294 PyObject *c_globals; /* dictionary (value=None) */
295 PyObject *c_locals; /* dictionary (value=localID) */
296 PyObject *c_varnames; /* list (inverse of c_locals) */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000297 int c_nlocals; /* index of next local */
298 int c_argcount; /* number of top-level arguments */
299 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000300 int c_nexti; /* index into c_code */
301 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000302 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000303 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000304 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000305 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000306 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000307 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000308 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000309 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000310 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000311 int c_stacklevel; /* Current stack level */
312 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000313 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000314 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000315 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000316#ifdef PRIVATE_NAME_MANGLING
317 char *c_private; /* for private name mangling */
318#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000319};
320
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000321
Guido van Rossum452a9831996-09-17 14:32:04 +0000322/* Error message including line number */
323
324static void
325com_error(c, exc, msg)
326 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000327 PyObject *exc;
Guido van Rossum452a9831996-09-17 14:32:04 +0000328 char *msg;
329{
330 int n = strlen(msg);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000331 PyObject *v;
Guido van Rossum452a9831996-09-17 14:32:04 +0000332 char buffer[30];
333 char *s;
Guido van Rossum635abd21997-01-06 22:56:52 +0000334 c->c_errors++;
Guido van Rossum452a9831996-09-17 14:32:04 +0000335 if (c->c_lineno <= 1) {
336 /* Unknown line number or single interactive command */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000337 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000338 return;
339 }
340 sprintf(buffer, " (line %d)", c->c_lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000341 v = PyString_FromStringAndSize((char *)NULL, n + strlen(buffer));
Guido van Rossum452a9831996-09-17 14:32:04 +0000342 if (v == NULL)
343 return; /* MemoryError, too bad */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000344 s = PyString_AS_STRING((PyStringObject *)v);
Guido van Rossum452a9831996-09-17 14:32:04 +0000345 strcpy(s, msg);
346 strcat(s, buffer);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000347 PyErr_SetObject(exc, v);
348 Py_DECREF(v);
Guido van Rossum452a9831996-09-17 14:32:04 +0000349}
350
351
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000352/* Interface to the block stack */
353
354static void
355block_push(c, type)
356 struct compiling *c;
357 int type;
358{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000359 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000360 com_error(c, PyExc_SystemError,
361 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000362 }
363 else {
364 c->c_block[c->c_nblocks++] = type;
365 }
366}
367
368static void
369block_pop(c, type)
370 struct compiling *c;
371 int type;
372{
373 if (c->c_nblocks > 0)
374 c->c_nblocks--;
375 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000376 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000377 }
378}
379
380
Guido van Rossum681d79a1995-07-18 14:51:37 +0000381/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000382
Guido van Rossum79f25d91997-04-29 20:08:16 +0000383static int com_init Py_PROTO((struct compiling *, char *));
384static void com_free Py_PROTO((struct compiling *));
385static void com_push Py_PROTO((struct compiling *, int));
386static void com_pop Py_PROTO((struct compiling *, int));
387static void com_done Py_PROTO((struct compiling *));
388static void com_node Py_PROTO((struct compiling *, struct _node *));
389static void com_factor Py_PROTO((struct compiling *, struct _node *));
390static void com_addbyte Py_PROTO((struct compiling *, int));
391static void com_addint Py_PROTO((struct compiling *, int));
392static void com_addoparg Py_PROTO((struct compiling *, int, int));
393static void com_addfwref Py_PROTO((struct compiling *, int, int *));
394static void com_backpatch Py_PROTO((struct compiling *, int));
395static int com_add Py_PROTO((struct compiling *, PyObject *, PyObject *));
396static int com_addconst Py_PROTO((struct compiling *, PyObject *));
397static int com_addname Py_PROTO((struct compiling *, PyObject *));
398static void com_addopname Py_PROTO((struct compiling *, int, node *));
399static void com_list Py_PROTO((struct compiling *, node *, int));
400static int com_argdefs Py_PROTO((struct compiling *, node *));
401static int com_newlocal Py_PROTO((struct compiling *, char *));
402static PyCodeObject *icompile Py_PROTO((struct _node *, struct compiling *));
403static PyCodeObject *jcompile Py_PROTO((struct _node *, char *,
404 struct compiling *));
405static PyObject *parsestrplus Py_PROTO((node *));
406static PyObject *parsestr Py_PROTO((char *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000407
408static int
Guido van Rossum590baa41993-11-30 13:40:46 +0000409com_init(c, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000410 struct compiling *c;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000411 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000412{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000413 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
414 1000)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000415 goto fail_3;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000416 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000417 goto fail_2;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000418 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000419 goto fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000420 if ((c->c_globals = PyDict_New()) == NULL)
Guido van Rossumc5e96291991-12-10 13:53:51 +0000421 goto fail_0;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000422 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000423 goto fail_00;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000424 if ((c->c_varnames = PyList_New(0)) == NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000425 goto fail_000;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000426 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
427 1000)) == NULL)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000428 goto fail_0000;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000429 c->c_nlocals = 0;
430 c->c_argcount = 0;
431 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000432 c->c_nexti = 0;
433 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000434 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000435 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000436 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000437 c->c_begin = 0;
438 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000439 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000440 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000441 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000442 c->c_stacklevel = 0;
443 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000444 c->c_firstlineno = 0;
445 c->c_last_addr = 0;
446 c->c_last_line = 0;
447 c-> c_lnotab_next = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000448 return 1;
449
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000450 fail_0000:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000451 Py_DECREF(c->c_lnotab);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000452 fail_000:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000453 Py_DECREF(c->c_locals);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000454 fail_00:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000455 Py_DECREF(c->c_globals);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000456 fail_0:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000457 Py_DECREF(c->c_names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000458 fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000459 Py_DECREF(c->c_consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000460 fail_2:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000461 Py_DECREF(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000462 fail_3:
463 return 0;
464}
465
466static void
467com_free(c)
468 struct compiling *c;
469{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000470 Py_XDECREF(c->c_code);
471 Py_XDECREF(c->c_consts);
472 Py_XDECREF(c->c_names);
473 Py_XDECREF(c->c_globals);
474 Py_XDECREF(c->c_locals);
475 Py_XDECREF(c->c_varnames);
476 Py_XDECREF(c->c_lnotab);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000477}
478
479static void
Guido van Rossum8b993a91997-01-17 21:04:03 +0000480com_push(c, n)
481 struct compiling *c;
482 int n;
483{
484 c->c_stacklevel += n;
485 if (c->c_stacklevel > c->c_maxstacklevel)
486 c->c_maxstacklevel = c->c_stacklevel;
487}
488
489static void
490com_pop(c, n)
491 struct compiling *c;
492 int n;
493{
494 if (c->c_stacklevel < n) {
495 fprintf(stderr,
496 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
497 c->c_filename, c->c_lineno,
498 c->c_nexti, c->c_stacklevel, n);
499 c->c_stacklevel = 0;
500 }
501 else
502 c->c_stacklevel -= n;
503}
504
505static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000506com_done(c)
507 struct compiling *c;
508{
509 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000510 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000511 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000512 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000513}
514
515static void
516com_addbyte(c, byte)
517 struct compiling *c;
518 int byte;
519{
520 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000521 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000522 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000523 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000524 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000525 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000526 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000527 com_error(c, PyExc_SystemError,
528 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000529 }
530 if (c->c_code == NULL)
531 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000532 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000533 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000534 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000535 c->c_errors++;
536 return;
537 }
538 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000539 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000540}
541
542static void
543com_addint(c, x)
544 struct compiling *c;
545 int x;
546{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000547 com_addbyte(c, x & 0xff);
548 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000549}
550
551static void
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000552com_add_lnotab(c, addr, line)
553 struct compiling *c;
554 int addr;
555 int line;
556{
557 int size;
558 char *p;
559 if (c->c_lnotab == NULL)
560 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000561 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000562 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000563 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000564 c->c_errors++;
565 return;
566 }
567 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000568 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000569 *p++ = addr;
570 *p++ = line;
571 c->c_lnotab_next += 2;
572}
573
574static void
575com_set_lineno(c, lineno)
576 struct compiling *c;
577 int lineno;
578{
579 c->c_lineno = lineno;
580 if (c->c_firstlineno == 0) {
581 c->c_firstlineno = c->c_last_line = lineno;
582 }
583 else {
584 int incr_addr = c->c_nexti - c->c_last_addr;
585 int incr_line = lineno - c->c_last_line;
586 while (incr_addr > 0 || incr_line > 0) {
587 int trunc_addr = incr_addr;
588 int trunc_line = incr_line;
589 if (trunc_addr > 255)
590 trunc_addr = 255;
591 if (trunc_line > 255)
592 trunc_line = 255;
593 com_add_lnotab(c, trunc_addr, trunc_line);
594 incr_addr -= trunc_addr;
595 incr_line -= trunc_line;
596 }
597 c->c_last_addr = c->c_nexti;
598 c->c_last_line = lineno;
599 }
600}
601
602static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000603com_addoparg(c, op, arg)
604 struct compiling *c;
605 int op;
606 int arg;
607{
Guido van Rossum8e793d91997-03-03 19:13:14 +0000608 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000609 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000610 if (Py_OptimizeFlag)
611 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000612 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000613 com_addbyte(c, op);
614 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000615}
616
617static void
618com_addfwref(c, op, p_anchor)
619 struct compiling *c;
620 int op;
621 int *p_anchor;
622{
623 /* Compile a forward reference for backpatching */
624 int here;
625 int anchor;
626 com_addbyte(c, op);
627 here = c->c_nexti;
628 anchor = *p_anchor;
629 *p_anchor = here;
630 com_addint(c, anchor == 0 ? 0 : here - anchor);
631}
632
633static void
634com_backpatch(c, anchor)
635 struct compiling *c;
636 int anchor; /* Must be nonzero */
637{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000638 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000639 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000640 int dist;
641 int prev;
642 for (;;) {
643 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000644 prev = code[anchor] + (code[anchor+1] << 8);
645 dist = target - (anchor+2);
646 code[anchor] = dist & 0xff;
647 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000648 if (!prev)
649 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000650 anchor -= prev;
651 }
652}
653
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000654/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000655
656static int
657com_add(c, list, v)
658 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000659 PyObject *list;
660 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000661{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000662 int n = PyList_Size(list);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000663 int i;
664 for (i = n; --i >= 0; ) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000665 PyObject *w = PyList_GetItem(list, i);
666 if (v->ob_type == w->ob_type && PyObject_Compare(v, w) == 0)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000667 return i;
668 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000669 /* Check for error from PyObject_Compare */
670 if (PyErr_Occurred() || PyList_Append(list, v) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000671 c->c_errors++;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000672 return n;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000673}
674
675static int
676com_addconst(c, v)
677 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000678 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000679{
680 return com_add(c, c->c_consts, v);
681}
682
683static int
684com_addname(c, v)
685 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000686 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000687{
688 return com_add(c, c->c_names, v);
689}
690
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000691#ifdef PRIVATE_NAME_MANGLING
692static int
693com_mangle(c, name, buffer, maxlen)
694 struct compiling *c;
695 char *name;
696 char *buffer;
697 int maxlen;
698{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000699 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000700 This is independent from how the name is used. */
701 char *p;
702 int nlen, plen;
703 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000704 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000705 return 0; /* Don't mangle __extremely_long_names */
706 if (name[nlen-1] == '_' && name[nlen-2] == '_')
707 return 0; /* Don't mangle __whatever__ */
708 p = c->c_private;
709 /* Strip leading underscores from class name */
710 while (*p == '_')
711 p++;
712 if (*p == '\0')
713 return 0; /* Don't mangle if class is just underscores */
714 plen = strlen(p);
715 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000716 plen = maxlen-nlen-2; /* Truncate class name if too long */
717 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000718 buffer[0] = '_';
719 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000720 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000721 /* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
722 return 1;
723}
724#endif
725
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000726static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000727com_addopnamestr(c, op, name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000728 struct compiling *c;
729 int op;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000730 char *name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000731{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000732 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000733 int i;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000734#ifdef PRIVATE_NAME_MANGLING
735 char buffer[256];
736 if (name != NULL && name[0] == '_' && name[1] == '_' &&
737 c->c_private != NULL &&
738 com_mangle(c, name, buffer, (int)sizeof(buffer)))
739 name = buffer;
740#endif
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000741 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000742 c->c_errors++;
743 i = 255;
744 }
745 else {
746 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000747 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000748 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000749 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
750 switch (op) {
751 case LOAD_NAME:
752 case STORE_NAME:
753 case DELETE_NAME:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000754 if (PyDict_GetItemString(c->c_globals, name) != NULL) {
Guido van Rossumc5e96291991-12-10 13:53:51 +0000755 switch (op) {
756 case LOAD_NAME: op = LOAD_GLOBAL; break;
757 case STORE_NAME: op = STORE_GLOBAL; break;
758 case DELETE_NAME: op = DELETE_GLOBAL; break;
759 }
760 }
761 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000762 com_addoparg(c, op, i);
763}
764
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000765static void
766com_addopname(c, op, n)
767 struct compiling *c;
768 int op;
769 node *n;
770{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000771 char *name;
772 char buffer[1000];
773 /* XXX it is possible to write this code without the 1000
774 chars on the total length of dotted names, I just can't be
775 bothered right now */
776 if (TYPE(n) == STAR)
777 name = "*";
778 else if (TYPE(n) == dotted_name) {
779 char *p = buffer;
780 int i;
781 name = buffer;
782 for (i = 0; i < NCH(n); i += 2) {
783 char *s = STR(CHILD(n, i));
784 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000785 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000786 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +0000787 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000788 break;
789 }
790 if (p != buffer)
791 *p++ = '.';
792 strcpy(p, s);
793 p = strchr(p, '\0');
794 }
795 }
796 else {
797 REQ(n, NAME);
798 name = STR(n);
799 }
800 com_addopnamestr(c, op, name);
801}
802
Guido van Rossum79f25d91997-04-29 20:08:16 +0000803static PyObject *
Guido van Rossum452a9831996-09-17 14:32:04 +0000804parsenumber(co, s)
805 struct compiling *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000806 char *s;
807{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000808 extern long PyOS_strtol Py_PROTO((const char *, char **, int));
809 extern unsigned long PyOS_strtoul Py_PROTO((const char *,
810 char **, int));
811 extern double atof Py_PROTO((const char *));
Guido van Rossumc5e96291991-12-10 13:53:51 +0000812 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000813 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000814 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +0000815#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +0000816 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +0000817 int imflag;
818#endif
819
Guido van Rossum282914b1991-04-04 10:42:56 +0000820 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000821 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +0000822#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +0000823 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +0000824#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000825 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000826 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000827 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000828 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000829 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000830 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000831 if (*end == '\0') {
832 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000833 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000834 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000835 return NULL;
836 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000837 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000838 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000839 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +0000840#ifndef WITHOUT_COMPLEX
841 if (imflag) {
842 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000843 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +0000844 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000845 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000846 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +0000847 }
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000848 else {
Guido van Rossum50564e81996-01-12 01:13:16 +0000849#endif
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000850 PyFPE_START_PROTECT("atof", return 0)
851 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000852 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000853 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000854 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000855}
856
Guido van Rossum79f25d91997-04-29 20:08:16 +0000857static PyObject *
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000858parsestr(s)
859 char *s;
860{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000861 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000862 int len;
863 char *buf;
864 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000865 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000866 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +0000867 int first = *s;
868 int quote = first;
869 if (isalpha(quote) || quote == '_')
870 quote = *++s;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000871 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000872 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000873 return NULL;
874 }
875 s++;
876 len = strlen(s);
Guido van Rossum8054fad1993-10-26 15:19:44 +0000877 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000878 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000879 return NULL;
880 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000881 if (len >= 4 && s[0] == quote && s[1] == quote) {
882 s += 2;
883 len -= 2;
884 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000885 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000886 return NULL;
887 }
888 }
Guido van Rossum5f5e8171997-04-06 03:41:40 +0000889 if (first != quote || strchr(s, '\\') == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000890 return PyString_FromStringAndSize(s, len);
891 v = PyString_FromStringAndSize((char *)NULL, len);
892 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000893 end = s + len;
894 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000895 if (*s != '\\') {
896 *p++ = *s++;
897 continue;
898 }
899 s++;
900 switch (*s++) {
901 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000902 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000903 case '\\': *p++ = '\\'; break;
904 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000905 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000906 case 'b': *p++ = '\b'; break;
907 case 'f': *p++ = '\014'; break; /* FF */
908 case 't': *p++ = '\t'; break;
909 case 'n': *p++ = '\n'; break;
910 case 'r': *p++ = '\r'; break;
911 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000912 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
913 case '0': case '1': case '2': case '3':
914 case '4': case '5': case '6': case '7':
915 c = s[-1] - '0';
916 if ('0' <= *s && *s <= '7') {
917 c = (c<<3) + *s++ - '0';
918 if ('0' <= *s && *s <= '7')
919 c = (c<<3) + *s++ - '0';
920 }
921 *p++ = c;
922 break;
923 case 'x':
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000924 if (isxdigit(Py_CHARMASK(*s))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000925 sscanf(s, "%x", &c);
926 *p++ = c;
927 do {
928 s++;
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000929 } while (isxdigit(Py_CHARMASK(*s)));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000930 break;
931 }
932 /* FALLTHROUGH */
933 default: *p++ = '\\'; *p++ = s[-1]; break;
934 }
935 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000936 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000937 return v;
938}
939
Guido van Rossum79f25d91997-04-29 20:08:16 +0000940static PyObject *
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000941parsestrplus(n)
942 node *n;
943{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000944 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000945 int i;
946 REQ(CHILD(n, 0), STRING);
947 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
948 /* String literal concatenation */
949 for (i = 1; i < NCH(n) && v != NULL; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000950 PyString_ConcatAndDel(&v, parsestr(STR(CHILD(n, i))));
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000951 }
952 }
953 return v;
954}
955
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000956static void
957com_list_constructor(c, n)
958 struct compiling *c;
959 node *n;
960{
961 int len;
962 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000963 if (TYPE(n) != testlist)
964 REQ(n, exprlist);
965 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
966 len = (NCH(n) + 1) / 2;
967 for (i = 0; i < NCH(n); i += 2)
968 com_node(c, CHILD(n, i));
969 com_addoparg(c, BUILD_LIST, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000970 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000971}
972
973static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000974com_dictmaker(c, n)
975 struct compiling *c;
976 node *n;
977{
978 int i;
979 /* dictmaker: test ':' test (',' test ':' value)* [','] */
980 for (i = 0; i+2 < NCH(n); i += 4) {
981 /* We must arrange things just right for STORE_SUBSCR.
982 It wants the stack to look like (value) (dict) (key) */
983 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000984 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000985 com_node(c, CHILD(n, i+2)); /* value */
986 com_addbyte(c, ROT_TWO);
987 com_node(c, CHILD(n, i)); /* key */
988 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000989 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000990 }
991}
992
993static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000994com_atom(c, n)
995 struct compiling *c;
996 node *n;
997{
998 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000999 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001000 int i;
1001 REQ(n, atom);
1002 ch = CHILD(n, 0);
1003 switch (TYPE(ch)) {
1004 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001005 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001006 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001007 com_push(c, 1);
1008 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001009 else
1010 com_node(c, CHILD(n, 1));
1011 break;
1012 case LSQB:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001013 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001014 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001015 com_push(c, 1);
1016 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001017 else
1018 com_list_constructor(c, CHILD(n, 1));
1019 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001020 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001021 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001022 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001023 if (TYPE(CHILD(n, 1)) != RBRACE)
1024 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001025 break;
1026 case BACKQUOTE:
1027 com_node(c, CHILD(n, 1));
1028 com_addbyte(c, UNARY_CONVERT);
1029 break;
1030 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001031 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001032 i = 255;
1033 }
1034 else {
1035 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001036 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001037 }
1038 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001039 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001040 break;
1041 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001042 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001043 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001044 c->c_errors++;
1045 i = 255;
1046 }
1047 else {
1048 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001049 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001050 }
1051 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001052 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001053 break;
1054 case NAME:
1055 com_addopname(c, LOAD_NAME, ch);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001056 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001057 break;
1058 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001059 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001060 com_error(c, PyExc_SystemError,
1061 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001062 }
1063}
1064
1065static void
1066com_slice(c, n, op)
1067 struct compiling *c;
1068 node *n;
1069 int op;
1070{
1071 if (NCH(n) == 1) {
1072 com_addbyte(c, op);
1073 }
1074 else if (NCH(n) == 2) {
1075 if (TYPE(CHILD(n, 0)) != COLON) {
1076 com_node(c, CHILD(n, 0));
1077 com_addbyte(c, op+1);
1078 }
1079 else {
1080 com_node(c, CHILD(n, 1));
1081 com_addbyte(c, op+2);
1082 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001083 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001084 }
1085 else {
1086 com_node(c, CHILD(n, 0));
1087 com_node(c, CHILD(n, 2));
1088 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001089 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001090 }
1091}
1092
Guido van Rossum635abd21997-01-06 22:56:52 +00001093static void
1094com_argument(c, n, pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001095 struct compiling *c;
1096 node *n; /* argument */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001097 PyObject **pkeywords;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001098{
1099 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001100 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001101 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001102 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001103 com_error(c, PyExc_SyntaxError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001104 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001105 }
1106 else {
1107 com_node(c, CHILD(n, 0));
1108 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001109 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001110 }
1111 m = n;
1112 do {
1113 m = CHILD(m, 0);
1114 } while (NCH(m) == 1);
1115 if (TYPE(m) != NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001116 com_error(c, PyExc_SyntaxError,
1117 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001118 }
1119 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001120 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001121 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001122 *pkeywords = PyDict_New();
Guido van Rossum635abd21997-01-06 22:56:52 +00001123 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001124 c->c_errors++;
1125 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001126 if (PyDict_GetItem(*pkeywords, v) != NULL)
1127 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001128 "duplicate keyword argument");
1129 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001130 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001131 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001132 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001133 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001134 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001135 }
1136 }
1137 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001138}
1139
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001140static void
1141com_call_function(c, n)
1142 struct compiling *c;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001143 node *n; /* EITHER arglist OR ')' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001144{
1145 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001146 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001147 }
1148 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001149 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001150 int i, na, nk;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001151 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001152 na = 0;
1153 nk = 0;
1154 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001155 com_argument(c, CHILD(n, i), &keywords);
1156 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001157 na++;
1158 else
1159 nk++;
1160 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001161 Py_XDECREF(keywords);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001162 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001163 com_error(c, PyExc_SyntaxError,
1164 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001165 }
1166 com_addoparg(c, CALL_FUNCTION, na | (nk << 8));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001167 com_pop(c, na + 2*nk);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001168 }
1169}
1170
1171static void
1172com_select_member(c, n)
1173 struct compiling *c;
1174 node *n;
1175{
1176 com_addopname(c, LOAD_ATTR, n);
1177}
1178
1179static void
Guido van Rossum8861b741996-07-30 16:49:37 +00001180com_sliceobj(c, n)
1181 struct compiling *c;
1182 node *n;
1183{
1184 int i=0;
1185 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001186 node *ch;
1187
1188 /* first argument */
1189 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001190 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001191 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001192 i++;
1193 }
1194 else {
1195 com_node(c, CHILD(n,i));
1196 i++;
1197 REQ(CHILD(n,i),COLON);
1198 i++;
1199 }
1200 /* second argument */
1201 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1202 com_node(c, CHILD(n,i));
1203 i++;
1204 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001205 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001206 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001207 com_push(c, 1);
1208 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001209 /* remaining arguments */
1210 for (; i < NCH(n); i++) {
1211 ns++;
1212 ch=CHILD(n,i);
1213 REQ(ch, sliceop);
1214 if (NCH(ch) == 1) {
1215 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001216 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001217 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001218 }
1219 else
1220 com_node(c, CHILD(ch,1));
1221 }
1222 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001223 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001224}
1225
1226static void
1227com_subscript(c, n)
1228 struct compiling *c;
1229 node *n;
1230{
1231 node *ch;
1232 REQ(n, subscript);
1233 ch = CHILD(n,0);
1234 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001235 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001236 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001237 com_push(c, 1);
1238 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001239 else {
1240 /* check for slice */
1241 if ((TYPE(ch) == COLON || NCH(n) > 1))
1242 com_sliceobj(c, n);
1243 else {
1244 REQ(ch, test);
1245 com_node(c, ch);
1246 }
1247 }
1248}
1249
1250static void
1251com_subscriptlist(c, n, assigning)
1252 struct compiling *c;
1253 node *n;
1254 int assigning;
1255{
1256 int i, op;
1257 REQ(n, subscriptlist);
1258 /* Check to make backward compatible slice behavior for '[i:j]' */
1259 if (NCH(n) == 1) {
1260 node *sub = CHILD(n, 0); /* subscript */
1261 /* Make it is a simple slice.
Guido van Rossum8b993a91997-01-17 21:04:03 +00001262 Should have exactly one colon. */
Guido van Rossum8861b741996-07-30 16:49:37 +00001263 if ((TYPE(CHILD(sub, 0)) == COLON
1264 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
Guido van Rossum8b993a91997-01-17 21:04:03 +00001265 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1266 {
Guido van Rossum8861b741996-07-30 16:49:37 +00001267 if (assigning == OP_APPLY)
1268 op = SLICE;
1269 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001270 op = ((assigning == OP_ASSIGN) ?
1271 STORE_SLICE : DELETE_SLICE);
Guido van Rossum8861b741996-07-30 16:49:37 +00001272 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001273 if (op == STORE_SLICE)
1274 com_pop(c, 2);
1275 else if (op == DELETE_SLICE)
1276 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001277 return;
1278 }
1279 }
1280 /* Else normal subscriptlist. Compile each subscript. */
1281 for (i = 0; i < NCH(n); i += 2)
1282 com_subscript(c, CHILD(n, i));
1283 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001284 if (NCH(n) > 1) {
1285 i = (NCH(n)+1) / 2;
1286 com_addoparg(c, BUILD_TUPLE, i);
1287 com_pop(c, i-1);
1288 }
1289 if (assigning == OP_APPLY) {
Guido van Rossum8861b741996-07-30 16:49:37 +00001290 op = BINARY_SUBSCR;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001291 i = 1;
1292 }
1293 else if (assigning == OP_ASSIGN) {
1294 op = STORE_SUBSCR;
1295 i = 3;
1296 }
1297 else {
1298 op = DELETE_SUBSCR;
1299 i = 2;
1300 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001301 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001302 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001303}
1304
1305static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001306com_apply_trailer(c, n)
1307 struct compiling *c;
1308 node *n;
1309{
1310 REQ(n, trailer);
1311 switch (TYPE(CHILD(n, 0))) {
1312 case LPAR:
1313 com_call_function(c, CHILD(n, 1));
1314 break;
1315 case DOT:
1316 com_select_member(c, CHILD(n, 1));
1317 break;
1318 case LSQB:
Guido van Rossum8861b741996-07-30 16:49:37 +00001319 com_subscriptlist(c, CHILD(n, 1), OP_APPLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001320 break;
1321 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001322 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001323 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001324 }
1325}
1326
1327static void
Guido van Rossum50564e81996-01-12 01:13:16 +00001328com_power(c, n)
1329 struct compiling *c;
1330 node *n;
1331{
1332 int i;
1333 REQ(n, power);
1334 com_atom(c, CHILD(n, 0));
1335 for (i = 1; i < NCH(n); i++) {
1336 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1337 com_factor(c, CHILD(n, i+1));
1338 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001339 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001340 break;
1341 }
1342 else
1343 com_apply_trailer(c, CHILD(n, i));
1344 }
1345}
1346
1347static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001348com_factor(c, n)
1349 struct compiling *c;
1350 node *n;
1351{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001352 REQ(n, factor);
1353 if (TYPE(CHILD(n, 0)) == PLUS) {
1354 com_factor(c, CHILD(n, 1));
1355 com_addbyte(c, UNARY_POSITIVE);
1356 }
1357 else if (TYPE(CHILD(n, 0)) == MINUS) {
1358 com_factor(c, CHILD(n, 1));
1359 com_addbyte(c, UNARY_NEGATIVE);
1360 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001361 else if (TYPE(CHILD(n, 0)) == TILDE) {
1362 com_factor(c, CHILD(n, 1));
1363 com_addbyte(c, UNARY_INVERT);
1364 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001365 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001366 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001367 }
1368}
1369
1370static void
1371com_term(c, n)
1372 struct compiling *c;
1373 node *n;
1374{
1375 int i;
1376 int op;
1377 REQ(n, term);
1378 com_factor(c, CHILD(n, 0));
1379 for (i = 2; i < NCH(n); i += 2) {
1380 com_factor(c, CHILD(n, i));
1381 switch (TYPE(CHILD(n, i-1))) {
1382 case STAR:
1383 op = BINARY_MULTIPLY;
1384 break;
1385 case SLASH:
1386 op = BINARY_DIVIDE;
1387 break;
1388 case PERCENT:
1389 op = BINARY_MODULO;
1390 break;
1391 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001392 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001393 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001394 op = 255;
1395 }
1396 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001397 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001398 }
1399}
1400
1401static void
1402com_arith_expr(c, n)
1403 struct compiling *c;
1404 node *n;
1405{
1406 int i;
1407 int op;
1408 REQ(n, arith_expr);
1409 com_term(c, CHILD(n, 0));
1410 for (i = 2; i < NCH(n); i += 2) {
1411 com_term(c, CHILD(n, i));
1412 switch (TYPE(CHILD(n, i-1))) {
1413 case PLUS:
1414 op = BINARY_ADD;
1415 break;
1416 case MINUS:
1417 op = BINARY_SUBTRACT;
1418 break;
1419 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001420 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001421 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001422 op = 255;
1423 }
1424 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001425 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001426 }
1427}
1428
1429static void
1430com_shift_expr(c, n)
1431 struct compiling *c;
1432 node *n;
1433{
1434 int i;
1435 int op;
1436 REQ(n, shift_expr);
1437 com_arith_expr(c, CHILD(n, 0));
1438 for (i = 2; i < NCH(n); i += 2) {
1439 com_arith_expr(c, CHILD(n, i));
1440 switch (TYPE(CHILD(n, i-1))) {
1441 case LEFTSHIFT:
1442 op = BINARY_LSHIFT;
1443 break;
1444 case RIGHTSHIFT:
1445 op = BINARY_RSHIFT;
1446 break;
1447 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001448 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001449 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001450 op = 255;
1451 }
1452 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001453 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001454 }
1455}
1456
1457static void
1458com_and_expr(c, n)
1459 struct compiling *c;
1460 node *n;
1461{
1462 int i;
1463 int op;
1464 REQ(n, and_expr);
1465 com_shift_expr(c, CHILD(n, 0));
1466 for (i = 2; i < NCH(n); i += 2) {
1467 com_shift_expr(c, CHILD(n, i));
1468 if (TYPE(CHILD(n, i-1)) == AMPER) {
1469 op = BINARY_AND;
1470 }
1471 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001472 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001473 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001474 op = 255;
1475 }
1476 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001477 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001478 }
1479}
1480
1481static void
1482com_xor_expr(c, n)
1483 struct compiling *c;
1484 node *n;
1485{
1486 int i;
1487 int op;
1488 REQ(n, xor_expr);
1489 com_and_expr(c, CHILD(n, 0));
1490 for (i = 2; i < NCH(n); i += 2) {
1491 com_and_expr(c, CHILD(n, i));
1492 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1493 op = BINARY_XOR;
1494 }
1495 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001496 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001497 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001498 op = 255;
1499 }
1500 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001501 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001502 }
1503}
1504
1505static void
1506com_expr(c, n)
1507 struct compiling *c;
1508 node *n;
1509{
1510 int i;
1511 int op;
1512 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001513 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001514 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001515 com_xor_expr(c, CHILD(n, i));
1516 if (TYPE(CHILD(n, i-1)) == VBAR) {
1517 op = BINARY_OR;
1518 }
1519 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001520 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001521 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001522 op = 255;
1523 }
1524 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001525 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001526 }
1527}
1528
1529static enum cmp_op
1530cmp_type(n)
1531 node *n;
1532{
1533 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001534 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001535 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1536 if (NCH(n) == 1) {
1537 n = CHILD(n, 0);
1538 switch (TYPE(n)) {
1539 case LESS: return LT;
1540 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001541 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001542 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001543 case LESSEQUAL: return LE;
1544 case GREATEREQUAL: return GE;
1545 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001546 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1547 if (strcmp(STR(n), "is") == 0) return IS;
1548 }
1549 }
1550 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001551 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001552 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1553 return NOT_IN;
1554 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1555 return IS_NOT;
1556 }
1557 }
1558 return BAD;
1559}
1560
1561static void
1562com_comparison(c, n)
1563 struct compiling *c;
1564 node *n;
1565{
1566 int i;
1567 enum cmp_op op;
1568 int anchor;
1569 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1570 com_expr(c, CHILD(n, 0));
1571 if (NCH(n) == 1)
1572 return;
1573
1574 /****************************************************************
1575 The following code is generated for all but the last
1576 comparison in a chain:
1577
1578 label: on stack: opcode: jump to:
1579
1580 a <code to load b>
1581 a, b DUP_TOP
1582 a, b, b ROT_THREE
1583 b, a, b COMPARE_OP
1584 b, 0-or-1 JUMP_IF_FALSE L1
1585 b, 1 POP_TOP
1586 b
1587
1588 We are now ready to repeat this sequence for the next
1589 comparison in the chain.
1590
1591 For the last we generate:
1592
1593 b <code to load c>
1594 b, c COMPARE_OP
1595 0-or-1
1596
1597 If there were any jumps to L1 (i.e., there was more than one
1598 comparison), we generate:
1599
1600 0-or-1 JUMP_FORWARD L2
1601 L1: b, 0 ROT_TWO
1602 0, b POP_TOP
1603 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00001604 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001605 ****************************************************************/
1606
1607 anchor = 0;
1608
1609 for (i = 2; i < NCH(n); i += 2) {
1610 com_expr(c, CHILD(n, i));
1611 if (i+2 < NCH(n)) {
1612 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001613 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001614 com_addbyte(c, ROT_THREE);
1615 }
1616 op = cmp_type(CHILD(n, i-1));
1617 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001618 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001619 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001620 }
1621 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001622 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001623 if (i+2 < NCH(n)) {
1624 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1625 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001626 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001627 }
1628 }
1629
1630 if (anchor) {
1631 int anchor2 = 0;
1632 com_addfwref(c, JUMP_FORWARD, &anchor2);
1633 com_backpatch(c, anchor);
1634 com_addbyte(c, ROT_TWO);
1635 com_addbyte(c, POP_TOP);
1636 com_backpatch(c, anchor2);
1637 }
1638}
1639
1640static void
1641com_not_test(c, n)
1642 struct compiling *c;
1643 node *n;
1644{
1645 REQ(n, not_test); /* 'not' not_test | comparison */
1646 if (NCH(n) == 1) {
1647 com_comparison(c, CHILD(n, 0));
1648 }
1649 else {
1650 com_not_test(c, CHILD(n, 1));
1651 com_addbyte(c, UNARY_NOT);
1652 }
1653}
1654
1655static void
1656com_and_test(c, n)
1657 struct compiling *c;
1658 node *n;
1659{
1660 int i;
1661 int anchor;
1662 REQ(n, and_test); /* not_test ('and' not_test)* */
1663 anchor = 0;
1664 i = 0;
1665 for (;;) {
1666 com_not_test(c, CHILD(n, i));
1667 if ((i += 2) >= NCH(n))
1668 break;
1669 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1670 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001671 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001672 }
1673 if (anchor)
1674 com_backpatch(c, anchor);
1675}
1676
1677static void
1678com_test(c, n)
1679 struct compiling *c;
1680 node *n;
1681{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001682 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00001683 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001684 PyObject *v;
Guido van Rossum57531fe1993-11-30 14:57:42 +00001685 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001686 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001687 v = (PyObject *) icompile(CHILD(n, 0), c);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001688 if (v == NULL) {
1689 c->c_errors++;
1690 i = 255;
1691 }
1692 else {
1693 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001694 Py_DECREF(v);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001695 }
1696 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001697 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001698 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001699 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001700 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001701 else {
1702 int anchor = 0;
1703 int i = 0;
1704 for (;;) {
1705 com_and_test(c, CHILD(n, i));
1706 if ((i += 2) >= NCH(n))
1707 break;
1708 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1709 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001710 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001711 }
1712 if (anchor)
1713 com_backpatch(c, anchor);
1714 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001715}
1716
1717static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001718com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001719 struct compiling *c;
1720 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001721 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001722{
1723 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001724 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001725 com_node(c, CHILD(n, 0));
1726 }
1727 else {
1728 int i;
1729 int len;
1730 len = (NCH(n) + 1) / 2;
1731 for (i = 0; i < NCH(n); i += 2)
1732 com_node(c, CHILD(n, i));
1733 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001734 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001735 }
1736}
1737
1738
1739/* Begin of assignment compilation */
1740
Guido van Rossum79f25d91997-04-29 20:08:16 +00001741static void com_assign_name Py_PROTO((struct compiling *, node *, int));
1742static void com_assign Py_PROTO((struct compiling *, node *, int));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001743
1744static void
1745com_assign_attr(c, n, assigning)
1746 struct compiling *c;
1747 node *n;
1748 int assigning;
1749{
1750 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001751 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001752}
1753
1754static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001755com_assign_trailer(c, n, assigning)
1756 struct compiling *c;
1757 node *n;
1758 int assigning;
1759{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001760 REQ(n, trailer);
1761 switch (TYPE(CHILD(n, 0))) {
1762 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001763 com_error(c, PyExc_SyntaxError,
1764 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001765 break;
1766 case DOT: /* '.' NAME */
1767 com_assign_attr(c, CHILD(n, 1), assigning);
1768 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001769 case LSQB: /* '[' subscriptlist ']' */
1770 com_subscriptlist(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001771 break;
1772 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001773 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001774 }
1775}
1776
1777static void
1778com_assign_tuple(c, n, assigning)
1779 struct compiling *c;
1780 node *n;
1781 int assigning;
1782{
1783 int i;
1784 if (TYPE(n) != testlist)
1785 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001786 if (assigning) {
1787 i = (NCH(n)+1)/2;
1788 com_addoparg(c, UNPACK_TUPLE, i);
1789 com_push(c, i-1);
1790 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001791 for (i = 0; i < NCH(n); i += 2)
1792 com_assign(c, CHILD(n, i), assigning);
1793}
1794
1795static void
1796com_assign_list(c, n, assigning)
1797 struct compiling *c;
1798 node *n;
1799 int assigning;
1800{
1801 int i;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001802 if (assigning) {
1803 i = (NCH(n)+1)/2;
1804 com_addoparg(c, UNPACK_LIST, i);
1805 com_push(c, i-1);
1806 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001807 for (i = 0; i < NCH(n); i += 2)
1808 com_assign(c, CHILD(n, i), assigning);
1809}
1810
1811static void
1812com_assign_name(c, n, assigning)
1813 struct compiling *c;
1814 node *n;
1815 int assigning;
1816{
1817 REQ(n, NAME);
1818 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001819 if (assigning)
1820 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001821}
1822
1823static void
1824com_assign(c, n, assigning)
1825 struct compiling *c;
1826 node *n;
1827 int assigning;
1828{
1829 /* Loop to avoid trivial recursion */
1830 for (;;) {
1831 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001832
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001833 case exprlist:
1834 case testlist:
1835 if (NCH(n) > 1) {
1836 com_assign_tuple(c, n, assigning);
1837 return;
1838 }
1839 n = CHILD(n, 0);
1840 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001841
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001842 case test:
1843 case and_test:
1844 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001845 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001846 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001847 case xor_expr:
1848 case and_expr:
1849 case shift_expr:
1850 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001851 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00001852 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001853 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001854 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001855 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001856 return;
1857 }
1858 n = CHILD(n, 0);
1859 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001860
Guido van Rossum50564e81996-01-12 01:13:16 +00001861 case power: /* atom trailer* ('**' power)* */
1862/* ('+'|'-'|'~') factor | atom trailer* */
1863 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001864 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001865 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001866 return;
1867 }
Guido van Rossum50564e81996-01-12 01:13:16 +00001868 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001869 int i;
1870 com_node(c, CHILD(n, 0));
1871 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00001872 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001873 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001874 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00001875 return;
1876 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001877 com_apply_trailer(c, CHILD(n, i));
1878 } /* NB i is still alive */
1879 com_assign_trailer(c,
1880 CHILD(n, i), assigning);
1881 return;
1882 }
1883 n = CHILD(n, 0);
1884 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001885
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001886 case atom:
1887 switch (TYPE(CHILD(n, 0))) {
1888 case LPAR:
1889 n = CHILD(n, 1);
1890 if (TYPE(n) == RPAR) {
1891 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001892 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001893 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001894 return;
1895 }
1896 break;
1897 case LSQB:
1898 n = CHILD(n, 1);
1899 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001900 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001901 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001902 return;
1903 }
1904 com_assign_list(c, n, assigning);
1905 return;
1906 case NAME:
1907 com_assign_name(c, CHILD(n, 0), assigning);
1908 return;
1909 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001910 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001911 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001912 return;
1913 }
1914 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001915
1916 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001917 com_error(c, PyExc_SyntaxError,
1918 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001919 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001920
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001921 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001922 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001923 com_error(c, PyExc_SystemError,
1924 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001925 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001926
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001927 }
1928 }
1929}
Guido van Rossum7c531111997-03-11 18:42:21 +00001930
Guido van Rossum79f25d91997-04-29 20:08:16 +00001931/* Forward */ static node *get_rawdocstring Py_PROTO((node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001932
1933static void
1934com_expr_stmt(c, n)
1935 struct compiling *c;
1936 node *n;
1937{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001938 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001939 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001940 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001941 return;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001942 com_node(c, CHILD(n, NCH(n)-1));
1943 if (NCH(n) == 1) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001944 if (c->c_interactive)
1945 com_addbyte(c, PRINT_EXPR);
1946 else
1947 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001948 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001949 }
1950 else {
1951 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001952 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001953 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001954 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001955 com_push(c, 1);
1956 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001957 com_assign(c, CHILD(n, i), OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001958 }
1959 }
1960}
1961
1962static void
Guido van Rossum228d7f31997-04-02 05:24:36 +00001963com_assert_stmt(c, n)
1964 struct compiling *c;
1965 node *n;
1966{
1967 int a = 0, b = 0;
1968 int i;
1969 REQ(n, assert_stmt); /* 'assert' test [',' test] */
1970 /* Generate code like for
1971
1972 if __debug__:
1973 if not <test>:
1974 raise AssertionError [, <message>]
1975
1976 where <message> is the second test, if present.
1977 */
1978 if (Py_OptimizeFlag)
1979 return;
1980 com_addopnamestr(c, LOAD_GLOBAL, "__debug__");
1981 com_push(c, 1);
1982 com_addfwref(c, JUMP_IF_FALSE, &a);
1983 com_addbyte(c, POP_TOP);
1984 com_pop(c, 1);
1985 com_node(c, CHILD(n, 1));
1986 com_addfwref(c, JUMP_IF_TRUE, &b);
1987 com_addbyte(c, POP_TOP);
1988 com_pop(c, 1);
1989 /* Raise that exception! */
1990 com_addopnamestr(c, LOAD_GLOBAL, "AssertionError");
1991 com_push(c, 1);
1992 i = NCH(n)/2; /* Either 2 or 4 */
1993 if (i > 1)
1994 com_node(c, CHILD(n, 3));
1995 com_addoparg(c, RAISE_VARARGS, i);
1996 com_pop(c, i);
1997 /* The interpreter does not fall through */
1998 /* All jumps converge here */
1999 com_backpatch(c, a);
2000 com_backpatch(c, b);
2001 com_addbyte(c, POP_TOP);
2002}
2003
2004static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002005com_print_stmt(c, n)
2006 struct compiling *c;
2007 node *n;
2008{
2009 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002010 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
2011 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002012 com_node(c, CHILD(n, i));
2013 com_addbyte(c, PRINT_ITEM);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002014 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002015 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002016 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002017 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002018 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002019}
2020
2021static void
2022com_return_stmt(c, n)
2023 struct compiling *c;
2024 node *n;
2025{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002026 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002027 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002028 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002029 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002030 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002031 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002032 com_push(c, 1);
2033 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002034 else
2035 com_node(c, CHILD(n, 1));
2036 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002037 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002038}
2039
2040static void
2041com_raise_stmt(c, n)
2042 struct compiling *c;
2043 node *n;
2044{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002045 int i;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002046 REQ(n, raise_stmt); /* 'raise' test [',' test [',' test]] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002047 com_node(c, CHILD(n, 1));
Guido van Rossum681d79a1995-07-18 14:51:37 +00002048 if (NCH(n) > 3) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002049 com_node(c, CHILD(n, 3));
Guido van Rossum681d79a1995-07-18 14:51:37 +00002050 if (NCH(n) > 5)
2051 com_node(c, CHILD(n, 5));
Guido van Rossumf10570b1995-07-07 22:53:21 +00002052 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002053 i = NCH(n)/2;
2054 com_addoparg(c, RAISE_VARARGS, i);
2055 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002056}
2057
2058static void
2059com_import_stmt(c, n)
2060 struct compiling *c;
2061 node *n;
2062{
2063 int i;
2064 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002065 /* 'import' dotted_name (',' dotted_name)* |
2066 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002067 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002068 /* 'from' dotted_name 'import' ... */
2069 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002070 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002071 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002072 for (i = 3; i < NCH(n); i += 2)
2073 com_addopname(c, IMPORT_FROM, CHILD(n, i));
2074 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002075 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002076 }
2077 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002078 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002079 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002080 REQ(CHILD(n, i), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002081 com_addopname(c, IMPORT_NAME, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002082 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002083 com_addopname(c, STORE_NAME, CHILD(CHILD(n, i), 0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002084 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002085 }
2086 }
2087}
2088
2089static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00002090com_global_stmt(c, n)
2091 struct compiling *c;
2092 node *n;
2093{
2094 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002095 REQ(n, global_stmt);
2096 /* 'global' NAME (',' NAME)* */
2097 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002098 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002099#ifdef PRIVATE_NAME_MANGLING
2100 char buffer[256];
2101 if (s != NULL && s[0] == '_' && s[1] == '_' &&
2102 c->c_private != NULL &&
2103 com_mangle(c, s, buffer, (int)sizeof(buffer)))
2104 s = buffer;
2105#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +00002106 if (PyDict_GetItemString(c->c_locals, s) != NULL) {
2107 com_error(c, PyExc_SyntaxError,
2108 "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002109 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002110 else if (PyDict_SetItemString(c->c_globals, s, Py_None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002111 c->c_errors++;
2112 }
2113}
2114
Guido van Rossum681d79a1995-07-18 14:51:37 +00002115static int
2116com_newlocal_o(c, nameval)
2117 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002118 PyObject *nameval;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002119{
2120 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002121 PyObject *ival;
2122 if (PyList_Size(c->c_varnames) != c->c_nlocals) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002123 /* This is usually caused by an error on a previous call */
2124 if (c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002125 com_error(c, PyExc_SystemError,
2126 "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002127 }
2128 return 0;
2129 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002130 ival = PyInt_FromLong(i = c->c_nlocals++);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002131 if (ival == NULL)
2132 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002133 else if (PyDict_SetItem(c->c_locals, nameval, ival) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002134 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002135 else if (PyList_Append(c->c_varnames, nameval) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002136 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002137 Py_XDECREF(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002138 return i;
2139}
2140
2141static int
2142com_addlocal_o(c, nameval)
2143 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002144 PyObject *nameval;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002145{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002146 PyObject *ival = PyDict_GetItem(c->c_locals, nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002147 if (ival != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002148 return PyInt_AsLong(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002149 return com_newlocal_o(c, nameval);
2150}
2151
2152static int
2153com_newlocal(c, name)
2154 struct compiling *c;
2155 char *name;
2156{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002157 PyObject *nameval = PyString_InternFromString(name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002158 int i;
2159 if (nameval == NULL) {
2160 c->c_errors++;
2161 return 0;
2162 }
2163 i = com_newlocal_o(c, nameval);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002164 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002165 return i;
2166}
2167
Guido van Rossumc5e96291991-12-10 13:53:51 +00002168static void
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002169com_exec_stmt(c, n)
2170 struct compiling *c;
2171 node *n;
2172{
2173 REQ(n, exec_stmt);
2174 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2175 com_node(c, CHILD(n, 1));
2176 if (NCH(n) >= 4)
2177 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002178 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002179 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002180 com_push(c, 1);
2181 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002182 if (NCH(n) >= 6)
2183 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002184 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002185 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002186 com_push(c, 1);
2187 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002188 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002189 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002190}
2191
Guido van Rossum7c531111997-03-11 18:42:21 +00002192static int
2193is_constant_false(c, n)
2194 struct compiling *c;
2195 node *n;
2196{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002197 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002198 int i;
2199
2200 /* Label to avoid tail recursion */
2201 next:
2202 switch (TYPE(n)) {
2203
2204 case suite:
2205 if (NCH(n) == 1) {
2206 n = CHILD(n, 0);
2207 goto next;
2208 }
2209 /* Fall through */
2210 case file_input:
2211 for (i = 0; i < NCH(n); i++) {
2212 node *ch = CHILD(n, i);
2213 if (TYPE(ch) == stmt) {
2214 n = ch;
2215 goto next;
2216 }
2217 }
2218 break;
2219
2220 case stmt:
2221 case simple_stmt:
2222 case small_stmt:
2223 n = CHILD(n, 0);
2224 goto next;
2225
2226 case expr_stmt:
2227 case testlist:
2228 case test:
2229 case and_test:
2230 case not_test:
2231 case comparison:
2232 case expr:
2233 case xor_expr:
2234 case and_expr:
2235 case shift_expr:
2236 case arith_expr:
2237 case term:
2238 case factor:
2239 case power:
2240 case atom:
2241 if (NCH(n) == 1) {
2242 n = CHILD(n, 0);
2243 goto next;
2244 }
2245 break;
2246
2247 case NAME:
2248 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2249 return 1;
2250 break;
2251
2252 case NUMBER:
2253 v = parsenumber(c, STR(n));
2254 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002255 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002256 break;
2257 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002258 i = PyObject_IsTrue(v);
2259 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002260 return i == 0;
2261
2262 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002263 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002264 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002265 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002266 break;
2267 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002268 i = PyObject_IsTrue(v);
2269 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002270 return i == 0;
2271
2272 }
2273 return 0;
2274}
2275
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002276static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002277com_if_stmt(c, n)
2278 struct compiling *c;
2279 node *n;
2280{
2281 int i;
2282 int anchor = 0;
2283 REQ(n, if_stmt);
2284 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2285 for (i = 0; i+3 < NCH(n); i+=4) {
2286 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002287 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002288 if (is_constant_false(c, ch))
2289 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002290 if (i > 0)
2291 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002292 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002293 com_addfwref(c, JUMP_IF_FALSE, &a);
2294 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002295 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002296 com_node(c, CHILD(n, i+3));
2297 com_addfwref(c, JUMP_FORWARD, &anchor);
2298 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002299 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002300 com_addbyte(c, POP_TOP);
2301 }
2302 if (i+2 < NCH(n))
2303 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002304 if (anchor)
2305 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002306}
2307
2308static void
2309com_while_stmt(c, n)
2310 struct compiling *c;
2311 node *n;
2312{
2313 int break_anchor = 0;
2314 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002315 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002316 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2317 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002318 block_push(c, SETUP_LOOP);
2319 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002320 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002321 com_node(c, CHILD(n, 1));
2322 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2323 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002324 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002325 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002326 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002327 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002328 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2329 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002330 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002331 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002332 com_addbyte(c, POP_TOP);
2333 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002334 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002335 if (NCH(n) > 4)
2336 com_node(c, CHILD(n, 6));
2337 com_backpatch(c, break_anchor);
2338}
2339
2340static void
2341com_for_stmt(c, n)
2342 struct compiling *c;
2343 node *n;
2344{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002345 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002346 int break_anchor = 0;
2347 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002348 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002349 REQ(n, for_stmt);
2350 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2351 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002352 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002353 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002354 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002355 if (v == NULL)
2356 c->c_errors++;
2357 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002358 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002359 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002360 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002361 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002362 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002363 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002364 com_assign(c, CHILD(n, 1), OP_ASSIGN);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002365 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002366 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002367 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002368 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2369 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002370 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002371 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002372 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002373 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002374 if (NCH(n) > 8)
2375 com_node(c, CHILD(n, 8));
2376 com_backpatch(c, break_anchor);
2377}
2378
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002379/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002380
2381 SETUP_FINALLY L
2382 <code for S>
2383 POP_BLOCK
2384 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002385 L: <code for Sf>
2386 END_FINALLY
2387
2388 The special instructions use the block stack. Each block
2389 stack entry contains the instruction that created it (here
2390 SETUP_FINALLY), the level of the value stack at the time the
2391 block stack entry was created, and a label (here L).
2392
2393 SETUP_FINALLY:
2394 Pushes the current value stack level and the label
2395 onto the block stack.
2396 POP_BLOCK:
2397 Pops en entry from the block stack, and pops the value
2398 stack until its level is the same as indicated on the
2399 block stack. (The label is ignored.)
2400 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002401 Pops a variable number of entries from the *value* stack
2402 and re-raises the exception they specify. The number of
2403 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002404
2405 The block stack is unwound when an exception is raised:
2406 when a SETUP_FINALLY entry is found, the exception is pushed
2407 onto the value stack (and the exception condition is cleared),
2408 and the interpreter jumps to the label gotten from the block
2409 stack.
2410
2411 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002412 (The contents of the value stack is shown in [], with the top
2413 at the right; 'tb' is trace-back info, 'val' the exception's
2414 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002415
2416 Value stack Label Instruction Argument
2417 [] SETUP_EXCEPT L1
2418 [] <code for S>
2419 [] POP_BLOCK
2420 [] JUMP_FORWARD L0
2421
Guido van Rossum3f5da241990-12-20 15:06:42 +00002422 [tb, val, exc] L1: DUP )
2423 [tb, val, exc, exc] <evaluate E1> )
2424 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2425 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2426 [tb, val, exc, 1] POP )
2427 [tb, val, exc] POP
2428 [tb, val] <assign to V1> (or POP if no V1)
2429 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002430 [] <code for S1>
2431 JUMP_FORWARD L0
2432
Guido van Rossum3f5da241990-12-20 15:06:42 +00002433 [tb, val, exc, 0] L2: POP
2434 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002435 .............................etc.......................
2436
Guido van Rossum3f5da241990-12-20 15:06:42 +00002437 [tb, val, exc, 0] Ln+1: POP
2438 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002439
2440 [] L0: <next statement>
2441
2442 Of course, parts are not generated if Vi or Ei is not present.
2443*/
2444
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002445static void
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002446com_try_except(c, n)
2447 struct compiling *c;
2448 node *n;
2449{
2450 int except_anchor = 0;
2451 int end_anchor = 0;
2452 int else_anchor = 0;
2453 int i;
2454 node *ch;
2455
2456 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2457 block_push(c, SETUP_EXCEPT);
2458 com_node(c, CHILD(n, 2));
2459 com_addbyte(c, POP_BLOCK);
2460 block_pop(c, SETUP_EXCEPT);
2461 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2462 com_backpatch(c, except_anchor);
2463 for (i = 3;
2464 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2465 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002466 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002467 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002468 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002469 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002470 break;
2471 }
2472 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002473 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002474 com_addoparg(c, SET_LINENO, ch->n_lineno);
2475 if (NCH(ch) > 1) {
2476 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002477 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002478 com_node(c, CHILD(ch, 1));
2479 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002480 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002481 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2482 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002483 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002484 }
2485 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002486 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002487 if (NCH(ch) > 3)
Guido van Rossum8861b741996-07-30 16:49:37 +00002488 com_assign(c, CHILD(ch, 3), OP_ASSIGN);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002489 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002490 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002491 com_pop(c, 1);
2492 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002493 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002494 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002495 com_node(c, CHILD(n, i+2));
2496 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2497 if (except_anchor) {
2498 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002499 /* We come in with [tb, val, exc, 0] on the
2500 stack; one pop and it's the same as
2501 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002502 com_addbyte(c, POP_TOP);
2503 }
2504 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002505 /* We actually come in here with [tb, val, exc] but the
2506 END_FINALLY will zap those and jump around.
2507 The c_stacklevel does not reflect them so we need not pop
2508 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002509 com_addbyte(c, END_FINALLY);
2510 com_backpatch(c, else_anchor);
2511 if (i < NCH(n))
2512 com_node(c, CHILD(n, i+2));
2513 com_backpatch(c, end_anchor);
2514}
2515
2516static void
2517com_try_finally(c, n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002518 struct compiling *c;
2519 node *n;
2520{
2521 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002522 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002523
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002524 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2525 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002526 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002527 com_addbyte(c, POP_BLOCK);
2528 block_pop(c, SETUP_FINALLY);
2529 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002530 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002531 /* While the generated code pushes only one item,
2532 the try-finally handling can enter here with
2533 up to three items. OK, here are the details:
2534 3 for an exception, 2 for RETURN, 1 for BREAK. */
2535 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002536 com_backpatch(c, finally_anchor);
2537 ch = CHILD(n, NCH(n)-1);
2538 com_addoparg(c, SET_LINENO, ch->n_lineno);
2539 com_node(c, ch);
2540 com_addbyte(c, END_FINALLY);
2541 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002542 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002543}
2544
2545static void
2546com_try_stmt(c, n)
2547 struct compiling *c;
2548 node *n;
2549{
2550 REQ(n, try_stmt);
2551 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2552 | 'try' ':' suite 'finally' ':' suite */
2553 if (TYPE(CHILD(n, 3)) != except_clause)
2554 com_try_finally(c, n);
2555 else
2556 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002557}
2558
Guido van Rossum8b993a91997-01-17 21:04:03 +00002559static node *
2560get_rawdocstring(n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002561 node *n;
2562{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002563 int i;
2564
Guido van Rossum8b993a91997-01-17 21:04:03 +00002565 /* Label to avoid tail recursion */
2566 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002567 switch (TYPE(n)) {
2568
2569 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002570 if (NCH(n) == 1) {
2571 n = CHILD(n, 0);
2572 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002573 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002574 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002575 case file_input:
2576 for (i = 0; i < NCH(n); i++) {
2577 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002578 if (TYPE(ch) == stmt) {
2579 n = ch;
2580 goto next;
2581 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002582 }
2583 break;
2584
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002585 case stmt:
2586 case simple_stmt:
2587 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002588 n = CHILD(n, 0);
2589 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002590
2591 case expr_stmt:
2592 case testlist:
2593 case test:
2594 case and_test:
2595 case not_test:
2596 case comparison:
2597 case expr:
2598 case xor_expr:
2599 case and_expr:
2600 case shift_expr:
2601 case arith_expr:
2602 case term:
2603 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002604 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002605 if (NCH(n) == 1) {
2606 n = CHILD(n, 0);
2607 goto next;
2608 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002609 break;
2610
2611 case atom:
2612 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002613 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002614 break;
2615
2616 }
2617 return NULL;
2618}
2619
Guido van Rossum79f25d91997-04-29 20:08:16 +00002620static PyObject *
Guido van Rossum8b993a91997-01-17 21:04:03 +00002621get_docstring(n)
2622 node *n;
2623{
2624 n = get_rawdocstring(n);
2625 if (n == NULL)
2626 return NULL;
2627 return parsestrplus(n);
2628}
2629
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002630static void
2631com_suite(c, n)
2632 struct compiling *c;
2633 node *n;
2634{
2635 REQ(n, suite);
2636 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2637 if (NCH(n) == 1) {
2638 com_node(c, CHILD(n, 0));
2639 }
2640 else {
2641 int i;
2642 for (i = 0; i < NCH(n); i++) {
2643 node *ch = CHILD(n, i);
2644 if (TYPE(ch) == stmt)
2645 com_node(c, ch);
2646 }
2647 }
2648}
2649
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002650/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002651static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002652com_continue_stmt(c, n)
2653 struct compiling *c;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002654 node *n; /* Not used, but passed for consistency */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002655{
2656 int i = c->c_nblocks;
2657 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2658 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2659 }
2660 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002661 com_error(c, PyExc_SyntaxError,
2662 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002663 }
2664 /* XXX Could allow it inside a 'finally' clause
2665 XXX if we could pop the exception still on the stack */
2666}
2667
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002668static int
Guido van Rossum681d79a1995-07-18 14:51:37 +00002669com_argdefs(c, n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002670 struct compiling *c;
2671 node *n;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002672{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002673 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002674 if (TYPE(n) == lambdef) {
2675 /* lambdef: 'lambda' [varargslist] ':' test */
2676 n = CHILD(n, 1);
2677 }
2678 else {
2679 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2680 n = CHILD(n, 2);
2681 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2682 n = CHILD(n, 1);
2683 }
2684 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002685 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002686 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002687 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002688 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2689 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002690 nargs = 0;
2691 ndefs = 0;
2692 for (i = 0; i < nch; i++) {
2693 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002694 if (TYPE(CHILD(n, i)) == STAR ||
2695 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002696 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002697 nargs++;
2698 i++;
2699 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002700 t = RPAR; /* Anything except EQUAL or COMMA */
2701 else
2702 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002703 if (t == EQUAL) {
2704 i++;
2705 ndefs++;
2706 com_node(c, CHILD(n, i));
2707 i++;
2708 if (i >= nch)
2709 break;
2710 t = TYPE(CHILD(n, i));
2711 }
2712 else {
2713 /* Treat "(a=1, b)" as "(a=1, b=None)" */
2714 if (ndefs) {
2715 com_addoparg(c, LOAD_CONST,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002716 com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002717 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002718 ndefs++;
2719 }
2720 }
2721 if (t != COMMA)
2722 break;
2723 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002724 return ndefs;
2725}
2726
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002727static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002728com_funcdef(c, n)
2729 struct compiling *c;
2730 node *n;
2731{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002732 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002733 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002734 v = (PyObject *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002735 if (v == NULL)
2736 c->c_errors++;
2737 else {
2738 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002739 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002740 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002741 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002742 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002743 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002744 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002745 com_pop(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002746 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002747 }
2748}
2749
2750static void
Guido van Rossum25831651993-05-19 14:50:45 +00002751com_bases(c, n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002752 struct compiling *c;
2753 node *n;
2754{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002755 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002756 REQ(n, testlist);
2757 /* testlist: test (',' test)* [','] */
2758 for (i = 0; i < NCH(n); i += 2)
2759 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002760 i = (NCH(n)+1) / 2;
2761 com_addoparg(c, BUILD_TUPLE, i);
2762 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00002763}
2764
2765static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002766com_classdef(c, n)
2767 struct compiling *c;
2768 node *n;
2769{
Guido van Rossum25831651993-05-19 14:50:45 +00002770 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002771 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002772 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002773 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00002774 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00002775 c->c_errors++;
2776 return;
2777 }
2778 /* Push the class name on the stack */
2779 i = com_addconst(c, v);
2780 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002781 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002782 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00002783 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002784 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00002785 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002786 com_push(c, 1);
2787 }
Guido van Rossum25831651993-05-19 14:50:45 +00002788 else
2789 com_bases(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002790 v = (PyObject *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002791 if (v == NULL)
2792 c->c_errors++;
2793 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002794 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002795 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002796 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002797 com_addoparg(c, MAKE_FUNCTION, 0);
2798 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002799 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002800 com_pop(c, 2);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002801 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002802 Py_DECREF(v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002803 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002804}
2805
2806static void
2807com_node(c, n)
2808 struct compiling *c;
2809 node *n;
2810{
2811 switch (TYPE(n)) {
2812
2813 /* Definition nodes */
2814
2815 case funcdef:
2816 com_funcdef(c, n);
2817 break;
2818 case classdef:
2819 com_classdef(c, n);
2820 break;
2821
2822 /* Trivial parse tree nodes */
2823
2824 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002825 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002826 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002827 com_node(c, CHILD(n, 0));
2828 break;
2829
2830 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002831 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2832 com_addoparg(c, SET_LINENO, n->n_lineno);
2833 {
2834 int i;
2835 for (i = 0; i < NCH(n)-1; i += 2)
2836 com_node(c, CHILD(n, i));
2837 }
2838 break;
2839
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002840 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002841 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002842 com_node(c, CHILD(n, 0));
2843 break;
2844
2845 /* Statement nodes */
2846
2847 case expr_stmt:
2848 com_expr_stmt(c, n);
2849 break;
2850 case print_stmt:
2851 com_print_stmt(c, n);
2852 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002853 case del_stmt: /* 'del' exprlist */
Guido van Rossum8861b741996-07-30 16:49:37 +00002854 com_assign(c, CHILD(n, 1), OP_DELETE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002855 break;
2856 case pass_stmt:
2857 break;
2858 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002859 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002860 com_error(c, PyExc_SyntaxError,
2861 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002862 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002863 com_addbyte(c, BREAK_LOOP);
2864 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002865 case continue_stmt:
2866 com_continue_stmt(c, n);
2867 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002868 case return_stmt:
2869 com_return_stmt(c, n);
2870 break;
2871 case raise_stmt:
2872 com_raise_stmt(c, n);
2873 break;
2874 case import_stmt:
2875 com_import_stmt(c, n);
2876 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002877 case global_stmt:
2878 com_global_stmt(c, n);
2879 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002880 case exec_stmt:
2881 com_exec_stmt(c, n);
2882 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002883 case assert_stmt:
2884 com_assert_stmt(c, n);
2885 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002886 case if_stmt:
2887 com_if_stmt(c, n);
2888 break;
2889 case while_stmt:
2890 com_while_stmt(c, n);
2891 break;
2892 case for_stmt:
2893 com_for_stmt(c, n);
2894 break;
2895 case try_stmt:
2896 com_try_stmt(c, n);
2897 break;
2898 case suite:
2899 com_suite(c, n);
2900 break;
2901
2902 /* Expression nodes */
2903
2904 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002905 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002906 break;
2907 case test:
2908 com_test(c, n);
2909 break;
2910 case and_test:
2911 com_and_test(c, n);
2912 break;
2913 case not_test:
2914 com_not_test(c, n);
2915 break;
2916 case comparison:
2917 com_comparison(c, n);
2918 break;
2919 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002920 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002921 break;
2922 case expr:
2923 com_expr(c, n);
2924 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002925 case xor_expr:
2926 com_xor_expr(c, n);
2927 break;
2928 case and_expr:
2929 com_and_expr(c, n);
2930 break;
2931 case shift_expr:
2932 com_shift_expr(c, n);
2933 break;
2934 case arith_expr:
2935 com_arith_expr(c, n);
2936 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002937 case term:
2938 com_term(c, n);
2939 break;
2940 case factor:
2941 com_factor(c, n);
2942 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00002943 case power:
2944 com_power(c, n);
2945 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002946 case atom:
2947 com_atom(c, n);
2948 break;
2949
2950 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002951 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002952 com_error(c, PyExc_SystemError,
2953 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002954 }
2955}
2956
Guido van Rossum79f25d91997-04-29 20:08:16 +00002957static void com_fplist Py_PROTO((struct compiling *, node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002958
2959static void
2960com_fpdef(c, n)
2961 struct compiling *c;
2962 node *n;
2963{
2964 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
2965 if (TYPE(CHILD(n, 0)) == LPAR)
2966 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002967 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002968 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002969 com_pop(c, 1);
2970 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002971}
2972
2973static void
2974com_fplist(c, n)
2975 struct compiling *c;
2976 node *n;
2977{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00002978 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002979 if (NCH(n) == 1) {
2980 com_fpdef(c, CHILD(n, 0));
2981 }
2982 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002983 int i = (NCH(n)+1)/2;
2984 com_addoparg(c, UNPACK_TUPLE, i);
2985 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002986 for (i = 0; i < NCH(n); i += 2)
2987 com_fpdef(c, CHILD(n, i));
2988 }
2989}
2990
2991static void
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002992com_arglist(c, n)
2993 struct compiling *c;
2994 node *n;
2995{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002996 int nch, i;
2997 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00002998 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002999 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003000 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003001 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003002 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003003 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003004 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003005 node *ch = CHILD(n, i);
3006 node *fp;
3007 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00003008 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003009 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003010 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3011 fp = CHILD(ch, 0);
3012 if (TYPE(fp) == NAME)
3013 name = STR(fp);
3014 else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003015 name = nbuf;
3016 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003017 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003018 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003019 com_newlocal(c, name);
3020 c->c_argcount++;
3021 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003022 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003023 ch = CHILD(n, i);
3024 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003025 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003026 else
3027 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003028 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003029 /* Handle *arguments */
3030 if (i < nch) {
3031 node *ch;
3032 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003033 if (TYPE(ch) != DOUBLESTAR) {
3034 REQ(ch, STAR);
3035 ch = CHILD(n, i+1);
3036 if (TYPE(ch) == NAME) {
3037 c->c_flags |= CO_VARARGS;
3038 i += 3;
3039 com_newlocal(c, STR(ch));
3040 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003041 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003042 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003043 /* Handle **keywords */
3044 if (i < nch) {
3045 node *ch;
3046 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003047 if (TYPE(ch) != DOUBLESTAR) {
3048 REQ(ch, STAR);
3049 ch = CHILD(n, i+1);
3050 REQ(ch, STAR);
3051 ch = CHILD(n, i+2);
3052 }
3053 else
3054 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003055 REQ(ch, NAME);
3056 c->c_flags |= CO_VARKEYWORDS;
3057 com_newlocal(c, STR(ch));
3058 }
3059 if (complex) {
3060 /* Generate code for complex arguments only after
3061 having counted the simple arguments */
3062 int ilocal = 0;
3063 for (i = 0; i < nch; i++) {
3064 node *ch = CHILD(n, i);
3065 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003066 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003067 break;
3068 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3069 fp = CHILD(ch, 0);
3070 if (TYPE(fp) != NAME) {
3071 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003072 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003073 com_fpdef(c, ch);
3074 }
3075 ilocal++;
3076 if (++i >= nch)
3077 break;
3078 ch = CHILD(n, i);
3079 if (TYPE(ch) == EQUAL)
3080 i += 2;
3081 else
3082 REQ(ch, COMMA);
3083 }
3084 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003085}
3086
3087static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003088com_file_input(c, n)
3089 struct compiling *c;
3090 node *n;
3091{
3092 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003093 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003094 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003095 doc = get_docstring(n);
3096 if (doc != NULL) {
3097 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003098 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003099 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003100 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003101 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003102 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003103 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003104 for (i = 0; i < NCH(n); i++) {
3105 node *ch = CHILD(n, i);
3106 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3107 com_node(c, ch);
3108 }
3109}
3110
3111/* Top-level compile-node interface */
3112
3113static void
3114compile_funcdef(c, n)
3115 struct compiling *c;
3116 node *n;
3117{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003118 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003119 node *ch;
3120 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003121 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003122 doc = get_docstring(CHILD(n, 4));
3123 if (doc != NULL) {
3124 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003125 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003126 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003127 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003128 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003129 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3130 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003131 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003132 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003133 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003134 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003135 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003136 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003137 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003138 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003139 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003140}
3141
3142static void
Guido van Rossum590baa41993-11-30 13:40:46 +00003143compile_lambdef(c, n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003144 struct compiling *c;
3145 node *n;
3146{
Guido van Rossum590baa41993-11-30 13:40:46 +00003147 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003148 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003149 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003150
3151 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003152 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003153 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003154 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003155 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003156 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003157 else
3158 ch = CHILD(n, 2);
3159 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003160 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003161 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003162}
3163
3164static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003165compile_classdef(c, n)
3166 struct compiling *c;
3167 node *n;
3168{
3169 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003170 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003171 REQ(n, classdef);
3172 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3173 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003174#ifdef PRIVATE_NAME_MANGLING
3175 c->c_private = c->c_name;
3176#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003177 ch = CHILD(n, NCH(n)-1); /* The suite */
3178 doc = get_docstring(ch);
3179 if (doc != NULL) {
3180 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003181 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003182 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003183 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003184 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003185 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003186 }
3187 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003188 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003189 com_node(c, ch);
3190 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003191 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003192 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003193 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003194}
3195
3196static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003197compile_node(c, n)
3198 struct compiling *c;
3199 node *n;
3200{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003201 com_addoparg(c, SET_LINENO, n->n_lineno);
3202
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003203 switch (TYPE(n)) {
3204
Guido van Rossum4c417781991-01-21 16:09:22 +00003205 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003206 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003207 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003208 n = CHILD(n, 0);
3209 if (TYPE(n) != NEWLINE)
3210 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003211 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003212 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003213 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003214 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003215 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003216 break;
3217
Guido van Rossum4c417781991-01-21 16:09:22 +00003218 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003219 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003220 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003221 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003222 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003223 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003224 break;
3225
Guido van Rossum590baa41993-11-30 13:40:46 +00003226 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003227 com_node(c, CHILD(n, 0));
3228 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003229 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003230 break;
3231
Guido van Rossum590baa41993-11-30 13:40:46 +00003232 case lambdef: /* anonymous function definition */
3233 compile_lambdef(c, n);
3234 break;
3235
Guido van Rossum4c417781991-01-21 16:09:22 +00003236 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003237 compile_funcdef(c, n);
3238 break;
3239
Guido van Rossum4c417781991-01-21 16:09:22 +00003240 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003241 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003242 break;
3243
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003244 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003245 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003246 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003247 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003248 }
3249}
3250
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003251/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00003252
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003253 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
3254 instructions that refer to local variables with LOAD_FAST etc.
3255 The latter instructions are much faster because they don't need to
3256 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003257
Guido van Rossum681d79a1995-07-18 14:51:37 +00003258 To find all local variables, we check all STORE_NAME, IMPORT_FROM
3259 and DELETE_NAME instructions. This yields all local variables,
3260 function definitions, class definitions and import statements.
3261 Argument names have already been entered into the list by the
3262 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003263
3264 All remaining LOAD_NAME instructions must refer to non-local (global
3265 or builtin) variables, so are replaced by LOAD_GLOBAL.
3266
3267 There are two problems: 'from foo import *' and 'exec' may introduce
3268 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00003269 case, we can still optimize bona fide locals (since those
3270 statements will be surrounded by fast_2_locals() and
3271 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003272
Guido van Rossum681d79a1995-07-18 14:51:37 +00003273 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00003274
3275static void
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003276optimize(c)
3277 struct compiling *c;
Guido van Rossum282914b1991-04-04 10:42:56 +00003278{
Guido van Rossum0a697f61991-04-16 08:39:12 +00003279 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00003280 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00003281 int oparg = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003282 PyObject *name;
3283 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003284
Guido van Rossum282914b1991-04-04 10:42:56 +00003285#define NEXTOP() (*next_instr++)
3286#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossum79f25d91997-04-29 20:08:16 +00003287#define GETITEM(v, i) (PyList_GetItem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003288#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
3289
Guido van Rossum79f25d91997-04-29 20:08:16 +00003290 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003291
3292 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00003293
Guido van Rossum79f25d91997-04-29 20:08:16 +00003294 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003295 for (;;) {
3296 opcode = NEXTOP();
3297 if (opcode == STOP_CODE)
3298 break;
3299 if (HAS_ARG(opcode))
3300 oparg = NEXTARG();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003301 switch (opcode) {
3302 case STORE_NAME:
3303 case DELETE_NAME:
3304 case IMPORT_FROM:
3305 com_addlocal_o(c, GETNAMEOBJ(oparg));
3306 break;
3307 case EXEC_STMT:
3308 c->c_flags &= ~CO_OPTIMIZED;
3309 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00003310 }
3311 }
3312
Guido van Rossum79f25d91997-04-29 20:08:16 +00003313 if (PyDict_GetItemString(c->c_locals, "*") != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003314 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003315
Guido van Rossum79f25d91997-04-29 20:08:16 +00003316 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003317 for (;;) {
3318 cur_instr = next_instr;
3319 opcode = NEXTOP();
3320 if (opcode == STOP_CODE)
3321 break;
3322 if (HAS_ARG(opcode))
3323 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003324 if (opcode == LOAD_NAME ||
3325 opcode == STORE_NAME ||
3326 opcode == DELETE_NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003327 PyObject *v;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003328 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00003329 name = GETNAMEOBJ(oparg);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003330 v = PyDict_GetItem(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003331 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003332 PyErr_Clear();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003333 if (opcode == LOAD_NAME &&
3334 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003335 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003336 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00003337 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003338 i = PyInt_AsLong(v);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003339 switch (opcode) {
3340 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
3341 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
3342 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
3343 }
3344 cur_instr[1] = i & 0xff;
3345 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00003346 }
3347 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003348
Guido van Rossum681d79a1995-07-18 14:51:37 +00003349 if (c->c_errors == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00003350 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00003351}
3352
Guido van Rossum79f25d91997-04-29 20:08:16 +00003353PyCodeObject *
3354PyNode_Compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003355 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003356 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003357{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003358 return jcompile(n, filename, NULL);
3359}
3360
Guido van Rossum79f25d91997-04-29 20:08:16 +00003361static PyCodeObject *
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003362icompile(n, base)
3363 node *n;
3364 struct compiling *base;
3365{
3366 return jcompile(n, base->c_filename, base);
3367}
3368
Guido van Rossum79f25d91997-04-29 20:08:16 +00003369static PyCodeObject *
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003370jcompile(n, filename, base)
3371 node *n;
3372 char *filename;
3373 struct compiling *base;
3374{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003375 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003376 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003377 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003378 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003379#ifdef PRIVATE_NAME_MANGLING
3380 if (base)
3381 sc.c_private = base->c_private;
3382 else
3383 sc.c_private = NULL;
3384#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003385 compile_node(&sc, n);
3386 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003387 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003388 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003389 sc.c_flags |= CO_NEWLOCALS;
3390 }
3391 else if (TYPE(n) == classdef)
3392 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00003393 co = NULL;
3394 if (sc.c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003395 PyObject *consts, *names, *varnames, *filename, *name;
3396 consts = PyList_AsTuple(sc.c_consts);
3397 names = PyList_AsTuple(sc.c_names);
3398 varnames = PyList_AsTuple(sc.c_varnames);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003399 filename = PyString_InternFromString(sc.c_filename);
3400 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003401 if (!PyErr_Occurred())
3402 co = PyCode_New(sc.c_argcount,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003403 sc.c_nlocals,
Guido van Rossum8b993a91997-01-17 21:04:03 +00003404 sc.c_maxstacklevel,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003405 sc.c_flags,
3406 sc.c_code,
3407 consts,
3408 names,
3409 varnames,
3410 filename,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003411 name,
3412 sc.c_firstlineno,
3413 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003414 Py_XDECREF(consts);
3415 Py_XDECREF(names);
3416 Py_XDECREF(varnames);
3417 Py_XDECREF(filename);
3418 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003419 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003420 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003421 return co;
3422}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003423
3424int
3425PyCode_Addr2Line(co, addrq)
3426 PyCodeObject *co;
3427 int addrq;
3428{
3429 int size = PyString_Size(co->co_lnotab) / 2;
3430 char *p = PyString_AsString(co->co_lnotab);
3431 int line = co->co_firstlineno;
3432 int addr = 0;
3433 while (--size >= 0) {
3434 addr += *p++;
3435 if (addr > addrq)
3436 break;
3437 line += *p++;
3438 }
3439 return line;
3440}