blob: 9d6d395e00248eb43c9c31a58d0c18e579739dc3 [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 Rossum8e793d91997-03-03 19:13:14 +000061int Py_OptimizeFlag = 0;
62
Guido van Rossum8861b741996-07-30 16:49:37 +000063#define OP_DELETE 0
64#define OP_ASSIGN 1
65#define OP_APPLY 2
66
Guido van Rossum79f25d91997-04-29 20:08:16 +000067#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000068
69static struct memberlist code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000070 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
71 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000072 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000073 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000074 {"co_code", T_OBJECT, OFF(co_code), READONLY},
75 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
76 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000077 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000078 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000079 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000080 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
81 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000082 {NULL} /* Sentinel */
83};
84
Guido van Rossum79f25d91997-04-29 20:08:16 +000085static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +000086code_getattr(co, name)
Guido van Rossum79f25d91997-04-29 20:08:16 +000087 PyCodeObject *co;
Guido van Rossum3f5da241990-12-20 15:06:42 +000088 char *name;
89{
Guido van Rossum79f25d91997-04-29 20:08:16 +000090 return PyMember_Get((char *)co, code_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +000091}
Guido van Rossum10dc2e81990-11-18 17:27:39 +000092
93static void
Guido van Rossum3f5da241990-12-20 15:06:42 +000094code_dealloc(co)
Guido van Rossum79f25d91997-04-29 20:08:16 +000095 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +000096{
Guido van Rossum79f25d91997-04-29 20:08:16 +000097 Py_XDECREF(co->co_code);
98 Py_XDECREF(co->co_consts);
99 Py_XDECREF(co->co_names);
100 Py_XDECREF(co->co_filename);
101 Py_XDECREF(co->co_name);
102 Py_XDECREF(co->co_varnames);
103 PyMem_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000104}
105
Guido van Rossum79f25d91997-04-29 20:08:16 +0000106static PyObject *
Guido van Rossum2dff9911992-09-03 20:50:59 +0000107code_repr(co)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000108 PyCodeObject *co;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000109{
110 char buf[500];
111 int lineno = -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000112 char *p = PyString_AS_STRING(co->co_code);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000113 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000114 char *name = "???";
Guido van Rossum2dff9911992-09-03 20:50:59 +0000115 if (*p == SET_LINENO)
116 lineno = (p[1] & 0xff) | ((p[2] & 0xff) << 8);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000117 if (co->co_filename && PyString_Check(co->co_filename))
118 filename = PyString_AsString(co->co_filename);
119 if (co->co_name && PyString_Check(co->co_name))
120 name = PyString_AsString(co->co_name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000121 sprintf(buf, "<code object %.100s at %lx, file \"%.300s\", line %d>",
122 name, (long)co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000123 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000124}
125
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000126static int
127code_compare(co, cp)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000128 PyCodeObject *co, *cp;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000129{
130 int cmp;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000131 cmp = cp->co_argcount - cp->co_argcount;
132 if (cmp) return cmp;
133 cmp = cp->co_nlocals - cp->co_nlocals;
134 if (cmp) return cmp;
135 cmp = cp->co_flags - cp->co_flags;
136 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000137 cmp = PyObject_Compare((PyObject *)co->co_code,
138 (PyObject *)cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000139 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000140 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000141 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000142 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000143 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000144 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000145 return cmp;
146}
147
148static long
149code_hash(co)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000150 PyCodeObject *co;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000151{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000152 long h, h1, h2, h3, h4;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000153 h1 = PyObject_Hash((PyObject *)co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000154 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000155 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000156 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000157 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000158 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000159 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000160 if (h4 == -1) return -1;
161 h = h1 ^ h2 ^ h3 ^ h4 ^
162 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000163 if (h == -1) h = -2;
164 return h;
165}
166
Guido van Rossum79f25d91997-04-29 20:08:16 +0000167PyTypeObject PyCode_Type = {
168 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000169 0,
170 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000171 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000172 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000173 (destructor)code_dealloc, /*tp_dealloc*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000174 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000175 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000176 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000177 (cmpfunc)code_compare, /*tp_compare*/
178 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000179 0, /*tp_as_number*/
180 0, /*tp_as_sequence*/
181 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000182 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000183};
184
Guido van Rossum644a12b1997-04-09 19:24:53 +0000185#define NAME_CHARS \
186 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
187
Guido van Rossum79f25d91997-04-29 20:08:16 +0000188PyCodeObject *
189PyCode_New(argcount, nlocals, stacksize, flags,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000190 code, consts, names, varnames, filename, name,
191 firstlineno, lnotab)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000192 int argcount;
193 int nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000194 int stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000195 int flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000196 PyObject *code;
197 PyObject *consts;
198 PyObject *names;
199 PyObject *varnames;
200 PyObject *filename;
201 PyObject *name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000202 int firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000203 PyObject *lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000204{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000205 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000206 int i;
207 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000208 if (argcount < 0 || nlocals < 0 ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000209 code == NULL || !PyString_Check(code) ||
210 consts == NULL || !PyTuple_Check(consts) ||
211 names == NULL || !PyTuple_Check(names) ||
212 varnames == NULL || !PyTuple_Check(varnames) ||
213 name == NULL || !PyString_Check(name) ||
214 filename == NULL || !PyString_Check(filename) ||
215 lnotab == NULL || !PyString_Check(lnotab)) {
216 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000217 return NULL;
218 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000219 /* Make sure names and varnames are all strings, & intern them */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000220 for (i = PyTuple_Size(names); --i >= 0; ) {
221 PyObject *v = PyTuple_GetItem(names, i);
222 if (v == NULL || !PyString_Check(v)) {
223 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000224 return NULL;
225 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000226 PyString_InternInPlace(&PyTuple_GET_ITEM(names, i));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000227 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000228 for (i = PyTuple_Size(varnames); --i >= 0; ) {
229 PyObject *v = PyTuple_GetItem(varnames, i);
230 if (v == NULL || !PyString_Check(v)) {
231 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000232 return NULL;
233 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000234 PyString_InternInPlace(&PyTuple_GET_ITEM(varnames, i));
235 }
236 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000237 for (i = PyTuple_Size(consts); --i >= 0; ) {
238 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000239 char *p;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000240 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000241 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000242 p = PyString_AsString(v);
Guido van Rossum644a12b1997-04-09 19:24:53 +0000243 if ((int)strspn(p, NAME_CHARS)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244 != PyString_Size(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000245 continue;
246 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000247 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000248 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000249 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000250 co->co_argcount = argcount;
251 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000252 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000253 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000254 Py_INCREF(code);
255 co->co_code = (PyStringObject *)code;
256 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000257 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000258 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000259 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000260 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000261 co->co_varnames = varnames;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000262 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000263 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000264 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000265 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000266 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000267 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000268 co->co_lnotab = lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000269 }
270 return co;
271}
272
273
274/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000275
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000276struct compiling {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000277 PyObject *c_code; /* string */
278 PyObject *c_consts; /* list of objects */
279 PyObject *c_names; /* list of strings (names) */
280 PyObject *c_globals; /* dictionary (value=None) */
281 PyObject *c_locals; /* dictionary (value=localID) */
282 PyObject *c_varnames; /* list (inverse of c_locals) */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000283 int c_nlocals; /* index of next local */
284 int c_argcount; /* number of top-level arguments */
285 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000286 int c_nexti; /* index into c_code */
287 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000288 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000289 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000290 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000291 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000292 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000293 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000294 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000295 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000296 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000297 int c_stacklevel; /* Current stack level */
298 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000299 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000300 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000301 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000302#ifdef PRIVATE_NAME_MANGLING
303 char *c_private; /* for private name mangling */
304#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000305};
306
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000307
Guido van Rossum452a9831996-09-17 14:32:04 +0000308/* Error message including line number */
309
310static void
311com_error(c, exc, msg)
312 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000313 PyObject *exc;
Guido van Rossum452a9831996-09-17 14:32:04 +0000314 char *msg;
315{
316 int n = strlen(msg);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000317 PyObject *v;
Guido van Rossum452a9831996-09-17 14:32:04 +0000318 char buffer[30];
319 char *s;
Guido van Rossum635abd21997-01-06 22:56:52 +0000320 c->c_errors++;
Guido van Rossum452a9831996-09-17 14:32:04 +0000321 if (c->c_lineno <= 1) {
322 /* Unknown line number or single interactive command */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000323 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000324 return;
325 }
326 sprintf(buffer, " (line %d)", c->c_lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000327 v = PyString_FromStringAndSize((char *)NULL, n + strlen(buffer));
Guido van Rossum452a9831996-09-17 14:32:04 +0000328 if (v == NULL)
329 return; /* MemoryError, too bad */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000330 s = PyString_AS_STRING((PyStringObject *)v);
Guido van Rossum452a9831996-09-17 14:32:04 +0000331 strcpy(s, msg);
332 strcat(s, buffer);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000333 PyErr_SetObject(exc, v);
334 Py_DECREF(v);
Guido van Rossum452a9831996-09-17 14:32:04 +0000335}
336
337
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000338/* Interface to the block stack */
339
340static void
341block_push(c, type)
342 struct compiling *c;
343 int type;
344{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000345 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000346 com_error(c, PyExc_SystemError,
347 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000348 }
349 else {
350 c->c_block[c->c_nblocks++] = type;
351 }
352}
353
354static void
355block_pop(c, type)
356 struct compiling *c;
357 int type;
358{
359 if (c->c_nblocks > 0)
360 c->c_nblocks--;
361 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000362 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000363 }
364}
365
366
Guido van Rossum681d79a1995-07-18 14:51:37 +0000367/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000368
Guido van Rossum79f25d91997-04-29 20:08:16 +0000369static int com_init Py_PROTO((struct compiling *, char *));
370static void com_free Py_PROTO((struct compiling *));
371static void com_push Py_PROTO((struct compiling *, int));
372static void com_pop Py_PROTO((struct compiling *, int));
373static void com_done Py_PROTO((struct compiling *));
374static void com_node Py_PROTO((struct compiling *, struct _node *));
375static void com_factor Py_PROTO((struct compiling *, struct _node *));
376static void com_addbyte Py_PROTO((struct compiling *, int));
377static void com_addint Py_PROTO((struct compiling *, int));
378static void com_addoparg Py_PROTO((struct compiling *, int, int));
379static void com_addfwref Py_PROTO((struct compiling *, int, int *));
380static void com_backpatch Py_PROTO((struct compiling *, int));
381static int com_add Py_PROTO((struct compiling *, PyObject *, PyObject *));
382static int com_addconst Py_PROTO((struct compiling *, PyObject *));
383static int com_addname Py_PROTO((struct compiling *, PyObject *));
384static void com_addopname Py_PROTO((struct compiling *, int, node *));
385static void com_list Py_PROTO((struct compiling *, node *, int));
386static int com_argdefs Py_PROTO((struct compiling *, node *));
387static int com_newlocal Py_PROTO((struct compiling *, char *));
388static PyCodeObject *icompile Py_PROTO((struct _node *, struct compiling *));
389static PyCodeObject *jcompile Py_PROTO((struct _node *, char *,
390 struct compiling *));
391static PyObject *parsestrplus Py_PROTO((node *));
392static PyObject *parsestr Py_PROTO((char *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000393
394static int
Guido van Rossum590baa41993-11-30 13:40:46 +0000395com_init(c, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000396 struct compiling *c;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000397 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000398{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000399 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
400 1000)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000401 goto fail_3;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000402 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000403 goto fail_2;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000404 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000405 goto fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000406 if ((c->c_globals = PyDict_New()) == NULL)
Guido van Rossumc5e96291991-12-10 13:53:51 +0000407 goto fail_0;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000408 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000409 goto fail_00;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000410 if ((c->c_varnames = PyList_New(0)) == NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000411 goto fail_000;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000412 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
413 1000)) == NULL)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000414 goto fail_0000;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000415 c->c_nlocals = 0;
416 c->c_argcount = 0;
417 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000418 c->c_nexti = 0;
419 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000420 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000421 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000422 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000423 c->c_begin = 0;
424 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000425 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000426 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000427 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000428 c->c_stacklevel = 0;
429 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000430 c->c_firstlineno = 0;
431 c->c_last_addr = 0;
432 c->c_last_line = 0;
433 c-> c_lnotab_next = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000434 return 1;
435
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000436 fail_0000:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000437 Py_DECREF(c->c_lnotab);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000438 fail_000:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000439 Py_DECREF(c->c_locals);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000440 fail_00:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000441 Py_DECREF(c->c_globals);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000442 fail_0:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000443 Py_DECREF(c->c_names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000444 fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000445 Py_DECREF(c->c_consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000446 fail_2:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000447 Py_DECREF(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000448 fail_3:
449 return 0;
450}
451
452static void
453com_free(c)
454 struct compiling *c;
455{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000456 Py_XDECREF(c->c_code);
457 Py_XDECREF(c->c_consts);
458 Py_XDECREF(c->c_names);
459 Py_XDECREF(c->c_globals);
460 Py_XDECREF(c->c_locals);
461 Py_XDECREF(c->c_varnames);
462 Py_XDECREF(c->c_lnotab);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000463}
464
465static void
Guido van Rossum8b993a91997-01-17 21:04:03 +0000466com_push(c, n)
467 struct compiling *c;
468 int n;
469{
470 c->c_stacklevel += n;
471 if (c->c_stacklevel > c->c_maxstacklevel)
472 c->c_maxstacklevel = c->c_stacklevel;
473}
474
475static void
476com_pop(c, n)
477 struct compiling *c;
478 int n;
479{
480 if (c->c_stacklevel < n) {
481 fprintf(stderr,
482 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
483 c->c_filename, c->c_lineno,
484 c->c_nexti, c->c_stacklevel, n);
485 c->c_stacklevel = 0;
486 }
487 else
488 c->c_stacklevel -= n;
489}
490
491static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000492com_done(c)
493 struct compiling *c;
494{
495 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000496 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000497 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000498 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000499}
500
501static void
502com_addbyte(c, byte)
503 struct compiling *c;
504 int byte;
505{
506 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000507 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000508 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000509 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000510 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000511 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000512 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000513 com_error(c, PyExc_SystemError,
514 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000515 }
516 if (c->c_code == NULL)
517 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000518 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000519 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000520 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000521 c->c_errors++;
522 return;
523 }
524 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000525 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000526}
527
528static void
529com_addint(c, x)
530 struct compiling *c;
531 int x;
532{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000533 com_addbyte(c, x & 0xff);
534 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000535}
536
537static void
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000538com_add_lnotab(c, addr, line)
539 struct compiling *c;
540 int addr;
541 int line;
542{
543 int size;
544 char *p;
545 if (c->c_lnotab == NULL)
546 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000547 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000548 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000549 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000550 c->c_errors++;
551 return;
552 }
553 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000554 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000555 *p++ = addr;
556 *p++ = line;
557 c->c_lnotab_next += 2;
558}
559
560static void
561com_set_lineno(c, lineno)
562 struct compiling *c;
563 int lineno;
564{
565 c->c_lineno = lineno;
566 if (c->c_firstlineno == 0) {
567 c->c_firstlineno = c->c_last_line = lineno;
568 }
569 else {
570 int incr_addr = c->c_nexti - c->c_last_addr;
571 int incr_line = lineno - c->c_last_line;
572 while (incr_addr > 0 || incr_line > 0) {
573 int trunc_addr = incr_addr;
574 int trunc_line = incr_line;
575 if (trunc_addr > 255)
576 trunc_addr = 255;
577 if (trunc_line > 255)
578 trunc_line = 255;
579 com_add_lnotab(c, trunc_addr, trunc_line);
580 incr_addr -= trunc_addr;
581 incr_line -= trunc_line;
582 }
583 c->c_last_addr = c->c_nexti;
584 c->c_last_line = lineno;
585 }
586}
587
588static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000589com_addoparg(c, op, arg)
590 struct compiling *c;
591 int op;
592 int arg;
593{
Guido van Rossum8e793d91997-03-03 19:13:14 +0000594 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000595 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000596 if (Py_OptimizeFlag)
597 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000598 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000599 com_addbyte(c, op);
600 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000601}
602
603static void
604com_addfwref(c, op, p_anchor)
605 struct compiling *c;
606 int op;
607 int *p_anchor;
608{
609 /* Compile a forward reference for backpatching */
610 int here;
611 int anchor;
612 com_addbyte(c, op);
613 here = c->c_nexti;
614 anchor = *p_anchor;
615 *p_anchor = here;
616 com_addint(c, anchor == 0 ? 0 : here - anchor);
617}
618
619static void
620com_backpatch(c, anchor)
621 struct compiling *c;
622 int anchor; /* Must be nonzero */
623{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000624 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000625 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000626 int dist;
627 int prev;
628 for (;;) {
629 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000630 prev = code[anchor] + (code[anchor+1] << 8);
631 dist = target - (anchor+2);
632 code[anchor] = dist & 0xff;
633 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000634 if (!prev)
635 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000636 anchor -= prev;
637 }
638}
639
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000640/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000641
642static int
643com_add(c, list, v)
644 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000645 PyObject *list;
646 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000647{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000648 int n = PyList_Size(list);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000649 int i;
650 for (i = n; --i >= 0; ) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000651 PyObject *w = PyList_GetItem(list, i);
652 if (v->ob_type == w->ob_type && PyObject_Compare(v, w) == 0)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000653 return i;
654 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000655 if (PyList_Append(list, v) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000656 c->c_errors++;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000657 return n;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000658}
659
660static int
661com_addconst(c, v)
662 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000663 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000664{
665 return com_add(c, c->c_consts, v);
666}
667
668static int
669com_addname(c, v)
670 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000671 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000672{
673 return com_add(c, c->c_names, v);
674}
675
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000676#ifdef PRIVATE_NAME_MANGLING
677static int
678com_mangle(c, name, buffer, maxlen)
679 struct compiling *c;
680 char *name;
681 char *buffer;
682 int maxlen;
683{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000684 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000685 This is independent from how the name is used. */
686 char *p;
687 int nlen, plen;
688 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000689 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000690 return 0; /* Don't mangle __extremely_long_names */
691 if (name[nlen-1] == '_' && name[nlen-2] == '_')
692 return 0; /* Don't mangle __whatever__ */
693 p = c->c_private;
694 /* Strip leading underscores from class name */
695 while (*p == '_')
696 p++;
697 if (*p == '\0')
698 return 0; /* Don't mangle if class is just underscores */
699 plen = strlen(p);
700 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000701 plen = maxlen-nlen-2; /* Truncate class name if too long */
702 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000703 buffer[0] = '_';
704 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000705 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000706 /* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
707 return 1;
708}
709#endif
710
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000711static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000712com_addopnamestr(c, op, name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000713 struct compiling *c;
714 int op;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000715 char *name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000716{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000717 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000718 int i;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000719#ifdef PRIVATE_NAME_MANGLING
720 char buffer[256];
721 if (name != NULL && name[0] == '_' && name[1] == '_' &&
722 c->c_private != NULL &&
723 com_mangle(c, name, buffer, (int)sizeof(buffer)))
724 name = buffer;
725#endif
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000726 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000727 c->c_errors++;
728 i = 255;
729 }
730 else {
731 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000732 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000733 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000734 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
735 switch (op) {
736 case LOAD_NAME:
737 case STORE_NAME:
738 case DELETE_NAME:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000739 if (PyDict_GetItemString(c->c_globals, name) != NULL) {
Guido van Rossumc5e96291991-12-10 13:53:51 +0000740 switch (op) {
741 case LOAD_NAME: op = LOAD_GLOBAL; break;
742 case STORE_NAME: op = STORE_GLOBAL; break;
743 case DELETE_NAME: op = DELETE_GLOBAL; break;
744 }
745 }
746 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000747 com_addoparg(c, op, i);
748}
749
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000750static void
751com_addopname(c, op, n)
752 struct compiling *c;
753 int op;
754 node *n;
755{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000756 char *name;
757 char buffer[1000];
758 /* XXX it is possible to write this code without the 1000
759 chars on the total length of dotted names, I just can't be
760 bothered right now */
761 if (TYPE(n) == STAR)
762 name = "*";
763 else if (TYPE(n) == dotted_name) {
764 char *p = buffer;
765 int i;
766 name = buffer;
767 for (i = 0; i < NCH(n); i += 2) {
768 char *s = STR(CHILD(n, i));
769 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000770 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000771 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +0000772 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000773 break;
774 }
775 if (p != buffer)
776 *p++ = '.';
777 strcpy(p, s);
778 p = strchr(p, '\0');
779 }
780 }
781 else {
782 REQ(n, NAME);
783 name = STR(n);
784 }
785 com_addopnamestr(c, op, name);
786}
787
Guido van Rossum79f25d91997-04-29 20:08:16 +0000788static PyObject *
Guido van Rossum452a9831996-09-17 14:32:04 +0000789parsenumber(co, s)
790 struct compiling *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000791 char *s;
792{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000793 extern long PyOS_strtol Py_PROTO((const char *, char **, int));
794 extern unsigned long PyOS_strtoul Py_PROTO((const char *,
795 char **, int));
796 extern double atof Py_PROTO((const char *));
Guido van Rossumc5e96291991-12-10 13:53:51 +0000797 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000798 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000799 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +0000800#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +0000801 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +0000802 int imflag;
803#endif
804
Guido van Rossum282914b1991-04-04 10:42:56 +0000805 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000806 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +0000807#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +0000808 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +0000809#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000810 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000811 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000812 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000813 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000814 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000815 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000816 if (*end == '\0') {
817 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000818 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000819 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000820 return NULL;
821 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000822 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000823 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000824 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +0000825#ifndef WITHOUT_COMPLEX
826 if (imflag) {
827 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000828 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +0000829 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000830 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000831 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +0000832 }
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000833 else {
Guido van Rossum50564e81996-01-12 01:13:16 +0000834#endif
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000835 PyFPE_START_PROTECT("atof", return 0)
836 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000837 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000838 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000839 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000840}
841
Guido van Rossum79f25d91997-04-29 20:08:16 +0000842static PyObject *
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000843parsestr(s)
844 char *s;
845{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000846 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000847 int len;
848 char *buf;
849 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000850 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000851 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +0000852 int first = *s;
853 int quote = first;
854 if (isalpha(quote) || quote == '_')
855 quote = *++s;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000856 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000857 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000858 return NULL;
859 }
860 s++;
861 len = strlen(s);
Guido van Rossum8054fad1993-10-26 15:19:44 +0000862 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000863 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000864 return NULL;
865 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000866 if (len >= 4 && s[0] == quote && s[1] == quote) {
867 s += 2;
868 len -= 2;
869 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000870 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000871 return NULL;
872 }
873 }
Guido van Rossum5f5e8171997-04-06 03:41:40 +0000874 if (first != quote || strchr(s, '\\') == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000875 return PyString_FromStringAndSize(s, len);
876 v = PyString_FromStringAndSize((char *)NULL, len);
877 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000878 end = s + len;
879 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000880 if (*s != '\\') {
881 *p++ = *s++;
882 continue;
883 }
884 s++;
885 switch (*s++) {
886 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000887 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000888 case '\\': *p++ = '\\'; break;
889 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000890 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000891 case 'b': *p++ = '\b'; break;
892 case 'f': *p++ = '\014'; break; /* FF */
893 case 't': *p++ = '\t'; break;
894 case 'n': *p++ = '\n'; break;
895 case 'r': *p++ = '\r'; break;
896 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000897 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
898 case '0': case '1': case '2': case '3':
899 case '4': case '5': case '6': case '7':
900 c = s[-1] - '0';
901 if ('0' <= *s && *s <= '7') {
902 c = (c<<3) + *s++ - '0';
903 if ('0' <= *s && *s <= '7')
904 c = (c<<3) + *s++ - '0';
905 }
906 *p++ = c;
907 break;
908 case 'x':
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000909 if (isxdigit(Py_CHARMASK(*s))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000910 sscanf(s, "%x", &c);
911 *p++ = c;
912 do {
913 s++;
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000914 } while (isxdigit(Py_CHARMASK(*s)));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000915 break;
916 }
917 /* FALLTHROUGH */
918 default: *p++ = '\\'; *p++ = s[-1]; break;
919 }
920 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000921 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000922 return v;
923}
924
Guido van Rossum79f25d91997-04-29 20:08:16 +0000925static PyObject *
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000926parsestrplus(n)
927 node *n;
928{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000929 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000930 int i;
931 REQ(CHILD(n, 0), STRING);
932 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
933 /* String literal concatenation */
934 for (i = 1; i < NCH(n) && v != NULL; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000935 PyString_ConcatAndDel(&v, parsestr(STR(CHILD(n, i))));
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000936 }
937 }
938 return v;
939}
940
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000941static void
942com_list_constructor(c, n)
943 struct compiling *c;
944 node *n;
945{
946 int len;
947 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000948 if (TYPE(n) != testlist)
949 REQ(n, exprlist);
950 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
951 len = (NCH(n) + 1) / 2;
952 for (i = 0; i < NCH(n); i += 2)
953 com_node(c, CHILD(n, i));
954 com_addoparg(c, BUILD_LIST, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000955 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000956}
957
958static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000959com_dictmaker(c, n)
960 struct compiling *c;
961 node *n;
962{
963 int i;
964 /* dictmaker: test ':' test (',' test ':' value)* [','] */
965 for (i = 0; i+2 < NCH(n); i += 4) {
966 /* We must arrange things just right for STORE_SUBSCR.
967 It wants the stack to look like (value) (dict) (key) */
968 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000969 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000970 com_node(c, CHILD(n, i+2)); /* value */
971 com_addbyte(c, ROT_TWO);
972 com_node(c, CHILD(n, i)); /* key */
973 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000974 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000975 }
976}
977
978static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000979com_atom(c, n)
980 struct compiling *c;
981 node *n;
982{
983 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000984 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000985 int i;
986 REQ(n, atom);
987 ch = CHILD(n, 0);
988 switch (TYPE(ch)) {
989 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +0000990 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000991 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000992 com_push(c, 1);
993 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000994 else
995 com_node(c, CHILD(n, 1));
996 break;
997 case LSQB:
Guido van Rossum8b993a91997-01-17 21:04:03 +0000998 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000999 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001000 com_push(c, 1);
1001 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001002 else
1003 com_list_constructor(c, CHILD(n, 1));
1004 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001005 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001006 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001007 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001008 if (TYPE(CHILD(n, 1)) != RBRACE)
1009 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001010 break;
1011 case BACKQUOTE:
1012 com_node(c, CHILD(n, 1));
1013 com_addbyte(c, UNARY_CONVERT);
1014 break;
1015 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001016 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001017 i = 255;
1018 }
1019 else {
1020 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001021 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001022 }
1023 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001024 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001025 break;
1026 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001027 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001028 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001029 c->c_errors++;
1030 i = 255;
1031 }
1032 else {
1033 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001034 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001035 }
1036 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001037 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001038 break;
1039 case NAME:
1040 com_addopname(c, LOAD_NAME, ch);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001041 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001042 break;
1043 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001044 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001045 com_error(c, PyExc_SystemError,
1046 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001047 }
1048}
1049
1050static void
1051com_slice(c, n, op)
1052 struct compiling *c;
1053 node *n;
1054 int op;
1055{
1056 if (NCH(n) == 1) {
1057 com_addbyte(c, op);
1058 }
1059 else if (NCH(n) == 2) {
1060 if (TYPE(CHILD(n, 0)) != COLON) {
1061 com_node(c, CHILD(n, 0));
1062 com_addbyte(c, op+1);
1063 }
1064 else {
1065 com_node(c, CHILD(n, 1));
1066 com_addbyte(c, op+2);
1067 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001068 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001069 }
1070 else {
1071 com_node(c, CHILD(n, 0));
1072 com_node(c, CHILD(n, 2));
1073 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001074 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001075 }
1076}
1077
Guido van Rossum635abd21997-01-06 22:56:52 +00001078static void
1079com_argument(c, n, pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001080 struct compiling *c;
1081 node *n; /* argument */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001082 PyObject **pkeywords;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001083{
1084 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001085 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001086 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001087 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001088 com_error(c, PyExc_SyntaxError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001089 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001090 }
1091 else {
1092 com_node(c, CHILD(n, 0));
1093 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001094 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001095 }
1096 m = n;
1097 do {
1098 m = CHILD(m, 0);
1099 } while (NCH(m) == 1);
1100 if (TYPE(m) != NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001101 com_error(c, PyExc_SyntaxError,
1102 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001103 }
1104 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001105 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001106 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001107 *pkeywords = PyDict_New();
Guido van Rossum635abd21997-01-06 22:56:52 +00001108 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001109 c->c_errors++;
1110 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001111 if (PyDict_GetItem(*pkeywords, v) != NULL)
1112 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001113 "duplicate keyword argument");
1114 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001115 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001116 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001117 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001118 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001119 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001120 }
1121 }
1122 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001123}
1124
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001125static void
1126com_call_function(c, n)
1127 struct compiling *c;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001128 node *n; /* EITHER arglist OR ')' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001129{
1130 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001131 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001132 }
1133 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001134 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001135 int i, na, nk;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001136 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001137 na = 0;
1138 nk = 0;
1139 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001140 com_argument(c, CHILD(n, i), &keywords);
1141 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001142 na++;
1143 else
1144 nk++;
1145 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001146 Py_XDECREF(keywords);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001147 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001148 com_error(c, PyExc_SyntaxError,
1149 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001150 }
1151 com_addoparg(c, CALL_FUNCTION, na | (nk << 8));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001152 com_pop(c, na + 2*nk);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001153 }
1154}
1155
1156static void
1157com_select_member(c, n)
1158 struct compiling *c;
1159 node *n;
1160{
1161 com_addopname(c, LOAD_ATTR, n);
1162}
1163
1164static void
Guido van Rossum8861b741996-07-30 16:49:37 +00001165com_sliceobj(c, n)
1166 struct compiling *c;
1167 node *n;
1168{
1169 int i=0;
1170 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001171 node *ch;
1172
1173 /* first argument */
1174 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001175 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001176 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001177 i++;
1178 }
1179 else {
1180 com_node(c, CHILD(n,i));
1181 i++;
1182 REQ(CHILD(n,i),COLON);
1183 i++;
1184 }
1185 /* second argument */
1186 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1187 com_node(c, CHILD(n,i));
1188 i++;
1189 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001190 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001191 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001192 com_push(c, 1);
1193 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001194 /* remaining arguments */
1195 for (; i < NCH(n); i++) {
1196 ns++;
1197 ch=CHILD(n,i);
1198 REQ(ch, sliceop);
1199 if (NCH(ch) == 1) {
1200 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001201 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001202 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001203 }
1204 else
1205 com_node(c, CHILD(ch,1));
1206 }
1207 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001208 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001209}
1210
1211static void
1212com_subscript(c, n)
1213 struct compiling *c;
1214 node *n;
1215{
1216 node *ch;
1217 REQ(n, subscript);
1218 ch = CHILD(n,0);
1219 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001220 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001221 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001222 com_push(c, 1);
1223 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001224 else {
1225 /* check for slice */
1226 if ((TYPE(ch) == COLON || NCH(n) > 1))
1227 com_sliceobj(c, n);
1228 else {
1229 REQ(ch, test);
1230 com_node(c, ch);
1231 }
1232 }
1233}
1234
1235static void
1236com_subscriptlist(c, n, assigning)
1237 struct compiling *c;
1238 node *n;
1239 int assigning;
1240{
1241 int i, op;
1242 REQ(n, subscriptlist);
1243 /* Check to make backward compatible slice behavior for '[i:j]' */
1244 if (NCH(n) == 1) {
1245 node *sub = CHILD(n, 0); /* subscript */
1246 /* Make it is a simple slice.
Guido van Rossum8b993a91997-01-17 21:04:03 +00001247 Should have exactly one colon. */
Guido van Rossum8861b741996-07-30 16:49:37 +00001248 if ((TYPE(CHILD(sub, 0)) == COLON
1249 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
Guido van Rossum8b993a91997-01-17 21:04:03 +00001250 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1251 {
Guido van Rossum8861b741996-07-30 16:49:37 +00001252 if (assigning == OP_APPLY)
1253 op = SLICE;
1254 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001255 op = ((assigning == OP_ASSIGN) ?
1256 STORE_SLICE : DELETE_SLICE);
Guido van Rossum8861b741996-07-30 16:49:37 +00001257 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001258 if (op == STORE_SLICE)
1259 com_pop(c, 2);
1260 else if (op == DELETE_SLICE)
1261 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001262 return;
1263 }
1264 }
1265 /* Else normal subscriptlist. Compile each subscript. */
1266 for (i = 0; i < NCH(n); i += 2)
1267 com_subscript(c, CHILD(n, i));
1268 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001269 if (NCH(n) > 1) {
1270 i = (NCH(n)+1) / 2;
1271 com_addoparg(c, BUILD_TUPLE, i);
1272 com_pop(c, i-1);
1273 }
1274 if (assigning == OP_APPLY) {
Guido van Rossum8861b741996-07-30 16:49:37 +00001275 op = BINARY_SUBSCR;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001276 i = 1;
1277 }
1278 else if (assigning == OP_ASSIGN) {
1279 op = STORE_SUBSCR;
1280 i = 3;
1281 }
1282 else {
1283 op = DELETE_SUBSCR;
1284 i = 2;
1285 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001286 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001287 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001288}
1289
1290static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001291com_apply_trailer(c, n)
1292 struct compiling *c;
1293 node *n;
1294{
1295 REQ(n, trailer);
1296 switch (TYPE(CHILD(n, 0))) {
1297 case LPAR:
1298 com_call_function(c, CHILD(n, 1));
1299 break;
1300 case DOT:
1301 com_select_member(c, CHILD(n, 1));
1302 break;
1303 case LSQB:
Guido van Rossum8861b741996-07-30 16:49:37 +00001304 com_subscriptlist(c, CHILD(n, 1), OP_APPLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001305 break;
1306 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001307 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001308 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001309 }
1310}
1311
1312static void
Guido van Rossum50564e81996-01-12 01:13:16 +00001313com_power(c, n)
1314 struct compiling *c;
1315 node *n;
1316{
1317 int i;
1318 REQ(n, power);
1319 com_atom(c, CHILD(n, 0));
1320 for (i = 1; i < NCH(n); i++) {
1321 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1322 com_factor(c, CHILD(n, i+1));
1323 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001324 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001325 break;
1326 }
1327 else
1328 com_apply_trailer(c, CHILD(n, i));
1329 }
1330}
1331
1332static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001333com_factor(c, n)
1334 struct compiling *c;
1335 node *n;
1336{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001337 REQ(n, factor);
1338 if (TYPE(CHILD(n, 0)) == PLUS) {
1339 com_factor(c, CHILD(n, 1));
1340 com_addbyte(c, UNARY_POSITIVE);
1341 }
1342 else if (TYPE(CHILD(n, 0)) == MINUS) {
1343 com_factor(c, CHILD(n, 1));
1344 com_addbyte(c, UNARY_NEGATIVE);
1345 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001346 else if (TYPE(CHILD(n, 0)) == TILDE) {
1347 com_factor(c, CHILD(n, 1));
1348 com_addbyte(c, UNARY_INVERT);
1349 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001350 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001351 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001352 }
1353}
1354
1355static void
1356com_term(c, n)
1357 struct compiling *c;
1358 node *n;
1359{
1360 int i;
1361 int op;
1362 REQ(n, term);
1363 com_factor(c, CHILD(n, 0));
1364 for (i = 2; i < NCH(n); i += 2) {
1365 com_factor(c, CHILD(n, i));
1366 switch (TYPE(CHILD(n, i-1))) {
1367 case STAR:
1368 op = BINARY_MULTIPLY;
1369 break;
1370 case SLASH:
1371 op = BINARY_DIVIDE;
1372 break;
1373 case PERCENT:
1374 op = BINARY_MODULO;
1375 break;
1376 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001377 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001378 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001379 op = 255;
1380 }
1381 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001382 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001383 }
1384}
1385
1386static void
1387com_arith_expr(c, n)
1388 struct compiling *c;
1389 node *n;
1390{
1391 int i;
1392 int op;
1393 REQ(n, arith_expr);
1394 com_term(c, CHILD(n, 0));
1395 for (i = 2; i < NCH(n); i += 2) {
1396 com_term(c, CHILD(n, i));
1397 switch (TYPE(CHILD(n, i-1))) {
1398 case PLUS:
1399 op = BINARY_ADD;
1400 break;
1401 case MINUS:
1402 op = BINARY_SUBTRACT;
1403 break;
1404 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001405 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001406 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001407 op = 255;
1408 }
1409 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001410 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001411 }
1412}
1413
1414static void
1415com_shift_expr(c, n)
1416 struct compiling *c;
1417 node *n;
1418{
1419 int i;
1420 int op;
1421 REQ(n, shift_expr);
1422 com_arith_expr(c, CHILD(n, 0));
1423 for (i = 2; i < NCH(n); i += 2) {
1424 com_arith_expr(c, CHILD(n, i));
1425 switch (TYPE(CHILD(n, i-1))) {
1426 case LEFTSHIFT:
1427 op = BINARY_LSHIFT;
1428 break;
1429 case RIGHTSHIFT:
1430 op = BINARY_RSHIFT;
1431 break;
1432 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001433 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001434 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001435 op = 255;
1436 }
1437 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001438 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001439 }
1440}
1441
1442static void
1443com_and_expr(c, n)
1444 struct compiling *c;
1445 node *n;
1446{
1447 int i;
1448 int op;
1449 REQ(n, and_expr);
1450 com_shift_expr(c, CHILD(n, 0));
1451 for (i = 2; i < NCH(n); i += 2) {
1452 com_shift_expr(c, CHILD(n, i));
1453 if (TYPE(CHILD(n, i-1)) == AMPER) {
1454 op = BINARY_AND;
1455 }
1456 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001457 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001458 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001459 op = 255;
1460 }
1461 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001462 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001463 }
1464}
1465
1466static void
1467com_xor_expr(c, n)
1468 struct compiling *c;
1469 node *n;
1470{
1471 int i;
1472 int op;
1473 REQ(n, xor_expr);
1474 com_and_expr(c, CHILD(n, 0));
1475 for (i = 2; i < NCH(n); i += 2) {
1476 com_and_expr(c, CHILD(n, i));
1477 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1478 op = BINARY_XOR;
1479 }
1480 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001481 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001482 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001483 op = 255;
1484 }
1485 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001486 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001487 }
1488}
1489
1490static void
1491com_expr(c, n)
1492 struct compiling *c;
1493 node *n;
1494{
1495 int i;
1496 int op;
1497 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001498 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001499 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001500 com_xor_expr(c, CHILD(n, i));
1501 if (TYPE(CHILD(n, i-1)) == VBAR) {
1502 op = BINARY_OR;
1503 }
1504 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001505 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001506 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001507 op = 255;
1508 }
1509 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001510 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001511 }
1512}
1513
1514static enum cmp_op
1515cmp_type(n)
1516 node *n;
1517{
1518 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001519 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001520 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1521 if (NCH(n) == 1) {
1522 n = CHILD(n, 0);
1523 switch (TYPE(n)) {
1524 case LESS: return LT;
1525 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001526 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001527 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001528 case LESSEQUAL: return LE;
1529 case GREATEREQUAL: return GE;
1530 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001531 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1532 if (strcmp(STR(n), "is") == 0) return IS;
1533 }
1534 }
1535 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001536 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001537 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1538 return NOT_IN;
1539 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1540 return IS_NOT;
1541 }
1542 }
1543 return BAD;
1544}
1545
1546static void
1547com_comparison(c, n)
1548 struct compiling *c;
1549 node *n;
1550{
1551 int i;
1552 enum cmp_op op;
1553 int anchor;
1554 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1555 com_expr(c, CHILD(n, 0));
1556 if (NCH(n) == 1)
1557 return;
1558
1559 /****************************************************************
1560 The following code is generated for all but the last
1561 comparison in a chain:
1562
1563 label: on stack: opcode: jump to:
1564
1565 a <code to load b>
1566 a, b DUP_TOP
1567 a, b, b ROT_THREE
1568 b, a, b COMPARE_OP
1569 b, 0-or-1 JUMP_IF_FALSE L1
1570 b, 1 POP_TOP
1571 b
1572
1573 We are now ready to repeat this sequence for the next
1574 comparison in the chain.
1575
1576 For the last we generate:
1577
1578 b <code to load c>
1579 b, c COMPARE_OP
1580 0-or-1
1581
1582 If there were any jumps to L1 (i.e., there was more than one
1583 comparison), we generate:
1584
1585 0-or-1 JUMP_FORWARD L2
1586 L1: b, 0 ROT_TWO
1587 0, b POP_TOP
1588 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00001589 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001590 ****************************************************************/
1591
1592 anchor = 0;
1593
1594 for (i = 2; i < NCH(n); i += 2) {
1595 com_expr(c, CHILD(n, i));
1596 if (i+2 < NCH(n)) {
1597 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001598 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001599 com_addbyte(c, ROT_THREE);
1600 }
1601 op = cmp_type(CHILD(n, i-1));
1602 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001603 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001604 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001605 }
1606 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001607 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001608 if (i+2 < NCH(n)) {
1609 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1610 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001611 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001612 }
1613 }
1614
1615 if (anchor) {
1616 int anchor2 = 0;
1617 com_addfwref(c, JUMP_FORWARD, &anchor2);
1618 com_backpatch(c, anchor);
1619 com_addbyte(c, ROT_TWO);
1620 com_addbyte(c, POP_TOP);
1621 com_backpatch(c, anchor2);
1622 }
1623}
1624
1625static void
1626com_not_test(c, n)
1627 struct compiling *c;
1628 node *n;
1629{
1630 REQ(n, not_test); /* 'not' not_test | comparison */
1631 if (NCH(n) == 1) {
1632 com_comparison(c, CHILD(n, 0));
1633 }
1634 else {
1635 com_not_test(c, CHILD(n, 1));
1636 com_addbyte(c, UNARY_NOT);
1637 }
1638}
1639
1640static void
1641com_and_test(c, n)
1642 struct compiling *c;
1643 node *n;
1644{
1645 int i;
1646 int anchor;
1647 REQ(n, and_test); /* not_test ('and' not_test)* */
1648 anchor = 0;
1649 i = 0;
1650 for (;;) {
1651 com_not_test(c, CHILD(n, i));
1652 if ((i += 2) >= NCH(n))
1653 break;
1654 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1655 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001656 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001657 }
1658 if (anchor)
1659 com_backpatch(c, anchor);
1660}
1661
1662static void
1663com_test(c, n)
1664 struct compiling *c;
1665 node *n;
1666{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001667 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00001668 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001669 PyObject *v;
Guido van Rossum57531fe1993-11-30 14:57:42 +00001670 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001671 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001672 v = (PyObject *) icompile(CHILD(n, 0), c);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001673 if (v == NULL) {
1674 c->c_errors++;
1675 i = 255;
1676 }
1677 else {
1678 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001679 Py_DECREF(v);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001680 }
1681 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001682 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001683 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001684 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001685 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001686 else {
1687 int anchor = 0;
1688 int i = 0;
1689 for (;;) {
1690 com_and_test(c, CHILD(n, i));
1691 if ((i += 2) >= NCH(n))
1692 break;
1693 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1694 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001695 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001696 }
1697 if (anchor)
1698 com_backpatch(c, anchor);
1699 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001700}
1701
1702static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001703com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001704 struct compiling *c;
1705 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001706 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001707{
1708 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001709 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001710 com_node(c, CHILD(n, 0));
1711 }
1712 else {
1713 int i;
1714 int len;
1715 len = (NCH(n) + 1) / 2;
1716 for (i = 0; i < NCH(n); i += 2)
1717 com_node(c, CHILD(n, i));
1718 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001719 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001720 }
1721}
1722
1723
1724/* Begin of assignment compilation */
1725
Guido van Rossum79f25d91997-04-29 20:08:16 +00001726static void com_assign_name Py_PROTO((struct compiling *, node *, int));
1727static void com_assign Py_PROTO((struct compiling *, node *, int));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001728
1729static void
1730com_assign_attr(c, n, assigning)
1731 struct compiling *c;
1732 node *n;
1733 int assigning;
1734{
1735 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001736 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001737}
1738
1739static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001740com_assign_trailer(c, n, assigning)
1741 struct compiling *c;
1742 node *n;
1743 int assigning;
1744{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001745 REQ(n, trailer);
1746 switch (TYPE(CHILD(n, 0))) {
1747 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001748 com_error(c, PyExc_SyntaxError,
1749 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001750 break;
1751 case DOT: /* '.' NAME */
1752 com_assign_attr(c, CHILD(n, 1), assigning);
1753 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001754 case LSQB: /* '[' subscriptlist ']' */
1755 com_subscriptlist(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001756 break;
1757 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001758 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001759 }
1760}
1761
1762static void
1763com_assign_tuple(c, n, assigning)
1764 struct compiling *c;
1765 node *n;
1766 int assigning;
1767{
1768 int i;
1769 if (TYPE(n) != testlist)
1770 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001771 if (assigning) {
1772 i = (NCH(n)+1)/2;
1773 com_addoparg(c, UNPACK_TUPLE, i);
1774 com_push(c, i-1);
1775 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001776 for (i = 0; i < NCH(n); i += 2)
1777 com_assign(c, CHILD(n, i), assigning);
1778}
1779
1780static void
1781com_assign_list(c, n, assigning)
1782 struct compiling *c;
1783 node *n;
1784 int assigning;
1785{
1786 int i;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001787 if (assigning) {
1788 i = (NCH(n)+1)/2;
1789 com_addoparg(c, UNPACK_LIST, i);
1790 com_push(c, i-1);
1791 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001792 for (i = 0; i < NCH(n); i += 2)
1793 com_assign(c, CHILD(n, i), assigning);
1794}
1795
1796static void
1797com_assign_name(c, n, assigning)
1798 struct compiling *c;
1799 node *n;
1800 int assigning;
1801{
1802 REQ(n, NAME);
1803 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001804 if (assigning)
1805 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001806}
1807
1808static void
1809com_assign(c, n, assigning)
1810 struct compiling *c;
1811 node *n;
1812 int assigning;
1813{
1814 /* Loop to avoid trivial recursion */
1815 for (;;) {
1816 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001817
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001818 case exprlist:
1819 case testlist:
1820 if (NCH(n) > 1) {
1821 com_assign_tuple(c, n, assigning);
1822 return;
1823 }
1824 n = CHILD(n, 0);
1825 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001826
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001827 case test:
1828 case and_test:
1829 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001830 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001831 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001832 case xor_expr:
1833 case and_expr:
1834 case shift_expr:
1835 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001836 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00001837 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001838 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001839 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001840 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001841 return;
1842 }
1843 n = CHILD(n, 0);
1844 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001845
Guido van Rossum50564e81996-01-12 01:13:16 +00001846 case power: /* atom trailer* ('**' power)* */
1847/* ('+'|'-'|'~') factor | atom trailer* */
1848 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001849 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001850 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001851 return;
1852 }
Guido van Rossum50564e81996-01-12 01:13:16 +00001853 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001854 int i;
1855 com_node(c, CHILD(n, 0));
1856 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00001857 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001858 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001859 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00001860 return;
1861 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001862 com_apply_trailer(c, CHILD(n, i));
1863 } /* NB i is still alive */
1864 com_assign_trailer(c,
1865 CHILD(n, i), assigning);
1866 return;
1867 }
1868 n = CHILD(n, 0);
1869 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001870
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001871 case atom:
1872 switch (TYPE(CHILD(n, 0))) {
1873 case LPAR:
1874 n = CHILD(n, 1);
1875 if (TYPE(n) == RPAR) {
1876 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001877 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001878 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001879 return;
1880 }
1881 break;
1882 case LSQB:
1883 n = CHILD(n, 1);
1884 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001885 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001886 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001887 return;
1888 }
1889 com_assign_list(c, n, assigning);
1890 return;
1891 case NAME:
1892 com_assign_name(c, CHILD(n, 0), assigning);
1893 return;
1894 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001895 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001896 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001897 return;
1898 }
1899 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001900
1901 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001902 com_error(c, PyExc_SyntaxError,
1903 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001904 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001905
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001906 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001907 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001908 com_error(c, PyExc_SystemError,
1909 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001910 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001911
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001912 }
1913 }
1914}
Guido van Rossum7c531111997-03-11 18:42:21 +00001915
Guido van Rossum79f25d91997-04-29 20:08:16 +00001916/* Forward */ static node *get_rawdocstring Py_PROTO((node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001917
1918static void
1919com_expr_stmt(c, n)
1920 struct compiling *c;
1921 node *n;
1922{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001923 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001924 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001925 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001926 return;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001927 com_node(c, CHILD(n, NCH(n)-1));
1928 if (NCH(n) == 1) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001929 if (c->c_interactive)
1930 com_addbyte(c, PRINT_EXPR);
1931 else
1932 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001933 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001934 }
1935 else {
1936 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001937 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001938 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001939 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001940 com_push(c, 1);
1941 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001942 com_assign(c, CHILD(n, i), OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001943 }
1944 }
1945}
1946
1947static void
Guido van Rossum228d7f31997-04-02 05:24:36 +00001948com_assert_stmt(c, n)
1949 struct compiling *c;
1950 node *n;
1951{
1952 int a = 0, b = 0;
1953 int i;
1954 REQ(n, assert_stmt); /* 'assert' test [',' test] */
1955 /* Generate code like for
1956
1957 if __debug__:
1958 if not <test>:
1959 raise AssertionError [, <message>]
1960
1961 where <message> is the second test, if present.
1962 */
1963 if (Py_OptimizeFlag)
1964 return;
1965 com_addopnamestr(c, LOAD_GLOBAL, "__debug__");
1966 com_push(c, 1);
1967 com_addfwref(c, JUMP_IF_FALSE, &a);
1968 com_addbyte(c, POP_TOP);
1969 com_pop(c, 1);
1970 com_node(c, CHILD(n, 1));
1971 com_addfwref(c, JUMP_IF_TRUE, &b);
1972 com_addbyte(c, POP_TOP);
1973 com_pop(c, 1);
1974 /* Raise that exception! */
1975 com_addopnamestr(c, LOAD_GLOBAL, "AssertionError");
1976 com_push(c, 1);
1977 i = NCH(n)/2; /* Either 2 or 4 */
1978 if (i > 1)
1979 com_node(c, CHILD(n, 3));
1980 com_addoparg(c, RAISE_VARARGS, i);
1981 com_pop(c, i);
1982 /* The interpreter does not fall through */
1983 /* All jumps converge here */
1984 com_backpatch(c, a);
1985 com_backpatch(c, b);
1986 com_addbyte(c, POP_TOP);
1987}
1988
1989static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001990com_print_stmt(c, n)
1991 struct compiling *c;
1992 node *n;
1993{
1994 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001995 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
1996 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001997 com_node(c, CHILD(n, i));
1998 com_addbyte(c, PRINT_ITEM);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001999 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002000 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002001 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002002 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002003 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002004}
2005
2006static void
2007com_return_stmt(c, n)
2008 struct compiling *c;
2009 node *n;
2010{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002011 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002012 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002013 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002014 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002015 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002016 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002017 com_push(c, 1);
2018 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002019 else
2020 com_node(c, CHILD(n, 1));
2021 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002022 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002023}
2024
2025static void
2026com_raise_stmt(c, n)
2027 struct compiling *c;
2028 node *n;
2029{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002030 int i;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002031 REQ(n, raise_stmt); /* 'raise' test [',' test [',' test]] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002032 com_node(c, CHILD(n, 1));
Guido van Rossum681d79a1995-07-18 14:51:37 +00002033 if (NCH(n) > 3) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002034 com_node(c, CHILD(n, 3));
Guido van Rossum681d79a1995-07-18 14:51:37 +00002035 if (NCH(n) > 5)
2036 com_node(c, CHILD(n, 5));
Guido van Rossumf10570b1995-07-07 22:53:21 +00002037 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002038 i = NCH(n)/2;
2039 com_addoparg(c, RAISE_VARARGS, i);
2040 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002041}
2042
2043static void
2044com_import_stmt(c, n)
2045 struct compiling *c;
2046 node *n;
2047{
2048 int i;
2049 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002050 /* 'import' dotted_name (',' dotted_name)* |
2051 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002052 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002053 /* 'from' dotted_name 'import' ... */
2054 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002055 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002056 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002057 for (i = 3; i < NCH(n); i += 2)
2058 com_addopname(c, IMPORT_FROM, CHILD(n, i));
2059 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002060 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002061 }
2062 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002063 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002064 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002065 REQ(CHILD(n, i), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002066 com_addopname(c, IMPORT_NAME, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002067 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002068 com_addopname(c, STORE_NAME, CHILD(CHILD(n, i), 0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002069 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002070 }
2071 }
2072}
2073
2074static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00002075com_global_stmt(c, n)
2076 struct compiling *c;
2077 node *n;
2078{
2079 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002080 REQ(n, global_stmt);
2081 /* 'global' NAME (',' NAME)* */
2082 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002083 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002084#ifdef PRIVATE_NAME_MANGLING
2085 char buffer[256];
2086 if (s != NULL && s[0] == '_' && s[1] == '_' &&
2087 c->c_private != NULL &&
2088 com_mangle(c, s, buffer, (int)sizeof(buffer)))
2089 s = buffer;
2090#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +00002091 if (PyDict_GetItemString(c->c_locals, s) != NULL) {
2092 com_error(c, PyExc_SyntaxError,
2093 "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002094 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002095 else if (PyDict_SetItemString(c->c_globals, s, Py_None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002096 c->c_errors++;
2097 }
2098}
2099
Guido van Rossum681d79a1995-07-18 14:51:37 +00002100static int
2101com_newlocal_o(c, nameval)
2102 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002103 PyObject *nameval;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002104{
2105 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002106 PyObject *ival;
2107 if (PyList_Size(c->c_varnames) != c->c_nlocals) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002108 /* This is usually caused by an error on a previous call */
2109 if (c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002110 com_error(c, PyExc_SystemError,
2111 "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002112 }
2113 return 0;
2114 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002115 ival = PyInt_FromLong(i = c->c_nlocals++);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002116 if (ival == NULL)
2117 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002118 else if (PyDict_SetItem(c->c_locals, nameval, ival) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002119 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002120 else if (PyList_Append(c->c_varnames, nameval) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002121 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002122 Py_XDECREF(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002123 return i;
2124}
2125
2126static int
2127com_addlocal_o(c, nameval)
2128 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002129 PyObject *nameval;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002130{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002131 PyObject *ival = PyDict_GetItem(c->c_locals, nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002132 if (ival != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002133 return PyInt_AsLong(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002134 return com_newlocal_o(c, nameval);
2135}
2136
2137static int
2138com_newlocal(c, name)
2139 struct compiling *c;
2140 char *name;
2141{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002142 PyObject *nameval = PyString_InternFromString(name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002143 int i;
2144 if (nameval == NULL) {
2145 c->c_errors++;
2146 return 0;
2147 }
2148 i = com_newlocal_o(c, nameval);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002149 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002150 return i;
2151}
2152
Guido van Rossum8b993a91997-01-17 21:04:03 +00002153#ifdef SUPPORT_OBSOLETE_ACCESS
2154
Guido van Rossum25831651993-05-19 14:50:45 +00002155#define strequ(a, b) (strcmp((a), (b)) == 0)
2156
2157static void
2158com_access_stmt(c, n)
2159 struct compiling *c;
2160 node *n;
2161{
2162 int i, j, k, mode, imode;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002163 PyObject *vmode;
Guido van Rossum25831651993-05-19 14:50:45 +00002164 REQ(n, access_stmt);
2165 /* 'access' NAME (',' NAME)* ':' accesstype (',' accesstype)*
2166 accesstype: NAME+ */
2167
2168 /* Find where the colon is */
2169 i = 1;
2170 while (TYPE(CHILD(n,i-1)) != COLON)
2171 i += 1;
2172
2173 /* Calculate the mode mask */
2174 mode = 0;
2175 for (j = i; j < NCH(n); j += 2) {
Guido van Rossum81daa321993-05-20 14:24:46 +00002176 int r = 0, w = 0, p = 0;
2177 for (k = 0; k < NCH(CHILD(n,j)); k++) {
Guido van Rossum25831651993-05-19 14:50:45 +00002178 if (strequ(STR(CHILD(CHILD(n,j),k)), "public"))
2179 p = 0;
2180 else if (strequ(STR(CHILD(CHILD(n,j),k)), "protected"))
2181 p = 1;
2182 else if (strequ(STR(CHILD(CHILD(n,j),k)), "private"))
2183 p = 2;
2184 else if (strequ(STR(CHILD(CHILD(n,j),k)), "read"))
2185 r = 1;
2186 else if (strequ(STR(CHILD(CHILD(n,j),k)), "write"))
2187 w = 1;
2188 else /* XXX should make this an exception */
2189 fprintf(stderr, "bad access type %s\n",
2190 STR(CHILD(CHILD(n,j),k)));
2191 }
2192 if (r == 0 && w == 0)
Guido van Rossum81daa321993-05-20 14:24:46 +00002193 r = w = 1;
Guido van Rossum25831651993-05-19 14:50:45 +00002194 if (p == 0) {
2195 if (r == 1) mode |= AC_R_PUBLIC;
2196 if (w == 1) mode |= AC_W_PUBLIC;
2197 } else if (p == 1) {
2198 if (r == 1) mode |= AC_R_PROTECTED;
2199 if (w == 1) mode |= AC_W_PROTECTED;
2200 } else {
2201 if (r == 1) mode |= AC_R_PRIVATE;
2202 if (w == 1) mode |= AC_W_PRIVATE;
2203 }
2204 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002205 vmode = PyInt_FromLong((long)mode);
Guido van Rossum25831651993-05-19 14:50:45 +00002206 imode = com_addconst(c, vmode);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002207 Py_XDECREF(vmode);
Guido van Rossum25831651993-05-19 14:50:45 +00002208 for (i = 1; TYPE(CHILD(n,i-1)) != COLON; i+=2) {
2209 com_addoparg(c, LOAD_CONST, imode);
2210 com_addopname(c, ACCESS_MODE, CHILD(n, i));
2211 }
2212}
Guido van Rossum0dfcf751996-08-12 22:00:53 +00002213#endif
Guido van Rossum25831651993-05-19 14:50:45 +00002214
Guido van Rossumc5e96291991-12-10 13:53:51 +00002215static void
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002216com_exec_stmt(c, n)
2217 struct compiling *c;
2218 node *n;
2219{
2220 REQ(n, exec_stmt);
2221 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2222 com_node(c, CHILD(n, 1));
2223 if (NCH(n) >= 4)
2224 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002225 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002226 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002227 com_push(c, 1);
2228 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002229 if (NCH(n) >= 6)
2230 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002231 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002232 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002233 com_push(c, 1);
2234 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002235 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002236 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002237}
2238
Guido van Rossum7c531111997-03-11 18:42:21 +00002239static int
2240is_constant_false(c, n)
2241 struct compiling *c;
2242 node *n;
2243{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002244 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002245 int i;
2246
2247 /* Label to avoid tail recursion */
2248 next:
2249 switch (TYPE(n)) {
2250
2251 case suite:
2252 if (NCH(n) == 1) {
2253 n = CHILD(n, 0);
2254 goto next;
2255 }
2256 /* Fall through */
2257 case file_input:
2258 for (i = 0; i < NCH(n); i++) {
2259 node *ch = CHILD(n, i);
2260 if (TYPE(ch) == stmt) {
2261 n = ch;
2262 goto next;
2263 }
2264 }
2265 break;
2266
2267 case stmt:
2268 case simple_stmt:
2269 case small_stmt:
2270 n = CHILD(n, 0);
2271 goto next;
2272
2273 case expr_stmt:
2274 case testlist:
2275 case test:
2276 case and_test:
2277 case not_test:
2278 case comparison:
2279 case expr:
2280 case xor_expr:
2281 case and_expr:
2282 case shift_expr:
2283 case arith_expr:
2284 case term:
2285 case factor:
2286 case power:
2287 case atom:
2288 if (NCH(n) == 1) {
2289 n = CHILD(n, 0);
2290 goto next;
2291 }
2292 break;
2293
2294 case NAME:
2295 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2296 return 1;
2297 break;
2298
2299 case NUMBER:
2300 v = parsenumber(c, STR(n));
2301 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002302 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002303 break;
2304 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002305 i = PyObject_IsTrue(v);
2306 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002307 return i == 0;
2308
2309 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002310 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002311 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002312 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002313 break;
2314 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002315 i = PyObject_IsTrue(v);
2316 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002317 return i == 0;
2318
2319 }
2320 return 0;
2321}
2322
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002323static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002324com_if_stmt(c, n)
2325 struct compiling *c;
2326 node *n;
2327{
2328 int i;
2329 int anchor = 0;
2330 REQ(n, if_stmt);
2331 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2332 for (i = 0; i+3 < NCH(n); i+=4) {
2333 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002334 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002335 if (is_constant_false(c, ch))
2336 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002337 if (i > 0)
2338 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002339 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002340 com_addfwref(c, JUMP_IF_FALSE, &a);
2341 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002342 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002343 com_node(c, CHILD(n, i+3));
2344 com_addfwref(c, JUMP_FORWARD, &anchor);
2345 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002346 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002347 com_addbyte(c, POP_TOP);
2348 }
2349 if (i+2 < NCH(n))
2350 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002351 if (anchor)
2352 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002353}
2354
2355static void
2356com_while_stmt(c, n)
2357 struct compiling *c;
2358 node *n;
2359{
2360 int break_anchor = 0;
2361 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002362 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002363 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2364 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002365 block_push(c, SETUP_LOOP);
2366 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002367 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002368 com_node(c, CHILD(n, 1));
2369 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2370 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002371 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002372 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002373 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002374 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002375 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2376 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002377 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002378 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002379 com_addbyte(c, POP_TOP);
2380 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002381 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002382 if (NCH(n) > 4)
2383 com_node(c, CHILD(n, 6));
2384 com_backpatch(c, break_anchor);
2385}
2386
2387static void
2388com_for_stmt(c, n)
2389 struct compiling *c;
2390 node *n;
2391{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002392 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002393 int break_anchor = 0;
2394 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002395 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002396 REQ(n, for_stmt);
2397 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2398 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002399 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002400 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002401 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002402 if (v == NULL)
2403 c->c_errors++;
2404 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002405 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002406 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002407 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002408 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002409 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002410 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002411 com_assign(c, CHILD(n, 1), OP_ASSIGN);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002412 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002413 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002414 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002415 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2416 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002417 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002418 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002419 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002420 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002421 if (NCH(n) > 8)
2422 com_node(c, CHILD(n, 8));
2423 com_backpatch(c, break_anchor);
2424}
2425
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002426/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002427
2428 SETUP_FINALLY L
2429 <code for S>
2430 POP_BLOCK
2431 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002432 L: <code for Sf>
2433 END_FINALLY
2434
2435 The special instructions use the block stack. Each block
2436 stack entry contains the instruction that created it (here
2437 SETUP_FINALLY), the level of the value stack at the time the
2438 block stack entry was created, and a label (here L).
2439
2440 SETUP_FINALLY:
2441 Pushes the current value stack level and the label
2442 onto the block stack.
2443 POP_BLOCK:
2444 Pops en entry from the block stack, and pops the value
2445 stack until its level is the same as indicated on the
2446 block stack. (The label is ignored.)
2447 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002448 Pops a variable number of entries from the *value* stack
2449 and re-raises the exception they specify. The number of
2450 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002451
2452 The block stack is unwound when an exception is raised:
2453 when a SETUP_FINALLY entry is found, the exception is pushed
2454 onto the value stack (and the exception condition is cleared),
2455 and the interpreter jumps to the label gotten from the block
2456 stack.
2457
2458 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002459 (The contents of the value stack is shown in [], with the top
2460 at the right; 'tb' is trace-back info, 'val' the exception's
2461 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002462
2463 Value stack Label Instruction Argument
2464 [] SETUP_EXCEPT L1
2465 [] <code for S>
2466 [] POP_BLOCK
2467 [] JUMP_FORWARD L0
2468
Guido van Rossum3f5da241990-12-20 15:06:42 +00002469 [tb, val, exc] L1: DUP )
2470 [tb, val, exc, exc] <evaluate E1> )
2471 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2472 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2473 [tb, val, exc, 1] POP )
2474 [tb, val, exc] POP
2475 [tb, val] <assign to V1> (or POP if no V1)
2476 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002477 [] <code for S1>
2478 JUMP_FORWARD L0
2479
Guido van Rossum3f5da241990-12-20 15:06:42 +00002480 [tb, val, exc, 0] L2: POP
2481 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002482 .............................etc.......................
2483
Guido van Rossum3f5da241990-12-20 15:06:42 +00002484 [tb, val, exc, 0] Ln+1: POP
2485 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002486
2487 [] L0: <next statement>
2488
2489 Of course, parts are not generated if Vi or Ei is not present.
2490*/
2491
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002492static void
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002493com_try_except(c, n)
2494 struct compiling *c;
2495 node *n;
2496{
2497 int except_anchor = 0;
2498 int end_anchor = 0;
2499 int else_anchor = 0;
2500 int i;
2501 node *ch;
2502
2503 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2504 block_push(c, SETUP_EXCEPT);
2505 com_node(c, CHILD(n, 2));
2506 com_addbyte(c, POP_BLOCK);
2507 block_pop(c, SETUP_EXCEPT);
2508 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2509 com_backpatch(c, except_anchor);
2510 for (i = 3;
2511 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2512 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002513 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002514 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002515 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002516 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002517 break;
2518 }
2519 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002520 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002521 com_addoparg(c, SET_LINENO, ch->n_lineno);
2522 if (NCH(ch) > 1) {
2523 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002524 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002525 com_node(c, CHILD(ch, 1));
2526 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002527 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002528 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2529 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002530 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002531 }
2532 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002533 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002534 if (NCH(ch) > 3)
Guido van Rossum8861b741996-07-30 16:49:37 +00002535 com_assign(c, CHILD(ch, 3), OP_ASSIGN);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002536 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002537 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002538 com_pop(c, 1);
2539 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002540 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002541 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002542 com_node(c, CHILD(n, i+2));
2543 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2544 if (except_anchor) {
2545 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002546 /* We come in with [tb, val, exc, 0] on the
2547 stack; one pop and it's the same as
2548 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002549 com_addbyte(c, POP_TOP);
2550 }
2551 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002552 /* We actually come in here with [tb, val, exc] but the
2553 END_FINALLY will zap those and jump around.
2554 The c_stacklevel does not reflect them so we need not pop
2555 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002556 com_addbyte(c, END_FINALLY);
2557 com_backpatch(c, else_anchor);
2558 if (i < NCH(n))
2559 com_node(c, CHILD(n, i+2));
2560 com_backpatch(c, end_anchor);
2561}
2562
2563static void
2564com_try_finally(c, n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002565 struct compiling *c;
2566 node *n;
2567{
2568 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002569 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002570
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002571 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2572 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002573 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002574 com_addbyte(c, POP_BLOCK);
2575 block_pop(c, SETUP_FINALLY);
2576 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002577 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002578 /* While the generated code pushes only one item,
2579 the try-finally handling can enter here with
2580 up to three items. OK, here are the details:
2581 3 for an exception, 2 for RETURN, 1 for BREAK. */
2582 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002583 com_backpatch(c, finally_anchor);
2584 ch = CHILD(n, NCH(n)-1);
2585 com_addoparg(c, SET_LINENO, ch->n_lineno);
2586 com_node(c, ch);
2587 com_addbyte(c, END_FINALLY);
2588 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002589 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002590}
2591
2592static void
2593com_try_stmt(c, n)
2594 struct compiling *c;
2595 node *n;
2596{
2597 REQ(n, try_stmt);
2598 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2599 | 'try' ':' suite 'finally' ':' suite */
2600 if (TYPE(CHILD(n, 3)) != except_clause)
2601 com_try_finally(c, n);
2602 else
2603 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002604}
2605
Guido van Rossum8b993a91997-01-17 21:04:03 +00002606static node *
2607get_rawdocstring(n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002608 node *n;
2609{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002610 int i;
2611
Guido van Rossum8b993a91997-01-17 21:04:03 +00002612 /* Label to avoid tail recursion */
2613 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002614 switch (TYPE(n)) {
2615
2616 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002617 if (NCH(n) == 1) {
2618 n = CHILD(n, 0);
2619 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002620 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002621 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002622 case file_input:
2623 for (i = 0; i < NCH(n); i++) {
2624 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002625 if (TYPE(ch) == stmt) {
2626 n = ch;
2627 goto next;
2628 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002629 }
2630 break;
2631
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002632 case stmt:
2633 case simple_stmt:
2634 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002635 n = CHILD(n, 0);
2636 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002637
2638 case expr_stmt:
2639 case testlist:
2640 case test:
2641 case and_test:
2642 case not_test:
2643 case comparison:
2644 case expr:
2645 case xor_expr:
2646 case and_expr:
2647 case shift_expr:
2648 case arith_expr:
2649 case term:
2650 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002651 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002652 if (NCH(n) == 1) {
2653 n = CHILD(n, 0);
2654 goto next;
2655 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002656 break;
2657
2658 case atom:
2659 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002660 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002661 break;
2662
2663 }
2664 return NULL;
2665}
2666
Guido van Rossum79f25d91997-04-29 20:08:16 +00002667static PyObject *
Guido van Rossum8b993a91997-01-17 21:04:03 +00002668get_docstring(n)
2669 node *n;
2670{
2671 n = get_rawdocstring(n);
2672 if (n == NULL)
2673 return NULL;
2674 return parsestrplus(n);
2675}
2676
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002677static void
2678com_suite(c, n)
2679 struct compiling *c;
2680 node *n;
2681{
2682 REQ(n, suite);
2683 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2684 if (NCH(n) == 1) {
2685 com_node(c, CHILD(n, 0));
2686 }
2687 else {
2688 int i;
2689 for (i = 0; i < NCH(n); i++) {
2690 node *ch = CHILD(n, i);
2691 if (TYPE(ch) == stmt)
2692 com_node(c, ch);
2693 }
2694 }
2695}
2696
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002697/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002698static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002699com_continue_stmt(c, n)
2700 struct compiling *c;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002701 node *n; /* Not used, but passed for consistency */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002702{
2703 int i = c->c_nblocks;
2704 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2705 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2706 }
2707 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002708 com_error(c, PyExc_SyntaxError,
2709 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002710 }
2711 /* XXX Could allow it inside a 'finally' clause
2712 XXX if we could pop the exception still on the stack */
2713}
2714
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002715static int
Guido van Rossum681d79a1995-07-18 14:51:37 +00002716com_argdefs(c, n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002717 struct compiling *c;
2718 node *n;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002719{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002720 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002721 if (TYPE(n) == lambdef) {
2722 /* lambdef: 'lambda' [varargslist] ':' test */
2723 n = CHILD(n, 1);
2724 }
2725 else {
2726 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2727 n = CHILD(n, 2);
2728 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2729 n = CHILD(n, 1);
2730 }
2731 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002732 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002733 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002734 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002735 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2736 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002737 nargs = 0;
2738 ndefs = 0;
2739 for (i = 0; i < nch; i++) {
2740 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002741 if (TYPE(CHILD(n, i)) == STAR ||
2742 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002743 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002744 nargs++;
2745 i++;
2746 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002747 t = RPAR; /* Anything except EQUAL or COMMA */
2748 else
2749 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002750 if (t == EQUAL) {
2751 i++;
2752 ndefs++;
2753 com_node(c, CHILD(n, i));
2754 i++;
2755 if (i >= nch)
2756 break;
2757 t = TYPE(CHILD(n, i));
2758 }
2759 else {
2760 /* Treat "(a=1, b)" as "(a=1, b=None)" */
2761 if (ndefs) {
2762 com_addoparg(c, LOAD_CONST,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002763 com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002764 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002765 ndefs++;
2766 }
2767 }
2768 if (t != COMMA)
2769 break;
2770 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002771 return ndefs;
2772}
2773
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002774static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002775com_funcdef(c, n)
2776 struct compiling *c;
2777 node *n;
2778{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002779 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002780 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002781 v = (PyObject *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002782 if (v == NULL)
2783 c->c_errors++;
2784 else {
2785 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002786 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002787 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002788 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002789 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002790 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002791 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002792 com_pop(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002793 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002794 }
2795}
2796
2797static void
Guido van Rossum25831651993-05-19 14:50:45 +00002798com_bases(c, n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002799 struct compiling *c;
2800 node *n;
2801{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002802 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002803 REQ(n, testlist);
2804 /* testlist: test (',' test)* [','] */
2805 for (i = 0; i < NCH(n); i += 2)
2806 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002807 i = (NCH(n)+1) / 2;
2808 com_addoparg(c, BUILD_TUPLE, i);
2809 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00002810}
2811
2812static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002813com_classdef(c, n)
2814 struct compiling *c;
2815 node *n;
2816{
Guido van Rossum25831651993-05-19 14:50:45 +00002817 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002818 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002819 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002820 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00002821 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00002822 c->c_errors++;
2823 return;
2824 }
2825 /* Push the class name on the stack */
2826 i = com_addconst(c, v);
2827 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002828 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002829 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00002830 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002831 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00002832 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002833 com_push(c, 1);
2834 }
Guido van Rossum25831651993-05-19 14:50:45 +00002835 else
2836 com_bases(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002837 v = (PyObject *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002838 if (v == NULL)
2839 c->c_errors++;
2840 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002841 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002842 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002843 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002844 com_addoparg(c, MAKE_FUNCTION, 0);
2845 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002846 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002847 com_pop(c, 2);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002848 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002849 Py_DECREF(v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002850 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002851}
2852
2853static void
2854com_node(c, n)
2855 struct compiling *c;
2856 node *n;
2857{
2858 switch (TYPE(n)) {
2859
2860 /* Definition nodes */
2861
2862 case funcdef:
2863 com_funcdef(c, n);
2864 break;
2865 case classdef:
2866 com_classdef(c, n);
2867 break;
2868
2869 /* Trivial parse tree nodes */
2870
2871 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002872 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002873 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002874 com_node(c, CHILD(n, 0));
2875 break;
2876
2877 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002878 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2879 com_addoparg(c, SET_LINENO, n->n_lineno);
2880 {
2881 int i;
2882 for (i = 0; i < NCH(n)-1; i += 2)
2883 com_node(c, CHILD(n, i));
2884 }
2885 break;
2886
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002887 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002888 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002889 com_node(c, CHILD(n, 0));
2890 break;
2891
2892 /* Statement nodes */
2893
2894 case expr_stmt:
2895 com_expr_stmt(c, n);
2896 break;
2897 case print_stmt:
2898 com_print_stmt(c, n);
2899 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002900 case del_stmt: /* 'del' exprlist */
Guido van Rossum8861b741996-07-30 16:49:37 +00002901 com_assign(c, CHILD(n, 1), OP_DELETE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002902 break;
2903 case pass_stmt:
2904 break;
2905 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002906 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002907 com_error(c, PyExc_SyntaxError,
2908 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002909 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002910 com_addbyte(c, BREAK_LOOP);
2911 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002912 case continue_stmt:
2913 com_continue_stmt(c, n);
2914 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002915 case return_stmt:
2916 com_return_stmt(c, n);
2917 break;
2918 case raise_stmt:
2919 com_raise_stmt(c, n);
2920 break;
2921 case import_stmt:
2922 com_import_stmt(c, n);
2923 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002924 case global_stmt:
2925 com_global_stmt(c, n);
2926 break;
Guido van Rossum0dfcf751996-08-12 22:00:53 +00002927#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +00002928 case access_stmt:
2929 com_access_stmt(c, n);
2930 break;
Guido van Rossum0dfcf751996-08-12 22:00:53 +00002931#endif
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002932 case exec_stmt:
2933 com_exec_stmt(c, n);
2934 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002935 case assert_stmt:
2936 com_assert_stmt(c, n);
2937 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002938 case if_stmt:
2939 com_if_stmt(c, n);
2940 break;
2941 case while_stmt:
2942 com_while_stmt(c, n);
2943 break;
2944 case for_stmt:
2945 com_for_stmt(c, n);
2946 break;
2947 case try_stmt:
2948 com_try_stmt(c, n);
2949 break;
2950 case suite:
2951 com_suite(c, n);
2952 break;
2953
2954 /* Expression nodes */
2955
2956 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002957 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002958 break;
2959 case test:
2960 com_test(c, n);
2961 break;
2962 case and_test:
2963 com_and_test(c, n);
2964 break;
2965 case not_test:
2966 com_not_test(c, n);
2967 break;
2968 case comparison:
2969 com_comparison(c, n);
2970 break;
2971 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002972 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002973 break;
2974 case expr:
2975 com_expr(c, n);
2976 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002977 case xor_expr:
2978 com_xor_expr(c, n);
2979 break;
2980 case and_expr:
2981 com_and_expr(c, n);
2982 break;
2983 case shift_expr:
2984 com_shift_expr(c, n);
2985 break;
2986 case arith_expr:
2987 com_arith_expr(c, n);
2988 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002989 case term:
2990 com_term(c, n);
2991 break;
2992 case factor:
2993 com_factor(c, n);
2994 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00002995 case power:
2996 com_power(c, n);
2997 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002998 case atom:
2999 com_atom(c, n);
3000 break;
3001
3002 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003003 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003004 com_error(c, PyExc_SystemError,
3005 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003006 }
3007}
3008
Guido van Rossum79f25d91997-04-29 20:08:16 +00003009static void com_fplist Py_PROTO((struct compiling *, node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003010
3011static void
3012com_fpdef(c, n)
3013 struct compiling *c;
3014 node *n;
3015{
3016 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3017 if (TYPE(CHILD(n, 0)) == LPAR)
3018 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003019 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003020 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003021 com_pop(c, 1);
3022 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003023}
3024
3025static void
3026com_fplist(c, n)
3027 struct compiling *c;
3028 node *n;
3029{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003030 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003031 if (NCH(n) == 1) {
3032 com_fpdef(c, CHILD(n, 0));
3033 }
3034 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003035 int i = (NCH(n)+1)/2;
3036 com_addoparg(c, UNPACK_TUPLE, i);
3037 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003038 for (i = 0; i < NCH(n); i += 2)
3039 com_fpdef(c, CHILD(n, i));
3040 }
3041}
3042
3043static void
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003044com_arglist(c, n)
3045 struct compiling *c;
3046 node *n;
3047{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003048 int nch, i;
3049 int complex = 0;
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003050 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003051 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003052 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003053 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003054 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003055 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003056 node *ch = CHILD(n, i);
3057 node *fp;
3058 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00003059 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003060 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003061 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3062 fp = CHILD(ch, 0);
3063 if (TYPE(fp) == NAME)
3064 name = STR(fp);
3065 else {
3066 name = "";
Guido van Rossum530956d1996-07-21 02:27:43 +00003067 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003068 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003069 com_newlocal(c, name);
3070 c->c_argcount++;
3071 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003072 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003073 ch = CHILD(n, i);
3074 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003075 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003076 else
3077 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003078 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003079 /* Handle *arguments */
3080 if (i < nch) {
3081 node *ch;
3082 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003083 if (TYPE(ch) != DOUBLESTAR) {
3084 REQ(ch, STAR);
3085 ch = CHILD(n, i+1);
3086 if (TYPE(ch) == NAME) {
3087 c->c_flags |= CO_VARARGS;
3088 i += 3;
3089 com_newlocal(c, STR(ch));
3090 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003091 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003092 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003093 /* Handle **keywords */
3094 if (i < nch) {
3095 node *ch;
3096 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003097 if (TYPE(ch) != DOUBLESTAR) {
3098 REQ(ch, STAR);
3099 ch = CHILD(n, i+1);
3100 REQ(ch, STAR);
3101 ch = CHILD(n, i+2);
3102 }
3103 else
3104 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003105 REQ(ch, NAME);
3106 c->c_flags |= CO_VARKEYWORDS;
3107 com_newlocal(c, STR(ch));
3108 }
3109 if (complex) {
3110 /* Generate code for complex arguments only after
3111 having counted the simple arguments */
3112 int ilocal = 0;
3113 for (i = 0; i < nch; i++) {
3114 node *ch = CHILD(n, i);
3115 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003116 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003117 break;
3118 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3119 fp = CHILD(ch, 0);
3120 if (TYPE(fp) != NAME) {
3121 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003122 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003123 com_fpdef(c, ch);
3124 }
3125 ilocal++;
3126 if (++i >= nch)
3127 break;
3128 ch = CHILD(n, i);
3129 if (TYPE(ch) == EQUAL)
3130 i += 2;
3131 else
3132 REQ(ch, COMMA);
3133 }
3134 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003135}
3136
3137static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003138com_file_input(c, n)
3139 struct compiling *c;
3140 node *n;
3141{
3142 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003143 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003144 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003145 doc = get_docstring(n);
3146 if (doc != NULL) {
3147 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003148 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003149 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003150 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003151 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003152 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003153 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003154 for (i = 0; i < NCH(n); i++) {
3155 node *ch = CHILD(n, i);
3156 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3157 com_node(c, ch);
3158 }
3159}
3160
3161/* Top-level compile-node interface */
3162
3163static void
3164compile_funcdef(c, n)
3165 struct compiling *c;
3166 node *n;
3167{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003168 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003169 node *ch;
3170 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003171 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003172 doc = get_docstring(CHILD(n, 4));
3173 if (doc != NULL) {
3174 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003175 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003176 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003177 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003178 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003179 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3180 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003181 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003182 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003183 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003184 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003185 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003186 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003187 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003188 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003189 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003190}
3191
3192static void
Guido van Rossum590baa41993-11-30 13:40:46 +00003193compile_lambdef(c, n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003194 struct compiling *c;
3195 node *n;
3196{
Guido van Rossum590baa41993-11-30 13:40:46 +00003197 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003198 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003199 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003200
3201 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003202 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003203 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003204 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003205 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003206 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003207 else
3208 ch = CHILD(n, 2);
3209 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003210 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003211 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003212}
3213
3214static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003215compile_classdef(c, n)
3216 struct compiling *c;
3217 node *n;
3218{
3219 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003220 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003221 REQ(n, classdef);
3222 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3223 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003224#ifdef PRIVATE_NAME_MANGLING
3225 c->c_private = c->c_name;
3226#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003227 ch = CHILD(n, NCH(n)-1); /* The suite */
3228 doc = get_docstring(ch);
3229 if (doc != NULL) {
3230 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003231 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003232 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003233 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003234 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003235 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003236 }
3237 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003238 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003239 com_node(c, ch);
3240 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003241 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003242 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003243 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003244}
3245
3246static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003247compile_node(c, n)
3248 struct compiling *c;
3249 node *n;
3250{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003251 com_addoparg(c, SET_LINENO, n->n_lineno);
3252
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003253 switch (TYPE(n)) {
3254
Guido van Rossum4c417781991-01-21 16:09:22 +00003255 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003256 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003257 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003258 n = CHILD(n, 0);
3259 if (TYPE(n) != NEWLINE)
3260 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003261 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003262 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003263 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003264 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003265 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003266 break;
3267
Guido van Rossum4c417781991-01-21 16:09:22 +00003268 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003269 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003270 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003271 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003272 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003273 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003274 break;
3275
Guido van Rossum590baa41993-11-30 13:40:46 +00003276 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003277 com_node(c, CHILD(n, 0));
3278 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003279 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003280 break;
3281
Guido van Rossum590baa41993-11-30 13:40:46 +00003282 case lambdef: /* anonymous function definition */
3283 compile_lambdef(c, n);
3284 break;
3285
Guido van Rossum4c417781991-01-21 16:09:22 +00003286 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003287 compile_funcdef(c, n);
3288 break;
3289
Guido van Rossum4c417781991-01-21 16:09:22 +00003290 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003291 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003292 break;
3293
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003294 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003295 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003296 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003297 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003298 }
3299}
3300
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003301/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00003302
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003303 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
3304 instructions that refer to local variables with LOAD_FAST etc.
3305 The latter instructions are much faster because they don't need to
3306 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003307
Guido van Rossum681d79a1995-07-18 14:51:37 +00003308 To find all local variables, we check all STORE_NAME, IMPORT_FROM
3309 and DELETE_NAME instructions. This yields all local variables,
3310 function definitions, class definitions and import statements.
3311 Argument names have already been entered into the list by the
3312 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003313
3314 All remaining LOAD_NAME instructions must refer to non-local (global
3315 or builtin) variables, so are replaced by LOAD_GLOBAL.
3316
3317 There are two problems: 'from foo import *' and 'exec' may introduce
3318 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00003319 case, we can still optimize bona fide locals (since those
3320 statements will be surrounded by fast_2_locals() and
3321 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003322
Guido van Rossum681d79a1995-07-18 14:51:37 +00003323 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00003324
3325static void
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003326optimize(c)
3327 struct compiling *c;
Guido van Rossum282914b1991-04-04 10:42:56 +00003328{
Guido van Rossum0a697f61991-04-16 08:39:12 +00003329 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00003330 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00003331 int oparg = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003332 PyObject *name;
3333 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003334
Guido van Rossum282914b1991-04-04 10:42:56 +00003335#define NEXTOP() (*next_instr++)
3336#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossum79f25d91997-04-29 20:08:16 +00003337#define GETITEM(v, i) (PyList_GetItem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003338#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
3339
Guido van Rossum79f25d91997-04-29 20:08:16 +00003340 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003341
3342 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00003343
Guido van Rossum79f25d91997-04-29 20:08:16 +00003344 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003345 for (;;) {
3346 opcode = NEXTOP();
3347 if (opcode == STOP_CODE)
3348 break;
3349 if (HAS_ARG(opcode))
3350 oparg = NEXTARG();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003351 switch (opcode) {
3352 case STORE_NAME:
3353 case DELETE_NAME:
3354 case IMPORT_FROM:
3355 com_addlocal_o(c, GETNAMEOBJ(oparg));
3356 break;
3357 case EXEC_STMT:
3358 c->c_flags &= ~CO_OPTIMIZED;
3359 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00003360 }
3361 }
3362
Guido van Rossum79f25d91997-04-29 20:08:16 +00003363 if (PyDict_GetItemString(c->c_locals, "*") != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003364 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003365
Guido van Rossum79f25d91997-04-29 20:08:16 +00003366 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003367 for (;;) {
3368 cur_instr = next_instr;
3369 opcode = NEXTOP();
3370 if (opcode == STOP_CODE)
3371 break;
3372 if (HAS_ARG(opcode))
3373 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003374 if (opcode == LOAD_NAME ||
3375 opcode == STORE_NAME ||
3376 opcode == DELETE_NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003377 PyObject *v;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003378 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00003379 name = GETNAMEOBJ(oparg);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003380 v = PyDict_GetItem(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003381 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003382 PyErr_Clear();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003383 if (opcode == LOAD_NAME &&
3384 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003385 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003386 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00003387 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003388 i = PyInt_AsLong(v);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003389 switch (opcode) {
3390 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
3391 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
3392 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
3393 }
3394 cur_instr[1] = i & 0xff;
3395 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00003396 }
3397 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003398
Guido van Rossum681d79a1995-07-18 14:51:37 +00003399 if (c->c_errors == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00003400 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00003401}
3402
Guido van Rossum79f25d91997-04-29 20:08:16 +00003403PyCodeObject *
3404PyNode_Compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003405 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003406 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003407{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003408 return jcompile(n, filename, NULL);
3409}
3410
Guido van Rossum79f25d91997-04-29 20:08:16 +00003411static PyCodeObject *
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003412icompile(n, base)
3413 node *n;
3414 struct compiling *base;
3415{
3416 return jcompile(n, base->c_filename, base);
3417}
3418
Guido van Rossum79f25d91997-04-29 20:08:16 +00003419static PyCodeObject *
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003420jcompile(n, filename, base)
3421 node *n;
3422 char *filename;
3423 struct compiling *base;
3424{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003425 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003426 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003427 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003428 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003429#ifdef PRIVATE_NAME_MANGLING
3430 if (base)
3431 sc.c_private = base->c_private;
3432 else
3433 sc.c_private = NULL;
3434#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003435 compile_node(&sc, n);
3436 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003437 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003438 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003439 sc.c_flags |= CO_NEWLOCALS;
3440 }
3441 else if (TYPE(n) == classdef)
3442 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00003443 co = NULL;
3444 if (sc.c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003445 PyObject *consts, *names, *varnames, *filename, *name;
3446 consts = PyList_AsTuple(sc.c_consts);
3447 names = PyList_AsTuple(sc.c_names);
3448 varnames = PyList_AsTuple(sc.c_varnames);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003449 filename = PyString_InternFromString(sc.c_filename);
3450 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003451 if (!PyErr_Occurred())
3452 co = PyCode_New(sc.c_argcount,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003453 sc.c_nlocals,
Guido van Rossum8b993a91997-01-17 21:04:03 +00003454 sc.c_maxstacklevel,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003455 sc.c_flags,
3456 sc.c_code,
3457 consts,
3458 names,
3459 varnames,
3460 filename,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003461 name,
3462 sc.c_firstlineno,
3463 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003464 Py_XDECREF(consts);
3465 Py_XDECREF(names);
3466 Py_XDECREF(varnames);
3467 Py_XDECREF(filename);
3468 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003469 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003470 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003471 return co;
3472}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003473
3474int
3475PyCode_Addr2Line(co, addrq)
3476 PyCodeObject *co;
3477 int addrq;
3478{
3479 int size = PyString_Size(co->co_lnotab) / 2;
3480 char *p = PyString_AsString(co->co_lnotab);
3481 int line = co->co_firstlineno;
3482 int addr = 0;
3483 while (--size >= 0) {
3484 addr += *p++;
3485 if (addr > addrq)
3486 break;
3487 line += *p++;
3488 }
3489 return line;
3490}