blob: e4e37d53f8cb0e7ad0199dfc92fa78a75d3c29ba [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum10dc2e81990-11-18 17:27:39 +000032/* Compile an expression node to intermediate code */
33
Guido van Rossum3f5da241990-12-20 15:06:42 +000034/* XXX TO DO:
Guido van Rossum8b993a91997-01-17 21:04:03 +000035 XXX add __doc__ attribute == co_doc to code object attributes?
36 XXX (it's currently the first item of the co_const tuple)
Guido van Rossum3f5da241990-12-20 15:06:42 +000037 XXX Generate simple jump for break/return outside 'try...finally'
Guido van Rossum8b993a91997-01-17 21:04:03 +000038 XXX Allow 'continue' inside try-finally
Guido van Rossum8b993a91997-01-17 21:04:03 +000039 XXX New opcode for loading the initial index for a for loop
Guido van Rossum681d79a1995-07-18 14:51:37 +000040 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000041*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000042
Guido van Rossum8ff077b1996-08-24 06:21:31 +000043#ifndef NO_PRIVATE_NAME_MANGLING
44#define PRIVATE_NAME_MANGLING
45#endif
46
Guido van Rossum79f25d91997-04-29 20:08:16 +000047#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000048
Guido van Rossum10dc2e81990-11-18 17:27:39 +000049#include "node.h"
50#include "token.h"
51#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000052#include "compile.h"
53#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000054#include "structmember.h"
55
56#include <ctype.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000057
Guido van Rossumb05a5c71997-05-07 17:46:13 +000058/* Three symbols from graminit.h are also defined in Python.h, with
59 Py_ prefixes to their names. Python.h can't include graminit.h
60 (which defines too many confusing symbols), but we can check here
61 that they haven't changed (which is very unlikely, but possible). */
62#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000063 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000064#endif
65#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000066 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000067#endif
68#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000069 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000070#endif
71
Guido van Rossum8e793d91997-03-03 19:13:14 +000072int Py_OptimizeFlag = 0;
73
Guido van Rossum8861b741996-07-30 16:49:37 +000074#define OP_DELETE 0
75#define OP_ASSIGN 1
76#define OP_APPLY 2
77
Guido van Rossum79f25d91997-04-29 20:08:16 +000078#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000079
80static struct memberlist code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000081 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
82 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000083 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000084 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000085 {"co_code", T_OBJECT, OFF(co_code), READONLY},
86 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
87 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000088 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000089 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000090 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000091 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
92 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000093 {NULL} /* Sentinel */
94};
95
Guido van Rossum79f25d91997-04-29 20:08:16 +000096static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +000097code_getattr(co, name)
Guido van Rossum79f25d91997-04-29 20:08:16 +000098 PyCodeObject *co;
Guido van Rossum3f5da241990-12-20 15:06:42 +000099 char *name;
100{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000101 return PyMember_Get((char *)co, code_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000102}
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000103
104static void
Guido van Rossum3f5da241990-12-20 15:06:42 +0000105code_dealloc(co)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000106 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000107{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000108 Py_XDECREF(co->co_code);
109 Py_XDECREF(co->co_consts);
110 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000111 Py_XDECREF(co->co_varnames);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000112 Py_XDECREF(co->co_filename);
113 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000114 Py_XDECREF(co->co_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000115 PyMem_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000116}
117
Guido van Rossum79f25d91997-04-29 20:08:16 +0000118static PyObject *
Guido van Rossum2dff9911992-09-03 20:50:59 +0000119code_repr(co)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000120 PyCodeObject *co;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000121{
122 char buf[500];
123 int lineno = -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000124 unsigned char *p;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000125 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000126 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000127
128 _PyCode_GETCODEPTR(co, &p);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000129 if (*p == SET_LINENO)
130 lineno = (p[1] & 0xff) | ((p[2] & 0xff) << 8);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000131 if (co->co_filename && PyString_Check(co->co_filename))
132 filename = PyString_AsString(co->co_filename);
133 if (co->co_name && PyString_Check(co->co_name))
134 name = PyString_AsString(co->co_name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000135 sprintf(buf, "<code object %.100s at %lx, file \"%.300s\", line %d>",
136 name, (long)co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000137 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000138}
139
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000140static int
141code_compare(co, cp)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000142 PyCodeObject *co, *cp;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000143{
144 int cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000145 cmp = co->co_argcount - cp->co_argcount;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000146 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000147 cmp = co->co_nlocals - cp->co_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000148 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000149 cmp = co->co_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000150 if (cmp) return cmp;
Guido van Rossumd076c731998-10-07 19:42:25 +0000151 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000152 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000153 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000154 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000155 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000156 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000157 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000158 return cmp;
159}
160
161static long
162code_hash(co)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000163 PyCodeObject *co;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000164{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000165 long h, h1, h2, h3, h4;
Guido van Rossumd076c731998-10-07 19:42:25 +0000166 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000167 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000168 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000169 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000170 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000171 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000172 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000173 if (h4 == -1) return -1;
174 h = h1 ^ h2 ^ h3 ^ h4 ^
175 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000176 if (h == -1) h = -2;
177 return h;
178}
179
Guido van Rossum79f25d91997-04-29 20:08:16 +0000180PyTypeObject PyCode_Type = {
181 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000182 0,
183 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000184 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000185 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000186 (destructor)code_dealloc, /*tp_dealloc*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000187 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000188 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000189 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000190 (cmpfunc)code_compare, /*tp_compare*/
191 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000192 0, /*tp_as_number*/
193 0, /*tp_as_sequence*/
194 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000195 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000196};
197
Guido van Rossum644a12b1997-04-09 19:24:53 +0000198#define NAME_CHARS \
199 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
200
Guido van Rossum79f25d91997-04-29 20:08:16 +0000201PyCodeObject *
202PyCode_New(argcount, nlocals, stacksize, flags,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000203 code, consts, names, varnames, filename, name,
204 firstlineno, lnotab)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000205 int argcount;
206 int nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000207 int stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000208 int flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000209 PyObject *code;
210 PyObject *consts;
211 PyObject *names;
212 PyObject *varnames;
213 PyObject *filename;
214 PyObject *name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000215 int firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000216 PyObject *lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000217{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000218 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000219 int i;
Guido van Rossumd076c731998-10-07 19:42:25 +0000220 PyBufferProcs *pb;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000221 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000222 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000223 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000224 consts == NULL || !PyTuple_Check(consts) ||
225 names == NULL || !PyTuple_Check(names) ||
226 varnames == NULL || !PyTuple_Check(varnames) ||
227 name == NULL || !PyString_Check(name) ||
228 filename == NULL || !PyString_Check(filename) ||
229 lnotab == NULL || !PyString_Check(lnotab)) {
230 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000231 return NULL;
232 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000233 pb = code->ob_type->tp_as_buffer;
234 if (pb == NULL ||
235 pb->bf_getreadbuffer == NULL ||
236 pb->bf_getsegcount == NULL ||
237 (*pb->bf_getsegcount)(code, NULL) != 1)
238 {
239 PyErr_BadInternalCall();
240 return NULL;
241 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000242 /* Make sure names and varnames are all strings, & intern them */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000243 for (i = PyTuple_Size(names); --i >= 0; ) {
244 PyObject *v = PyTuple_GetItem(names, i);
245 if (v == NULL || !PyString_Check(v)) {
246 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000247 return NULL;
248 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000249 PyString_InternInPlace(&PyTuple_GET_ITEM(names, i));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000250 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000251 for (i = PyTuple_Size(varnames); --i >= 0; ) {
252 PyObject *v = PyTuple_GetItem(varnames, i);
253 if (v == NULL || !PyString_Check(v)) {
254 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000255 return NULL;
256 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000257 PyString_InternInPlace(&PyTuple_GET_ITEM(varnames, i));
258 }
259 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000260 for (i = PyTuple_Size(consts); --i >= 0; ) {
261 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000262 char *p;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000263 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000264 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000265 p = PyString_AsString(v);
Guido van Rossum644a12b1997-04-09 19:24:53 +0000266 if ((int)strspn(p, NAME_CHARS)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000267 != PyString_Size(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000268 continue;
269 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000270 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000271 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000272 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000273 co->co_argcount = argcount;
274 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000275 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000276 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000277 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000278 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000279 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000280 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000281 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000282 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000283 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000284 co->co_varnames = varnames;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000285 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000286 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000287 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000288 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000289 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000290 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000291 co->co_lnotab = lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000292 }
293 return co;
294}
295
296
297/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000298
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000299struct compiling {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000300 PyObject *c_code; /* string */
301 PyObject *c_consts; /* list of objects */
302 PyObject *c_names; /* list of strings (names) */
303 PyObject *c_globals; /* dictionary (value=None) */
304 PyObject *c_locals; /* dictionary (value=localID) */
305 PyObject *c_varnames; /* list (inverse of c_locals) */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000306 int c_nlocals; /* index of next local */
307 int c_argcount; /* number of top-level arguments */
308 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000309 int c_nexti; /* index into c_code */
310 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000311 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000312 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000313 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000314 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000315 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000316 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000317 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000318 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000319 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000320 int c_stacklevel; /* Current stack level */
321 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000322 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000323 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000324 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000325#ifdef PRIVATE_NAME_MANGLING
326 char *c_private; /* for private name mangling */
327#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000328};
329
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000330
Guido van Rossum452a9831996-09-17 14:32:04 +0000331/* Error message including line number */
332
333static void
334com_error(c, exc, msg)
335 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000336 PyObject *exc;
Guido van Rossum452a9831996-09-17 14:32:04 +0000337 char *msg;
338{
339 int n = strlen(msg);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000340 PyObject *v;
Guido van Rossum452a9831996-09-17 14:32:04 +0000341 char buffer[30];
342 char *s;
Guido van Rossum635abd21997-01-06 22:56:52 +0000343 c->c_errors++;
Guido van Rossum452a9831996-09-17 14:32:04 +0000344 if (c->c_lineno <= 1) {
345 /* Unknown line number or single interactive command */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000346 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000347 return;
348 }
349 sprintf(buffer, " (line %d)", c->c_lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000350 v = PyString_FromStringAndSize((char *)NULL, n + strlen(buffer));
Guido van Rossum452a9831996-09-17 14:32:04 +0000351 if (v == NULL)
352 return; /* MemoryError, too bad */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000353 s = PyString_AS_STRING((PyStringObject *)v);
Guido van Rossum452a9831996-09-17 14:32:04 +0000354 strcpy(s, msg);
355 strcat(s, buffer);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000356 PyErr_SetObject(exc, v);
357 Py_DECREF(v);
Guido van Rossum452a9831996-09-17 14:32:04 +0000358}
359
360
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000361/* Interface to the block stack */
362
363static void
364block_push(c, type)
365 struct compiling *c;
366 int type;
367{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000368 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000369 com_error(c, PyExc_SystemError,
370 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000371 }
372 else {
373 c->c_block[c->c_nblocks++] = type;
374 }
375}
376
377static void
378block_pop(c, type)
379 struct compiling *c;
380 int type;
381{
382 if (c->c_nblocks > 0)
383 c->c_nblocks--;
384 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000385 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000386 }
387}
388
389
Guido van Rossum681d79a1995-07-18 14:51:37 +0000390/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000391
Guido van Rossum79f25d91997-04-29 20:08:16 +0000392static int com_init Py_PROTO((struct compiling *, char *));
393static void com_free Py_PROTO((struct compiling *));
394static void com_push Py_PROTO((struct compiling *, int));
395static void com_pop Py_PROTO((struct compiling *, int));
396static void com_done Py_PROTO((struct compiling *));
397static void com_node Py_PROTO((struct compiling *, struct _node *));
398static void com_factor Py_PROTO((struct compiling *, struct _node *));
399static void com_addbyte Py_PROTO((struct compiling *, int));
400static void com_addint Py_PROTO((struct compiling *, int));
401static void com_addoparg Py_PROTO((struct compiling *, int, int));
402static void com_addfwref Py_PROTO((struct compiling *, int, int *));
403static void com_backpatch Py_PROTO((struct compiling *, int));
404static int com_add Py_PROTO((struct compiling *, PyObject *, PyObject *));
405static int com_addconst Py_PROTO((struct compiling *, PyObject *));
406static int com_addname Py_PROTO((struct compiling *, PyObject *));
407static void com_addopname Py_PROTO((struct compiling *, int, node *));
408static void com_list Py_PROTO((struct compiling *, node *, int));
409static int com_argdefs Py_PROTO((struct compiling *, node *));
410static int com_newlocal Py_PROTO((struct compiling *, char *));
411static PyCodeObject *icompile Py_PROTO((struct _node *, struct compiling *));
412static PyCodeObject *jcompile Py_PROTO((struct _node *, char *,
413 struct compiling *));
414static PyObject *parsestrplus Py_PROTO((node *));
415static PyObject *parsestr Py_PROTO((char *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000416
417static int
Guido van Rossum590baa41993-11-30 13:40:46 +0000418com_init(c, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000419 struct compiling *c;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000420 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000421{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000422 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
423 1000)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000424 goto fail_3;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000425 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000426 goto fail_2;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000427 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000428 goto fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000429 if ((c->c_globals = PyDict_New()) == NULL)
Guido van Rossumc5e96291991-12-10 13:53:51 +0000430 goto fail_0;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000431 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000432 goto fail_00;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000433 if ((c->c_varnames = PyList_New(0)) == NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000434 goto fail_000;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000435 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
436 1000)) == NULL)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000437 goto fail_0000;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000438 c->c_nlocals = 0;
439 c->c_argcount = 0;
440 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000441 c->c_nexti = 0;
442 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000443 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000444 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000445 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000446 c->c_begin = 0;
447 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000448 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000449 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000450 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000451 c->c_stacklevel = 0;
452 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000453 c->c_firstlineno = 0;
454 c->c_last_addr = 0;
455 c->c_last_line = 0;
456 c-> c_lnotab_next = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000457 return 1;
458
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000459 fail_0000:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000460 Py_DECREF(c->c_lnotab);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000461 fail_000:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000462 Py_DECREF(c->c_locals);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000463 fail_00:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000464 Py_DECREF(c->c_globals);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000465 fail_0:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000466 Py_DECREF(c->c_names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000467 fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000468 Py_DECREF(c->c_consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000469 fail_2:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000470 Py_DECREF(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000471 fail_3:
472 return 0;
473}
474
475static void
476com_free(c)
477 struct compiling *c;
478{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000479 Py_XDECREF(c->c_code);
480 Py_XDECREF(c->c_consts);
481 Py_XDECREF(c->c_names);
482 Py_XDECREF(c->c_globals);
483 Py_XDECREF(c->c_locals);
484 Py_XDECREF(c->c_varnames);
485 Py_XDECREF(c->c_lnotab);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000486}
487
488static void
Guido van Rossum8b993a91997-01-17 21:04:03 +0000489com_push(c, n)
490 struct compiling *c;
491 int n;
492{
493 c->c_stacklevel += n;
494 if (c->c_stacklevel > c->c_maxstacklevel)
495 c->c_maxstacklevel = c->c_stacklevel;
496}
497
498static void
499com_pop(c, n)
500 struct compiling *c;
501 int n;
502{
503 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000504 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000505 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
506 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000507 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000508 c->c_stacklevel = 0;
509 }
510 else
511 c->c_stacklevel -= n;
512}
513
514static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000515com_done(c)
516 struct compiling *c;
517{
518 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000519 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000520 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000521 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000522}
523
524static void
525com_addbyte(c, byte)
526 struct compiling *c;
527 int byte;
528{
529 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000530 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000531 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000532 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000533 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000534 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000535 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000536 com_error(c, PyExc_SystemError,
537 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000538 }
539 if (c->c_code == NULL)
540 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000541 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000542 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000543 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000544 c->c_errors++;
545 return;
546 }
547 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000548 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000549}
550
551static void
552com_addint(c, x)
553 struct compiling *c;
554 int x;
555{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000556 com_addbyte(c, x & 0xff);
557 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000558}
559
560static void
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000561com_add_lnotab(c, addr, line)
562 struct compiling *c;
563 int addr;
564 int line;
565{
566 int size;
567 char *p;
568 if (c->c_lnotab == NULL)
569 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000570 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000571 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000572 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000573 c->c_errors++;
574 return;
575 }
576 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000577 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000578 *p++ = addr;
579 *p++ = line;
580 c->c_lnotab_next += 2;
581}
582
583static void
584com_set_lineno(c, lineno)
585 struct compiling *c;
586 int lineno;
587{
588 c->c_lineno = lineno;
589 if (c->c_firstlineno == 0) {
590 c->c_firstlineno = c->c_last_line = lineno;
591 }
592 else {
593 int incr_addr = c->c_nexti - c->c_last_addr;
594 int incr_line = lineno - c->c_last_line;
595 while (incr_addr > 0 || incr_line > 0) {
596 int trunc_addr = incr_addr;
597 int trunc_line = incr_line;
598 if (trunc_addr > 255)
599 trunc_addr = 255;
600 if (trunc_line > 255)
601 trunc_line = 255;
602 com_add_lnotab(c, trunc_addr, trunc_line);
603 incr_addr -= trunc_addr;
604 incr_line -= trunc_line;
605 }
606 c->c_last_addr = c->c_nexti;
607 c->c_last_line = lineno;
608 }
609}
610
611static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000612com_addoparg(c, op, arg)
613 struct compiling *c;
614 int op;
615 int arg;
616{
Guido van Rossum8e793d91997-03-03 19:13:14 +0000617 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000618 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000619 if (Py_OptimizeFlag)
620 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000621 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000622 com_addbyte(c, op);
623 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000624}
625
626static void
627com_addfwref(c, op, p_anchor)
628 struct compiling *c;
629 int op;
630 int *p_anchor;
631{
632 /* Compile a forward reference for backpatching */
633 int here;
634 int anchor;
635 com_addbyte(c, op);
636 here = c->c_nexti;
637 anchor = *p_anchor;
638 *p_anchor = here;
639 com_addint(c, anchor == 0 ? 0 : here - anchor);
640}
641
642static void
643com_backpatch(c, anchor)
644 struct compiling *c;
645 int anchor; /* Must be nonzero */
646{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000647 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000648 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000649 int dist;
650 int prev;
651 for (;;) {
652 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000653 prev = code[anchor] + (code[anchor+1] << 8);
654 dist = target - (anchor+2);
655 code[anchor] = dist & 0xff;
656 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000657 if (!prev)
658 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000659 anchor -= prev;
660 }
661}
662
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000663/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000664
665static int
666com_add(c, list, v)
667 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000668 PyObject *list;
669 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000670{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000671 int n = PyList_Size(list);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000672 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +0000673 /* XXX This is quadratic in the number of names per compilation unit.
674 XXX Should use a dictionary. */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000675 for (i = n; --i >= 0; ) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000676 PyObject *w = PyList_GetItem(list, i);
677 if (v->ob_type == w->ob_type && PyObject_Compare(v, w) == 0)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000678 return i;
679 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000680 /* Check for error from PyObject_Compare */
681 if (PyErr_Occurred() || PyList_Append(list, v) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000682 c->c_errors++;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000683 return n;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000684}
685
686static int
687com_addconst(c, v)
688 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000689 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000690{
691 return com_add(c, c->c_consts, v);
692}
693
694static int
695com_addname(c, v)
696 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000697 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000698{
699 return com_add(c, c->c_names, v);
700}
701
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000702#ifdef PRIVATE_NAME_MANGLING
703static int
704com_mangle(c, name, buffer, maxlen)
705 struct compiling *c;
706 char *name;
707 char *buffer;
708 int maxlen;
709{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000710 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000711 This is independent from how the name is used. */
712 char *p;
713 int nlen, plen;
714 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000715 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000716 return 0; /* Don't mangle __extremely_long_names */
717 if (name[nlen-1] == '_' && name[nlen-2] == '_')
718 return 0; /* Don't mangle __whatever__ */
719 p = c->c_private;
720 /* Strip leading underscores from class name */
721 while (*p == '_')
722 p++;
723 if (*p == '\0')
724 return 0; /* Don't mangle if class is just underscores */
725 plen = strlen(p);
726 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000727 plen = maxlen-nlen-2; /* Truncate class name if too long */
728 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000729 buffer[0] = '_';
730 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000731 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000732 /* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
733 return 1;
734}
735#endif
736
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000737static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000738com_addopnamestr(c, op, name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000739 struct compiling *c;
740 int op;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000741 char *name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000742{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000743 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000744 int i;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000745#ifdef PRIVATE_NAME_MANGLING
746 char buffer[256];
747 if (name != NULL && name[0] == '_' && name[1] == '_' &&
748 c->c_private != NULL &&
749 com_mangle(c, name, buffer, (int)sizeof(buffer)))
750 name = buffer;
751#endif
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000752 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000753 c->c_errors++;
754 i = 255;
755 }
756 else {
757 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000758 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000759 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000760 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
761 switch (op) {
762 case LOAD_NAME:
763 case STORE_NAME:
764 case DELETE_NAME:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000765 if (PyDict_GetItemString(c->c_globals, name) != NULL) {
Guido van Rossumc5e96291991-12-10 13:53:51 +0000766 switch (op) {
767 case LOAD_NAME: op = LOAD_GLOBAL; break;
768 case STORE_NAME: op = STORE_GLOBAL; break;
769 case DELETE_NAME: op = DELETE_GLOBAL; break;
770 }
771 }
772 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000773 com_addoparg(c, op, i);
774}
775
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000776static void
777com_addopname(c, op, n)
778 struct compiling *c;
779 int op;
780 node *n;
781{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000782 char *name;
783 char buffer[1000];
784 /* XXX it is possible to write this code without the 1000
785 chars on the total length of dotted names, I just can't be
786 bothered right now */
787 if (TYPE(n) == STAR)
788 name = "*";
789 else if (TYPE(n) == dotted_name) {
790 char *p = buffer;
791 int i;
792 name = buffer;
793 for (i = 0; i < NCH(n); i += 2) {
794 char *s = STR(CHILD(n, i));
795 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000796 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000797 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +0000798 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000799 break;
800 }
801 if (p != buffer)
802 *p++ = '.';
803 strcpy(p, s);
804 p = strchr(p, '\0');
805 }
806 }
807 else {
808 REQ(n, NAME);
809 name = STR(n);
810 }
811 com_addopnamestr(c, op, name);
812}
813
Guido van Rossum79f25d91997-04-29 20:08:16 +0000814static PyObject *
Guido van Rossum452a9831996-09-17 14:32:04 +0000815parsenumber(co, s)
816 struct compiling *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000817 char *s;
818{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000819 extern double atof Py_PROTO((const char *));
Guido van Rossumc5e96291991-12-10 13:53:51 +0000820 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000821 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000822 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +0000823#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +0000824 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +0000825 int imflag;
826#endif
827
Guido van Rossum282914b1991-04-04 10:42:56 +0000828 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000829 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +0000830#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +0000831 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +0000832#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000833 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000834 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000835 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000836 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000837 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000838 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000839 if (*end == '\0') {
840 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000841 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000842 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000843 return NULL;
844 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000845 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000846 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000847 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +0000848#ifndef WITHOUT_COMPLEX
849 if (imflag) {
850 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000851 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +0000852 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000853 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000854 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +0000855 }
Guido van Rossumac1fc951997-10-08 15:23:55 +0000856 else
Guido van Rossum50564e81996-01-12 01:13:16 +0000857#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +0000858 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000859 PyFPE_START_PROTECT("atof", return 0)
860 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000861 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000862 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000863 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000864}
865
Guido van Rossum79f25d91997-04-29 20:08:16 +0000866static PyObject *
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000867parsestr(s)
868 char *s;
869{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000870 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000871 int len;
872 char *buf;
873 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000874 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000875 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +0000876 int first = *s;
877 int quote = first;
878 if (isalpha(quote) || quote == '_')
879 quote = *++s;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000880 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000881 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000882 return NULL;
883 }
884 s++;
885 len = strlen(s);
Guido van Rossum8054fad1993-10-26 15:19:44 +0000886 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000887 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000888 return NULL;
889 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000890 if (len >= 4 && s[0] == quote && s[1] == quote) {
891 s += 2;
892 len -= 2;
893 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000894 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000895 return NULL;
896 }
897 }
Guido van Rossum5f5e8171997-04-06 03:41:40 +0000898 if (first != quote || strchr(s, '\\') == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000899 return PyString_FromStringAndSize(s, len);
900 v = PyString_FromStringAndSize((char *)NULL, len);
901 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000902 end = s + len;
903 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000904 if (*s != '\\') {
905 *p++ = *s++;
906 continue;
907 }
908 s++;
909 switch (*s++) {
910 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000911 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000912 case '\\': *p++ = '\\'; break;
913 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000914 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000915 case 'b': *p++ = '\b'; break;
916 case 'f': *p++ = '\014'; break; /* FF */
917 case 't': *p++ = '\t'; break;
918 case 'n': *p++ = '\n'; break;
919 case 'r': *p++ = '\r'; break;
920 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000921 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
922 case '0': case '1': case '2': case '3':
923 case '4': case '5': case '6': case '7':
924 c = s[-1] - '0';
925 if ('0' <= *s && *s <= '7') {
926 c = (c<<3) + *s++ - '0';
927 if ('0' <= *s && *s <= '7')
928 c = (c<<3) + *s++ - '0';
929 }
930 *p++ = c;
931 break;
932 case 'x':
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000933 if (isxdigit(Py_CHARMASK(*s))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000934 unsigned int x = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000935 do {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000936 c = Py_CHARMASK(*s);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000937 s++;
Guido van Rossumed1100f1997-10-20 23:24:07 +0000938 x = (x<<4) & ~0xF;
939 if (isdigit(c))
940 x += c - '0';
941 else if (islower(c))
942 x += 10 + c - 'a';
943 else
944 x += 10 + c - 'A';
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000945 } while (isxdigit(Py_CHARMASK(*s)));
Guido van Rossumed1100f1997-10-20 23:24:07 +0000946 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000947 break;
948 }
949 /* FALLTHROUGH */
950 default: *p++ = '\\'; *p++ = s[-1]; break;
951 }
952 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000953 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000954 return v;
955}
956
Guido van Rossum79f25d91997-04-29 20:08:16 +0000957static PyObject *
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000958parsestrplus(n)
959 node *n;
960{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000961 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000962 int i;
963 REQ(CHILD(n, 0), STRING);
964 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
965 /* String literal concatenation */
966 for (i = 1; i < NCH(n) && v != NULL; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000967 PyString_ConcatAndDel(&v, parsestr(STR(CHILD(n, i))));
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000968 }
969 }
970 return v;
971}
972
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000973static void
974com_list_constructor(c, n)
975 struct compiling *c;
976 node *n;
977{
978 int len;
979 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000980 if (TYPE(n) != testlist)
981 REQ(n, exprlist);
982 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
983 len = (NCH(n) + 1) / 2;
984 for (i = 0; i < NCH(n); i += 2)
985 com_node(c, CHILD(n, i));
986 com_addoparg(c, BUILD_LIST, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000987 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000988}
989
990static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000991com_dictmaker(c, n)
992 struct compiling *c;
993 node *n;
994{
995 int i;
996 /* dictmaker: test ':' test (',' test ':' value)* [','] */
997 for (i = 0; i+2 < NCH(n); i += 4) {
998 /* We must arrange things just right for STORE_SUBSCR.
999 It wants the stack to look like (value) (dict) (key) */
1000 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001001 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001002 com_node(c, CHILD(n, i+2)); /* value */
1003 com_addbyte(c, ROT_TWO);
1004 com_node(c, CHILD(n, i)); /* key */
1005 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001006 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001007 }
1008}
1009
1010static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001011com_atom(c, n)
1012 struct compiling *c;
1013 node *n;
1014{
1015 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001016 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001017 int i;
1018 REQ(n, atom);
1019 ch = CHILD(n, 0);
1020 switch (TYPE(ch)) {
1021 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001022 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001023 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001024 com_push(c, 1);
1025 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001026 else
1027 com_node(c, CHILD(n, 1));
1028 break;
1029 case LSQB:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001030 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001031 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001032 com_push(c, 1);
1033 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001034 else
1035 com_list_constructor(c, CHILD(n, 1));
1036 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001037 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001038 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001039 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001040 if (TYPE(CHILD(n, 1)) != RBRACE)
1041 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001042 break;
1043 case BACKQUOTE:
1044 com_node(c, CHILD(n, 1));
1045 com_addbyte(c, UNARY_CONVERT);
1046 break;
1047 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001048 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001049 i = 255;
1050 }
1051 else {
1052 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001053 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001054 }
1055 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001056 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001057 break;
1058 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001059 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001060 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001061 c->c_errors++;
1062 i = 255;
1063 }
1064 else {
1065 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001066 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001067 }
1068 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001069 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001070 break;
1071 case NAME:
1072 com_addopname(c, LOAD_NAME, ch);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001073 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001074 break;
1075 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001076 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001077 com_error(c, PyExc_SystemError,
1078 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001079 }
1080}
1081
1082static void
1083com_slice(c, n, op)
1084 struct compiling *c;
1085 node *n;
1086 int op;
1087{
1088 if (NCH(n) == 1) {
1089 com_addbyte(c, op);
1090 }
1091 else if (NCH(n) == 2) {
1092 if (TYPE(CHILD(n, 0)) != COLON) {
1093 com_node(c, CHILD(n, 0));
1094 com_addbyte(c, op+1);
1095 }
1096 else {
1097 com_node(c, CHILD(n, 1));
1098 com_addbyte(c, op+2);
1099 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001100 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001101 }
1102 else {
1103 com_node(c, CHILD(n, 0));
1104 com_node(c, CHILD(n, 2));
1105 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001106 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001107 }
1108}
1109
Guido van Rossum635abd21997-01-06 22:56:52 +00001110static void
1111com_argument(c, n, pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001112 struct compiling *c;
1113 node *n; /* argument */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001114 PyObject **pkeywords;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001115{
1116 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001117 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001118 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001119 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001120 com_error(c, PyExc_SyntaxError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001121 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001122 }
1123 else {
1124 com_node(c, CHILD(n, 0));
1125 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001126 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001127 }
1128 m = n;
1129 do {
1130 m = CHILD(m, 0);
1131 } while (NCH(m) == 1);
1132 if (TYPE(m) != NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001133 com_error(c, PyExc_SyntaxError,
1134 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001135 }
1136 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001137 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001138 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001139 *pkeywords = PyDict_New();
Guido van Rossum635abd21997-01-06 22:56:52 +00001140 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001141 c->c_errors++;
1142 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001143 if (PyDict_GetItem(*pkeywords, v) != NULL)
1144 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001145 "duplicate keyword argument");
1146 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001147 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001148 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001149 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001150 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001151 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001152 }
1153 }
1154 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001155}
1156
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001157static void
1158com_call_function(c, n)
1159 struct compiling *c;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001160 node *n; /* EITHER arglist OR ')' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001161{
1162 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001163 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001164 }
1165 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001166 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001167 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001168 int lineno = n->n_lineno;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001169 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001170 na = 0;
1171 nk = 0;
1172 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001173 node *ch = CHILD(n, i);
1174 if (ch->n_lineno != lineno) {
1175 lineno = ch->n_lineno;
1176 com_addoparg(c, SET_LINENO, lineno);
1177 }
1178 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001179 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001180 na++;
1181 else
1182 nk++;
1183 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001184 Py_XDECREF(keywords);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001185 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001186 com_error(c, PyExc_SyntaxError,
1187 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001188 }
1189 com_addoparg(c, CALL_FUNCTION, na | (nk << 8));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001190 com_pop(c, na + 2*nk);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001191 }
1192}
1193
1194static void
1195com_select_member(c, n)
1196 struct compiling *c;
1197 node *n;
1198{
1199 com_addopname(c, LOAD_ATTR, n);
1200}
1201
1202static void
Guido van Rossum8861b741996-07-30 16:49:37 +00001203com_sliceobj(c, n)
1204 struct compiling *c;
1205 node *n;
1206{
1207 int i=0;
1208 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001209 node *ch;
1210
1211 /* first argument */
1212 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001213 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001214 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001215 i++;
1216 }
1217 else {
1218 com_node(c, CHILD(n,i));
1219 i++;
1220 REQ(CHILD(n,i),COLON);
1221 i++;
1222 }
1223 /* second argument */
1224 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1225 com_node(c, CHILD(n,i));
1226 i++;
1227 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001228 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001229 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001230 com_push(c, 1);
1231 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001232 /* remaining arguments */
1233 for (; i < NCH(n); i++) {
1234 ns++;
1235 ch=CHILD(n,i);
1236 REQ(ch, sliceop);
1237 if (NCH(ch) == 1) {
1238 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001239 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001240 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001241 }
1242 else
1243 com_node(c, CHILD(ch,1));
1244 }
1245 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001246 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001247}
1248
1249static void
1250com_subscript(c, n)
1251 struct compiling *c;
1252 node *n;
1253{
1254 node *ch;
1255 REQ(n, subscript);
1256 ch = CHILD(n,0);
1257 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001258 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001259 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001260 com_push(c, 1);
1261 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001262 else {
1263 /* check for slice */
1264 if ((TYPE(ch) == COLON || NCH(n) > 1))
1265 com_sliceobj(c, n);
1266 else {
1267 REQ(ch, test);
1268 com_node(c, ch);
1269 }
1270 }
1271}
1272
1273static void
1274com_subscriptlist(c, n, assigning)
1275 struct compiling *c;
1276 node *n;
1277 int assigning;
1278{
1279 int i, op;
1280 REQ(n, subscriptlist);
1281 /* Check to make backward compatible slice behavior for '[i:j]' */
1282 if (NCH(n) == 1) {
1283 node *sub = CHILD(n, 0); /* subscript */
1284 /* Make it is a simple slice.
Guido van Rossum8b993a91997-01-17 21:04:03 +00001285 Should have exactly one colon. */
Guido van Rossum8861b741996-07-30 16:49:37 +00001286 if ((TYPE(CHILD(sub, 0)) == COLON
1287 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
Guido van Rossum8b993a91997-01-17 21:04:03 +00001288 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1289 {
Guido van Rossum8861b741996-07-30 16:49:37 +00001290 if (assigning == OP_APPLY)
1291 op = SLICE;
1292 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001293 op = ((assigning == OP_ASSIGN) ?
1294 STORE_SLICE : DELETE_SLICE);
Guido van Rossum8861b741996-07-30 16:49:37 +00001295 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001296 if (op == STORE_SLICE)
1297 com_pop(c, 2);
1298 else if (op == DELETE_SLICE)
1299 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001300 return;
1301 }
1302 }
1303 /* Else normal subscriptlist. Compile each subscript. */
1304 for (i = 0; i < NCH(n); i += 2)
1305 com_subscript(c, CHILD(n, i));
1306 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001307 if (NCH(n) > 1) {
1308 i = (NCH(n)+1) / 2;
1309 com_addoparg(c, BUILD_TUPLE, i);
1310 com_pop(c, i-1);
1311 }
1312 if (assigning == OP_APPLY) {
Guido van Rossum8861b741996-07-30 16:49:37 +00001313 op = BINARY_SUBSCR;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001314 i = 1;
1315 }
1316 else if (assigning == OP_ASSIGN) {
1317 op = STORE_SUBSCR;
1318 i = 3;
1319 }
1320 else {
1321 op = DELETE_SUBSCR;
1322 i = 2;
1323 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001324 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001325 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001326}
1327
1328static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001329com_apply_trailer(c, n)
1330 struct compiling *c;
1331 node *n;
1332{
1333 REQ(n, trailer);
1334 switch (TYPE(CHILD(n, 0))) {
1335 case LPAR:
1336 com_call_function(c, CHILD(n, 1));
1337 break;
1338 case DOT:
1339 com_select_member(c, CHILD(n, 1));
1340 break;
1341 case LSQB:
Guido van Rossum8861b741996-07-30 16:49:37 +00001342 com_subscriptlist(c, CHILD(n, 1), OP_APPLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001343 break;
1344 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001345 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001346 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001347 }
1348}
1349
1350static void
Guido van Rossum50564e81996-01-12 01:13:16 +00001351com_power(c, n)
1352 struct compiling *c;
1353 node *n;
1354{
1355 int i;
1356 REQ(n, power);
1357 com_atom(c, CHILD(n, 0));
1358 for (i = 1; i < NCH(n); i++) {
1359 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1360 com_factor(c, CHILD(n, i+1));
1361 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001362 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001363 break;
1364 }
1365 else
1366 com_apply_trailer(c, CHILD(n, i));
1367 }
1368}
1369
1370static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001371com_factor(c, n)
1372 struct compiling *c;
1373 node *n;
1374{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001375 REQ(n, factor);
1376 if (TYPE(CHILD(n, 0)) == PLUS) {
1377 com_factor(c, CHILD(n, 1));
1378 com_addbyte(c, UNARY_POSITIVE);
1379 }
1380 else if (TYPE(CHILD(n, 0)) == MINUS) {
1381 com_factor(c, CHILD(n, 1));
1382 com_addbyte(c, UNARY_NEGATIVE);
1383 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001384 else if (TYPE(CHILD(n, 0)) == TILDE) {
1385 com_factor(c, CHILD(n, 1));
1386 com_addbyte(c, UNARY_INVERT);
1387 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001388 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001389 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001390 }
1391}
1392
1393static void
1394com_term(c, n)
1395 struct compiling *c;
1396 node *n;
1397{
1398 int i;
1399 int op;
1400 REQ(n, term);
1401 com_factor(c, CHILD(n, 0));
1402 for (i = 2; i < NCH(n); i += 2) {
1403 com_factor(c, CHILD(n, i));
1404 switch (TYPE(CHILD(n, i-1))) {
1405 case STAR:
1406 op = BINARY_MULTIPLY;
1407 break;
1408 case SLASH:
1409 op = BINARY_DIVIDE;
1410 break;
1411 case PERCENT:
1412 op = BINARY_MODULO;
1413 break;
1414 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001415 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001416 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001417 op = 255;
1418 }
1419 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001420 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001421 }
1422}
1423
1424static void
1425com_arith_expr(c, n)
1426 struct compiling *c;
1427 node *n;
1428{
1429 int i;
1430 int op;
1431 REQ(n, arith_expr);
1432 com_term(c, CHILD(n, 0));
1433 for (i = 2; i < NCH(n); i += 2) {
1434 com_term(c, CHILD(n, i));
1435 switch (TYPE(CHILD(n, i-1))) {
1436 case PLUS:
1437 op = BINARY_ADD;
1438 break;
1439 case MINUS:
1440 op = BINARY_SUBTRACT;
1441 break;
1442 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001443 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001444 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001445 op = 255;
1446 }
1447 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001448 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001449 }
1450}
1451
1452static void
1453com_shift_expr(c, n)
1454 struct compiling *c;
1455 node *n;
1456{
1457 int i;
1458 int op;
1459 REQ(n, shift_expr);
1460 com_arith_expr(c, CHILD(n, 0));
1461 for (i = 2; i < NCH(n); i += 2) {
1462 com_arith_expr(c, CHILD(n, i));
1463 switch (TYPE(CHILD(n, i-1))) {
1464 case LEFTSHIFT:
1465 op = BINARY_LSHIFT;
1466 break;
1467 case RIGHTSHIFT:
1468 op = BINARY_RSHIFT;
1469 break;
1470 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001471 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001472 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001473 op = 255;
1474 }
1475 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001476 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001477 }
1478}
1479
1480static void
1481com_and_expr(c, n)
1482 struct compiling *c;
1483 node *n;
1484{
1485 int i;
1486 int op;
1487 REQ(n, and_expr);
1488 com_shift_expr(c, CHILD(n, 0));
1489 for (i = 2; i < NCH(n); i += 2) {
1490 com_shift_expr(c, CHILD(n, i));
1491 if (TYPE(CHILD(n, i-1)) == AMPER) {
1492 op = BINARY_AND;
1493 }
1494 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001495 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001496 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001497 op = 255;
1498 }
1499 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001500 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001501 }
1502}
1503
1504static void
1505com_xor_expr(c, n)
1506 struct compiling *c;
1507 node *n;
1508{
1509 int i;
1510 int op;
1511 REQ(n, xor_expr);
1512 com_and_expr(c, CHILD(n, 0));
1513 for (i = 2; i < NCH(n); i += 2) {
1514 com_and_expr(c, CHILD(n, i));
1515 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1516 op = BINARY_XOR;
1517 }
1518 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001519 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001520 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001521 op = 255;
1522 }
1523 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001524 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001525 }
1526}
1527
1528static void
1529com_expr(c, n)
1530 struct compiling *c;
1531 node *n;
1532{
1533 int i;
1534 int op;
1535 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001536 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001537 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001538 com_xor_expr(c, CHILD(n, i));
1539 if (TYPE(CHILD(n, i-1)) == VBAR) {
1540 op = BINARY_OR;
1541 }
1542 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001543 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001544 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001545 op = 255;
1546 }
1547 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001548 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001549 }
1550}
1551
1552static enum cmp_op
1553cmp_type(n)
1554 node *n;
1555{
1556 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001557 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001558 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1559 if (NCH(n) == 1) {
1560 n = CHILD(n, 0);
1561 switch (TYPE(n)) {
1562 case LESS: return LT;
1563 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001564 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001565 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001566 case LESSEQUAL: return LE;
1567 case GREATEREQUAL: return GE;
1568 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001569 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1570 if (strcmp(STR(n), "is") == 0) return IS;
1571 }
1572 }
1573 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001574 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001575 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1576 return NOT_IN;
1577 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1578 return IS_NOT;
1579 }
1580 }
1581 return BAD;
1582}
1583
1584static void
1585com_comparison(c, n)
1586 struct compiling *c;
1587 node *n;
1588{
1589 int i;
1590 enum cmp_op op;
1591 int anchor;
1592 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1593 com_expr(c, CHILD(n, 0));
1594 if (NCH(n) == 1)
1595 return;
1596
1597 /****************************************************************
1598 The following code is generated for all but the last
1599 comparison in a chain:
1600
1601 label: on stack: opcode: jump to:
1602
1603 a <code to load b>
1604 a, b DUP_TOP
1605 a, b, b ROT_THREE
1606 b, a, b COMPARE_OP
1607 b, 0-or-1 JUMP_IF_FALSE L1
1608 b, 1 POP_TOP
1609 b
1610
1611 We are now ready to repeat this sequence for the next
1612 comparison in the chain.
1613
1614 For the last we generate:
1615
1616 b <code to load c>
1617 b, c COMPARE_OP
1618 0-or-1
1619
1620 If there were any jumps to L1 (i.e., there was more than one
1621 comparison), we generate:
1622
1623 0-or-1 JUMP_FORWARD L2
1624 L1: b, 0 ROT_TWO
1625 0, b POP_TOP
1626 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00001627 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001628 ****************************************************************/
1629
1630 anchor = 0;
1631
1632 for (i = 2; i < NCH(n); i += 2) {
1633 com_expr(c, CHILD(n, i));
1634 if (i+2 < NCH(n)) {
1635 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001636 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001637 com_addbyte(c, ROT_THREE);
1638 }
1639 op = cmp_type(CHILD(n, i-1));
1640 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001641 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001642 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001643 }
1644 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001645 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001646 if (i+2 < NCH(n)) {
1647 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1648 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001649 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001650 }
1651 }
1652
1653 if (anchor) {
1654 int anchor2 = 0;
1655 com_addfwref(c, JUMP_FORWARD, &anchor2);
1656 com_backpatch(c, anchor);
1657 com_addbyte(c, ROT_TWO);
1658 com_addbyte(c, POP_TOP);
1659 com_backpatch(c, anchor2);
1660 }
1661}
1662
1663static void
1664com_not_test(c, n)
1665 struct compiling *c;
1666 node *n;
1667{
1668 REQ(n, not_test); /* 'not' not_test | comparison */
1669 if (NCH(n) == 1) {
1670 com_comparison(c, CHILD(n, 0));
1671 }
1672 else {
1673 com_not_test(c, CHILD(n, 1));
1674 com_addbyte(c, UNARY_NOT);
1675 }
1676}
1677
1678static void
1679com_and_test(c, n)
1680 struct compiling *c;
1681 node *n;
1682{
1683 int i;
1684 int anchor;
1685 REQ(n, and_test); /* not_test ('and' not_test)* */
1686 anchor = 0;
1687 i = 0;
1688 for (;;) {
1689 com_not_test(c, CHILD(n, i));
1690 if ((i += 2) >= NCH(n))
1691 break;
1692 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1693 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001694 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001695 }
1696 if (anchor)
1697 com_backpatch(c, anchor);
1698}
1699
1700static void
1701com_test(c, n)
1702 struct compiling *c;
1703 node *n;
1704{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001705 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00001706 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001707 PyObject *v;
Guido van Rossum57531fe1993-11-30 14:57:42 +00001708 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001709 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001710 v = (PyObject *) icompile(CHILD(n, 0), c);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001711 if (v == NULL) {
1712 c->c_errors++;
1713 i = 255;
1714 }
1715 else {
1716 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001717 Py_DECREF(v);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001718 }
1719 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001720 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001721 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001722 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001723 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001724 else {
1725 int anchor = 0;
1726 int i = 0;
1727 for (;;) {
1728 com_and_test(c, CHILD(n, i));
1729 if ((i += 2) >= NCH(n))
1730 break;
1731 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1732 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001733 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001734 }
1735 if (anchor)
1736 com_backpatch(c, anchor);
1737 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001738}
1739
1740static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001741com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001742 struct compiling *c;
1743 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001744 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001745{
1746 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001747 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001748 com_node(c, CHILD(n, 0));
1749 }
1750 else {
1751 int i;
1752 int len;
1753 len = (NCH(n) + 1) / 2;
1754 for (i = 0; i < NCH(n); i += 2)
1755 com_node(c, CHILD(n, i));
1756 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001757 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001758 }
1759}
1760
1761
1762/* Begin of assignment compilation */
1763
Guido van Rossum79f25d91997-04-29 20:08:16 +00001764static void com_assign_name Py_PROTO((struct compiling *, node *, int));
1765static void com_assign Py_PROTO((struct compiling *, node *, int));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001766
1767static void
1768com_assign_attr(c, n, assigning)
1769 struct compiling *c;
1770 node *n;
1771 int assigning;
1772{
1773 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001774 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001775}
1776
1777static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001778com_assign_trailer(c, n, assigning)
1779 struct compiling *c;
1780 node *n;
1781 int assigning;
1782{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001783 REQ(n, trailer);
1784 switch (TYPE(CHILD(n, 0))) {
1785 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001786 com_error(c, PyExc_SyntaxError,
1787 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001788 break;
1789 case DOT: /* '.' NAME */
1790 com_assign_attr(c, CHILD(n, 1), assigning);
1791 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001792 case LSQB: /* '[' subscriptlist ']' */
1793 com_subscriptlist(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001794 break;
1795 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001796 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001797 }
1798}
1799
1800static void
1801com_assign_tuple(c, n, assigning)
1802 struct compiling *c;
1803 node *n;
1804 int assigning;
1805{
1806 int i;
1807 if (TYPE(n) != testlist)
1808 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001809 if (assigning) {
1810 i = (NCH(n)+1)/2;
1811 com_addoparg(c, UNPACK_TUPLE, i);
1812 com_push(c, i-1);
1813 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001814 for (i = 0; i < NCH(n); i += 2)
1815 com_assign(c, CHILD(n, i), assigning);
1816}
1817
1818static void
1819com_assign_list(c, n, assigning)
1820 struct compiling *c;
1821 node *n;
1822 int assigning;
1823{
1824 int i;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001825 if (assigning) {
1826 i = (NCH(n)+1)/2;
1827 com_addoparg(c, UNPACK_LIST, i);
1828 com_push(c, i-1);
1829 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001830 for (i = 0; i < NCH(n); i += 2)
1831 com_assign(c, CHILD(n, i), assigning);
1832}
1833
1834static void
1835com_assign_name(c, n, assigning)
1836 struct compiling *c;
1837 node *n;
1838 int assigning;
1839{
1840 REQ(n, NAME);
1841 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001842 if (assigning)
1843 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001844}
1845
1846static void
1847com_assign(c, n, assigning)
1848 struct compiling *c;
1849 node *n;
1850 int assigning;
1851{
1852 /* Loop to avoid trivial recursion */
1853 for (;;) {
1854 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001855
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001856 case exprlist:
1857 case testlist:
1858 if (NCH(n) > 1) {
1859 com_assign_tuple(c, n, assigning);
1860 return;
1861 }
1862 n = CHILD(n, 0);
1863 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001864
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001865 case test:
1866 case and_test:
1867 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001868 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001869 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001870 case xor_expr:
1871 case and_expr:
1872 case shift_expr:
1873 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001874 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00001875 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001876 if (NCH(n) > 1) {
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 operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001879 return;
1880 }
1881 n = CHILD(n, 0);
1882 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001883
Guido van Rossum50564e81996-01-12 01:13:16 +00001884 case power: /* atom trailer* ('**' power)* */
1885/* ('+'|'-'|'~') factor | atom trailer* */
1886 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001887 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001888 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001889 return;
1890 }
Guido van Rossum50564e81996-01-12 01:13:16 +00001891 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001892 int i;
1893 com_node(c, CHILD(n, 0));
1894 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00001895 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001896 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001897 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00001898 return;
1899 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001900 com_apply_trailer(c, CHILD(n, i));
1901 } /* NB i is still alive */
1902 com_assign_trailer(c,
1903 CHILD(n, i), assigning);
1904 return;
1905 }
1906 n = CHILD(n, 0);
1907 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001908
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001909 case atom:
1910 switch (TYPE(CHILD(n, 0))) {
1911 case LPAR:
1912 n = CHILD(n, 1);
1913 if (TYPE(n) == RPAR) {
1914 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001915 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001916 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001917 return;
1918 }
1919 break;
1920 case LSQB:
1921 n = CHILD(n, 1);
1922 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001923 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001924 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001925 return;
1926 }
1927 com_assign_list(c, n, assigning);
1928 return;
1929 case NAME:
1930 com_assign_name(c, CHILD(n, 0), assigning);
1931 return;
1932 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001933 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001934 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001935 return;
1936 }
1937 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001938
1939 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001940 com_error(c, PyExc_SyntaxError,
1941 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001942 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001943
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001944 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001945 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001946 com_error(c, PyExc_SystemError,
1947 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001948 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001949
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001950 }
1951 }
1952}
Guido van Rossum7c531111997-03-11 18:42:21 +00001953
Guido van Rossum79f25d91997-04-29 20:08:16 +00001954/* Forward */ static node *get_rawdocstring Py_PROTO((node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001955
1956static void
1957com_expr_stmt(c, n)
1958 struct compiling *c;
1959 node *n;
1960{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001961 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001962 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001963 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001964 return;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001965 com_node(c, CHILD(n, NCH(n)-1));
1966 if (NCH(n) == 1) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001967 if (c->c_interactive)
1968 com_addbyte(c, PRINT_EXPR);
1969 else
1970 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001971 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001972 }
1973 else {
1974 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001975 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001976 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001977 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001978 com_push(c, 1);
1979 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001980 com_assign(c, CHILD(n, i), OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001981 }
1982 }
1983}
1984
1985static void
Guido van Rossum228d7f31997-04-02 05:24:36 +00001986com_assert_stmt(c, n)
1987 struct compiling *c;
1988 node *n;
1989{
1990 int a = 0, b = 0;
1991 int i;
1992 REQ(n, assert_stmt); /* 'assert' test [',' test] */
1993 /* Generate code like for
1994
1995 if __debug__:
1996 if not <test>:
1997 raise AssertionError [, <message>]
1998
1999 where <message> is the second test, if present.
2000 */
2001 if (Py_OptimizeFlag)
2002 return;
2003 com_addopnamestr(c, LOAD_GLOBAL, "__debug__");
2004 com_push(c, 1);
2005 com_addfwref(c, JUMP_IF_FALSE, &a);
2006 com_addbyte(c, POP_TOP);
2007 com_pop(c, 1);
2008 com_node(c, CHILD(n, 1));
2009 com_addfwref(c, JUMP_IF_TRUE, &b);
2010 com_addbyte(c, POP_TOP);
2011 com_pop(c, 1);
2012 /* Raise that exception! */
2013 com_addopnamestr(c, LOAD_GLOBAL, "AssertionError");
2014 com_push(c, 1);
2015 i = NCH(n)/2; /* Either 2 or 4 */
2016 if (i > 1)
2017 com_node(c, CHILD(n, 3));
2018 com_addoparg(c, RAISE_VARARGS, i);
2019 com_pop(c, i);
2020 /* The interpreter does not fall through */
2021 /* All jumps converge here */
2022 com_backpatch(c, a);
2023 com_backpatch(c, b);
2024 com_addbyte(c, POP_TOP);
2025}
2026
2027static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002028com_print_stmt(c, n)
2029 struct compiling *c;
2030 node *n;
2031{
2032 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002033 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
2034 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002035 com_node(c, CHILD(n, i));
2036 com_addbyte(c, PRINT_ITEM);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002037 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002038 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002039 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002040 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002041 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002042}
2043
2044static void
2045com_return_stmt(c, n)
2046 struct compiling *c;
2047 node *n;
2048{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002049 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002050 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002051 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002052 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002053 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002054 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002055 com_push(c, 1);
2056 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002057 else
2058 com_node(c, CHILD(n, 1));
2059 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002060 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002061}
2062
2063static void
2064com_raise_stmt(c, n)
2065 struct compiling *c;
2066 node *n;
2067{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002068 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002069 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2070 if (NCH(n) > 1) {
2071 com_node(c, CHILD(n, 1));
2072 if (NCH(n) > 3) {
2073 com_node(c, CHILD(n, 3));
2074 if (NCH(n) > 5)
2075 com_node(c, CHILD(n, 5));
2076 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002077 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002078 i = NCH(n)/2;
2079 com_addoparg(c, RAISE_VARARGS, i);
2080 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002081}
2082
2083static void
2084com_import_stmt(c, n)
2085 struct compiling *c;
2086 node *n;
2087{
2088 int i;
2089 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002090 /* 'import' dotted_name (',' dotted_name)* |
2091 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002092 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002093 /* 'from' dotted_name 'import' ... */
2094 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002095 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002096 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002097 for (i = 3; i < NCH(n); i += 2)
2098 com_addopname(c, IMPORT_FROM, CHILD(n, i));
2099 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002100 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002101 }
2102 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002103 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002104 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002105 REQ(CHILD(n, i), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002106 com_addopname(c, IMPORT_NAME, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002107 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002108 com_addopname(c, STORE_NAME, CHILD(CHILD(n, i), 0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002109 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002110 }
2111 }
2112}
2113
2114static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00002115com_global_stmt(c, n)
2116 struct compiling *c;
2117 node *n;
2118{
2119 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002120 REQ(n, global_stmt);
2121 /* 'global' NAME (',' NAME)* */
2122 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002123 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002124#ifdef PRIVATE_NAME_MANGLING
2125 char buffer[256];
2126 if (s != NULL && s[0] == '_' && s[1] == '_' &&
2127 c->c_private != NULL &&
2128 com_mangle(c, s, buffer, (int)sizeof(buffer)))
2129 s = buffer;
2130#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +00002131 if (PyDict_GetItemString(c->c_locals, s) != NULL) {
2132 com_error(c, PyExc_SyntaxError,
2133 "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002134 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002135 else if (PyDict_SetItemString(c->c_globals, s, Py_None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002136 c->c_errors++;
2137 }
2138}
2139
Guido van Rossum681d79a1995-07-18 14:51:37 +00002140static int
2141com_newlocal_o(c, nameval)
2142 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002143 PyObject *nameval;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002144{
2145 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002146 PyObject *ival;
2147 if (PyList_Size(c->c_varnames) != c->c_nlocals) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002148 /* This is usually caused by an error on a previous call */
2149 if (c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002150 com_error(c, PyExc_SystemError,
2151 "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002152 }
2153 return 0;
2154 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002155 ival = PyInt_FromLong(i = c->c_nlocals++);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002156 if (ival == NULL)
2157 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002158 else if (PyDict_SetItem(c->c_locals, nameval, ival) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002159 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002160 else if (PyList_Append(c->c_varnames, nameval) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002161 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002162 Py_XDECREF(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002163 return i;
2164}
2165
2166static int
2167com_addlocal_o(c, nameval)
2168 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002169 PyObject *nameval;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002170{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002171 PyObject *ival = PyDict_GetItem(c->c_locals, nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002172 if (ival != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002173 return PyInt_AsLong(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002174 return com_newlocal_o(c, nameval);
2175}
2176
2177static int
2178com_newlocal(c, name)
2179 struct compiling *c;
2180 char *name;
2181{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002182 PyObject *nameval = PyString_InternFromString(name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002183 int i;
2184 if (nameval == NULL) {
2185 c->c_errors++;
2186 return 0;
2187 }
2188 i = com_newlocal_o(c, nameval);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002189 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002190 return i;
2191}
2192
Guido van Rossumc5e96291991-12-10 13:53:51 +00002193static void
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002194com_exec_stmt(c, n)
2195 struct compiling *c;
2196 node *n;
2197{
2198 REQ(n, exec_stmt);
2199 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2200 com_node(c, CHILD(n, 1));
2201 if (NCH(n) >= 4)
2202 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002203 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002204 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002205 com_push(c, 1);
2206 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002207 if (NCH(n) >= 6)
2208 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002209 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002210 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002211 com_push(c, 1);
2212 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002213 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002214 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002215}
2216
Guido van Rossum7c531111997-03-11 18:42:21 +00002217static int
2218is_constant_false(c, n)
2219 struct compiling *c;
2220 node *n;
2221{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002222 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002223 int i;
2224
2225 /* Label to avoid tail recursion */
2226 next:
2227 switch (TYPE(n)) {
2228
2229 case suite:
2230 if (NCH(n) == 1) {
2231 n = CHILD(n, 0);
2232 goto next;
2233 }
2234 /* Fall through */
2235 case file_input:
2236 for (i = 0; i < NCH(n); i++) {
2237 node *ch = CHILD(n, i);
2238 if (TYPE(ch) == stmt) {
2239 n = ch;
2240 goto next;
2241 }
2242 }
2243 break;
2244
2245 case stmt:
2246 case simple_stmt:
2247 case small_stmt:
2248 n = CHILD(n, 0);
2249 goto next;
2250
2251 case expr_stmt:
2252 case testlist:
2253 case test:
2254 case and_test:
2255 case not_test:
2256 case comparison:
2257 case expr:
2258 case xor_expr:
2259 case and_expr:
2260 case shift_expr:
2261 case arith_expr:
2262 case term:
2263 case factor:
2264 case power:
2265 case atom:
2266 if (NCH(n) == 1) {
2267 n = CHILD(n, 0);
2268 goto next;
2269 }
2270 break;
2271
2272 case NAME:
2273 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2274 return 1;
2275 break;
2276
2277 case NUMBER:
2278 v = parsenumber(c, STR(n));
2279 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002280 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002281 break;
2282 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002283 i = PyObject_IsTrue(v);
2284 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002285 return i == 0;
2286
2287 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002288 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002289 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002290 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002291 break;
2292 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002293 i = PyObject_IsTrue(v);
2294 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002295 return i == 0;
2296
2297 }
2298 return 0;
2299}
2300
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002301static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002302com_if_stmt(c, n)
2303 struct compiling *c;
2304 node *n;
2305{
2306 int i;
2307 int anchor = 0;
2308 REQ(n, if_stmt);
2309 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2310 for (i = 0; i+3 < NCH(n); i+=4) {
2311 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002312 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002313 if (is_constant_false(c, ch))
2314 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002315 if (i > 0)
2316 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002317 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002318 com_addfwref(c, JUMP_IF_FALSE, &a);
2319 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002320 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002321 com_node(c, CHILD(n, i+3));
2322 com_addfwref(c, JUMP_FORWARD, &anchor);
2323 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002324 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002325 com_addbyte(c, POP_TOP);
2326 }
2327 if (i+2 < NCH(n))
2328 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002329 if (anchor)
2330 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002331}
2332
2333static void
2334com_while_stmt(c, n)
2335 struct compiling *c;
2336 node *n;
2337{
2338 int break_anchor = 0;
2339 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002340 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002341 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2342 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002343 block_push(c, SETUP_LOOP);
2344 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002345 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002346 com_node(c, CHILD(n, 1));
2347 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2348 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002349 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002350 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002351 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002352 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002353 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2354 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002355 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002356 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002357 com_addbyte(c, POP_TOP);
2358 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002359 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002360 if (NCH(n) > 4)
2361 com_node(c, CHILD(n, 6));
2362 com_backpatch(c, break_anchor);
2363}
2364
2365static void
2366com_for_stmt(c, n)
2367 struct compiling *c;
2368 node *n;
2369{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002370 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002371 int break_anchor = 0;
2372 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002373 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002374 REQ(n, for_stmt);
2375 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2376 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002377 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002378 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002379 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002380 if (v == NULL)
2381 c->c_errors++;
2382 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002383 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002384 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002385 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002386 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002387 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002388 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002389 com_assign(c, CHILD(n, 1), OP_ASSIGN);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002390 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002391 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002392 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002393 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2394 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002395 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002396 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002397 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002398 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002399 if (NCH(n) > 8)
2400 com_node(c, CHILD(n, 8));
2401 com_backpatch(c, break_anchor);
2402}
2403
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002404/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002405
2406 SETUP_FINALLY L
2407 <code for S>
2408 POP_BLOCK
2409 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002410 L: <code for Sf>
2411 END_FINALLY
2412
2413 The special instructions use the block stack. Each block
2414 stack entry contains the instruction that created it (here
2415 SETUP_FINALLY), the level of the value stack at the time the
2416 block stack entry was created, and a label (here L).
2417
2418 SETUP_FINALLY:
2419 Pushes the current value stack level and the label
2420 onto the block stack.
2421 POP_BLOCK:
2422 Pops en entry from the block stack, and pops the value
2423 stack until its level is the same as indicated on the
2424 block stack. (The label is ignored.)
2425 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002426 Pops a variable number of entries from the *value* stack
2427 and re-raises the exception they specify. The number of
2428 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002429
2430 The block stack is unwound when an exception is raised:
2431 when a SETUP_FINALLY entry is found, the exception is pushed
2432 onto the value stack (and the exception condition is cleared),
2433 and the interpreter jumps to the label gotten from the block
2434 stack.
2435
2436 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002437 (The contents of the value stack is shown in [], with the top
2438 at the right; 'tb' is trace-back info, 'val' the exception's
2439 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002440
2441 Value stack Label Instruction Argument
2442 [] SETUP_EXCEPT L1
2443 [] <code for S>
2444 [] POP_BLOCK
2445 [] JUMP_FORWARD L0
2446
Guido van Rossum3f5da241990-12-20 15:06:42 +00002447 [tb, val, exc] L1: DUP )
2448 [tb, val, exc, exc] <evaluate E1> )
2449 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2450 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2451 [tb, val, exc, 1] POP )
2452 [tb, val, exc] POP
2453 [tb, val] <assign to V1> (or POP if no V1)
2454 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002455 [] <code for S1>
2456 JUMP_FORWARD L0
2457
Guido van Rossum3f5da241990-12-20 15:06:42 +00002458 [tb, val, exc, 0] L2: POP
2459 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002460 .............................etc.......................
2461
Guido van Rossum3f5da241990-12-20 15:06:42 +00002462 [tb, val, exc, 0] Ln+1: POP
2463 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002464
2465 [] L0: <next statement>
2466
2467 Of course, parts are not generated if Vi or Ei is not present.
2468*/
2469
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002470static void
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002471com_try_except(c, n)
2472 struct compiling *c;
2473 node *n;
2474{
2475 int except_anchor = 0;
2476 int end_anchor = 0;
2477 int else_anchor = 0;
2478 int i;
2479 node *ch;
2480
2481 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2482 block_push(c, SETUP_EXCEPT);
2483 com_node(c, CHILD(n, 2));
2484 com_addbyte(c, POP_BLOCK);
2485 block_pop(c, SETUP_EXCEPT);
2486 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2487 com_backpatch(c, except_anchor);
2488 for (i = 3;
2489 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2490 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002491 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002492 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002493 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002494 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002495 break;
2496 }
2497 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002498 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002499 com_addoparg(c, SET_LINENO, ch->n_lineno);
2500 if (NCH(ch) > 1) {
2501 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002502 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002503 com_node(c, CHILD(ch, 1));
2504 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002505 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002506 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2507 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002508 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002509 }
2510 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002511 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002512 if (NCH(ch) > 3)
Guido van Rossum8861b741996-07-30 16:49:37 +00002513 com_assign(c, CHILD(ch, 3), OP_ASSIGN);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002514 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002515 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002516 com_pop(c, 1);
2517 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002518 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002519 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002520 com_node(c, CHILD(n, i+2));
2521 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2522 if (except_anchor) {
2523 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002524 /* We come in with [tb, val, exc, 0] on the
2525 stack; one pop and it's the same as
2526 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002527 com_addbyte(c, POP_TOP);
2528 }
2529 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002530 /* We actually come in here with [tb, val, exc] but the
2531 END_FINALLY will zap those and jump around.
2532 The c_stacklevel does not reflect them so we need not pop
2533 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002534 com_addbyte(c, END_FINALLY);
2535 com_backpatch(c, else_anchor);
2536 if (i < NCH(n))
2537 com_node(c, CHILD(n, i+2));
2538 com_backpatch(c, end_anchor);
2539}
2540
2541static void
2542com_try_finally(c, n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002543 struct compiling *c;
2544 node *n;
2545{
2546 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002547 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002548
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002549 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2550 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002551 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002552 com_addbyte(c, POP_BLOCK);
2553 block_pop(c, SETUP_FINALLY);
2554 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002555 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002556 /* While the generated code pushes only one item,
2557 the try-finally handling can enter here with
2558 up to three items. OK, here are the details:
2559 3 for an exception, 2 for RETURN, 1 for BREAK. */
2560 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002561 com_backpatch(c, finally_anchor);
2562 ch = CHILD(n, NCH(n)-1);
2563 com_addoparg(c, SET_LINENO, ch->n_lineno);
2564 com_node(c, ch);
2565 com_addbyte(c, END_FINALLY);
2566 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002567 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002568}
2569
2570static void
2571com_try_stmt(c, n)
2572 struct compiling *c;
2573 node *n;
2574{
2575 REQ(n, try_stmt);
2576 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2577 | 'try' ':' suite 'finally' ':' suite */
2578 if (TYPE(CHILD(n, 3)) != except_clause)
2579 com_try_finally(c, n);
2580 else
2581 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002582}
2583
Guido van Rossum8b993a91997-01-17 21:04:03 +00002584static node *
2585get_rawdocstring(n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002586 node *n;
2587{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002588 int i;
2589
Guido van Rossum8b993a91997-01-17 21:04:03 +00002590 /* Label to avoid tail recursion */
2591 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002592 switch (TYPE(n)) {
2593
2594 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002595 if (NCH(n) == 1) {
2596 n = CHILD(n, 0);
2597 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002598 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002599 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002600 case file_input:
2601 for (i = 0; i < NCH(n); i++) {
2602 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002603 if (TYPE(ch) == stmt) {
2604 n = ch;
2605 goto next;
2606 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002607 }
2608 break;
2609
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002610 case stmt:
2611 case simple_stmt:
2612 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002613 n = CHILD(n, 0);
2614 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002615
2616 case expr_stmt:
2617 case testlist:
2618 case test:
2619 case and_test:
2620 case not_test:
2621 case comparison:
2622 case expr:
2623 case xor_expr:
2624 case and_expr:
2625 case shift_expr:
2626 case arith_expr:
2627 case term:
2628 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002629 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002630 if (NCH(n) == 1) {
2631 n = CHILD(n, 0);
2632 goto next;
2633 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002634 break;
2635
2636 case atom:
2637 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002638 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002639 break;
2640
2641 }
2642 return NULL;
2643}
2644
Guido van Rossum79f25d91997-04-29 20:08:16 +00002645static PyObject *
Guido van Rossum8b993a91997-01-17 21:04:03 +00002646get_docstring(n)
2647 node *n;
2648{
Guido van Rossum541563e1999-01-28 15:08:09 +00002649 /* Don't generate doc-strings if run with -OO */
2650 if (Py_OptimizeFlag > 1)
2651 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002652 n = get_rawdocstring(n);
2653 if (n == NULL)
2654 return NULL;
2655 return parsestrplus(n);
2656}
2657
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002658static void
2659com_suite(c, n)
2660 struct compiling *c;
2661 node *n;
2662{
2663 REQ(n, suite);
2664 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2665 if (NCH(n) == 1) {
2666 com_node(c, CHILD(n, 0));
2667 }
2668 else {
2669 int i;
2670 for (i = 0; i < NCH(n); i++) {
2671 node *ch = CHILD(n, i);
2672 if (TYPE(ch) == stmt)
2673 com_node(c, ch);
2674 }
2675 }
2676}
2677
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002678/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002679static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002680com_continue_stmt(c, n)
2681 struct compiling *c;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002682 node *n; /* Not used, but passed for consistency */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002683{
2684 int i = c->c_nblocks;
2685 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2686 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2687 }
2688 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002689 com_error(c, PyExc_SyntaxError,
2690 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002691 }
2692 /* XXX Could allow it inside a 'finally' clause
2693 XXX if we could pop the exception still on the stack */
2694}
2695
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002696static int
Guido van Rossum681d79a1995-07-18 14:51:37 +00002697com_argdefs(c, n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002698 struct compiling *c;
2699 node *n;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002700{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002701 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002702 if (TYPE(n) == lambdef) {
2703 /* lambdef: 'lambda' [varargslist] ':' test */
2704 n = CHILD(n, 1);
2705 }
2706 else {
2707 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2708 n = CHILD(n, 2);
2709 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2710 n = CHILD(n, 1);
2711 }
2712 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002713 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002714 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002715 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002716 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2717 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002718 nargs = 0;
2719 ndefs = 0;
2720 for (i = 0; i < nch; i++) {
2721 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002722 if (TYPE(CHILD(n, i)) == STAR ||
2723 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002724 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002725 nargs++;
2726 i++;
2727 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002728 t = RPAR; /* Anything except EQUAL or COMMA */
2729 else
2730 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002731 if (t == EQUAL) {
2732 i++;
2733 ndefs++;
2734 com_node(c, CHILD(n, i));
2735 i++;
2736 if (i >= nch)
2737 break;
2738 t = TYPE(CHILD(n, i));
2739 }
2740 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00002741 /* Treat "(a=1, b)" as an error */
2742 if (ndefs)
2743 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00002744 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002745 }
2746 if (t != COMMA)
2747 break;
2748 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002749 return ndefs;
2750}
2751
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002752static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002753com_funcdef(c, n)
2754 struct compiling *c;
2755 node *n;
2756{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002757 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002758 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002759 v = (PyObject *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002760 if (v == NULL)
2761 c->c_errors++;
2762 else {
2763 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002764 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002765 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002766 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002767 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002768 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002769 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002770 com_pop(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002771 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002772 }
2773}
2774
2775static void
Guido van Rossum25831651993-05-19 14:50:45 +00002776com_bases(c, n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002777 struct compiling *c;
2778 node *n;
2779{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002780 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002781 REQ(n, testlist);
2782 /* testlist: test (',' test)* [','] */
2783 for (i = 0; i < NCH(n); i += 2)
2784 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002785 i = (NCH(n)+1) / 2;
2786 com_addoparg(c, BUILD_TUPLE, i);
2787 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00002788}
2789
2790static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002791com_classdef(c, n)
2792 struct compiling *c;
2793 node *n;
2794{
Guido van Rossum25831651993-05-19 14:50:45 +00002795 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002796 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002797 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002798 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00002799 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00002800 c->c_errors++;
2801 return;
2802 }
2803 /* Push the class name on the stack */
2804 i = com_addconst(c, v);
2805 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002806 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002807 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00002808 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002809 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00002810 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002811 com_push(c, 1);
2812 }
Guido van Rossum25831651993-05-19 14:50:45 +00002813 else
2814 com_bases(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002815 v = (PyObject *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002816 if (v == NULL)
2817 c->c_errors++;
2818 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002819 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002820 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002821 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002822 com_addoparg(c, MAKE_FUNCTION, 0);
2823 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002824 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002825 com_pop(c, 2);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002826 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002827 Py_DECREF(v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002828 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002829}
2830
2831static void
2832com_node(c, n)
2833 struct compiling *c;
2834 node *n;
2835{
2836 switch (TYPE(n)) {
2837
2838 /* Definition nodes */
2839
2840 case funcdef:
2841 com_funcdef(c, n);
2842 break;
2843 case classdef:
2844 com_classdef(c, n);
2845 break;
2846
2847 /* Trivial parse tree nodes */
2848
2849 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002850 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002851 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002852 com_node(c, CHILD(n, 0));
2853 break;
2854
2855 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002856 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2857 com_addoparg(c, SET_LINENO, n->n_lineno);
2858 {
2859 int i;
2860 for (i = 0; i < NCH(n)-1; i += 2)
2861 com_node(c, CHILD(n, i));
2862 }
2863 break;
2864
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002865 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002866 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002867 com_node(c, CHILD(n, 0));
2868 break;
2869
2870 /* Statement nodes */
2871
2872 case expr_stmt:
2873 com_expr_stmt(c, n);
2874 break;
2875 case print_stmt:
2876 com_print_stmt(c, n);
2877 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002878 case del_stmt: /* 'del' exprlist */
Guido van Rossum8861b741996-07-30 16:49:37 +00002879 com_assign(c, CHILD(n, 1), OP_DELETE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002880 break;
2881 case pass_stmt:
2882 break;
2883 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002884 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002885 com_error(c, PyExc_SyntaxError,
2886 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002887 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002888 com_addbyte(c, BREAK_LOOP);
2889 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002890 case continue_stmt:
2891 com_continue_stmt(c, n);
2892 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002893 case return_stmt:
2894 com_return_stmt(c, n);
2895 break;
2896 case raise_stmt:
2897 com_raise_stmt(c, n);
2898 break;
2899 case import_stmt:
2900 com_import_stmt(c, n);
2901 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002902 case global_stmt:
2903 com_global_stmt(c, n);
2904 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002905 case exec_stmt:
2906 com_exec_stmt(c, n);
2907 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002908 case assert_stmt:
2909 com_assert_stmt(c, n);
2910 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002911 case if_stmt:
2912 com_if_stmt(c, n);
2913 break;
2914 case while_stmt:
2915 com_while_stmt(c, n);
2916 break;
2917 case for_stmt:
2918 com_for_stmt(c, n);
2919 break;
2920 case try_stmt:
2921 com_try_stmt(c, n);
2922 break;
2923 case suite:
2924 com_suite(c, n);
2925 break;
2926
2927 /* Expression nodes */
2928
2929 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002930 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002931 break;
2932 case test:
2933 com_test(c, n);
2934 break;
2935 case and_test:
2936 com_and_test(c, n);
2937 break;
2938 case not_test:
2939 com_not_test(c, n);
2940 break;
2941 case comparison:
2942 com_comparison(c, n);
2943 break;
2944 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002945 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002946 break;
2947 case expr:
2948 com_expr(c, n);
2949 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002950 case xor_expr:
2951 com_xor_expr(c, n);
2952 break;
2953 case and_expr:
2954 com_and_expr(c, n);
2955 break;
2956 case shift_expr:
2957 com_shift_expr(c, n);
2958 break;
2959 case arith_expr:
2960 com_arith_expr(c, n);
2961 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002962 case term:
2963 com_term(c, n);
2964 break;
2965 case factor:
2966 com_factor(c, n);
2967 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00002968 case power:
2969 com_power(c, n);
2970 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002971 case atom:
2972 com_atom(c, n);
2973 break;
2974
2975 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002976 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002977 com_error(c, PyExc_SystemError,
2978 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002979 }
2980}
2981
Guido van Rossum79f25d91997-04-29 20:08:16 +00002982static void com_fplist Py_PROTO((struct compiling *, node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002983
2984static void
2985com_fpdef(c, n)
2986 struct compiling *c;
2987 node *n;
2988{
2989 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
2990 if (TYPE(CHILD(n, 0)) == LPAR)
2991 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002992 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002993 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002994 com_pop(c, 1);
2995 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002996}
2997
2998static void
2999com_fplist(c, n)
3000 struct compiling *c;
3001 node *n;
3002{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003003 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003004 if (NCH(n) == 1) {
3005 com_fpdef(c, CHILD(n, 0));
3006 }
3007 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003008 int i = (NCH(n)+1)/2;
3009 com_addoparg(c, UNPACK_TUPLE, i);
3010 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003011 for (i = 0; i < NCH(n); i += 2)
3012 com_fpdef(c, CHILD(n, i));
3013 }
3014}
3015
3016static void
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003017com_arglist(c, n)
3018 struct compiling *c;
3019 node *n;
3020{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003021 int nch, i;
3022 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003023 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003024 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003025 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003026 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003027 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003028 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003029 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003030 node *ch = CHILD(n, i);
3031 node *fp;
3032 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00003033 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003034 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003035 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3036 fp = CHILD(ch, 0);
3037 if (TYPE(fp) == NAME)
3038 name = STR(fp);
3039 else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003040 name = nbuf;
3041 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003042 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003043 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003044 com_newlocal(c, name);
3045 c->c_argcount++;
3046 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003047 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003048 ch = CHILD(n, i);
3049 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003050 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003051 else
3052 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003053 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003054 /* Handle *arguments */
3055 if (i < nch) {
3056 node *ch;
3057 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003058 if (TYPE(ch) != DOUBLESTAR) {
3059 REQ(ch, STAR);
3060 ch = CHILD(n, i+1);
3061 if (TYPE(ch) == NAME) {
3062 c->c_flags |= CO_VARARGS;
3063 i += 3;
3064 com_newlocal(c, STR(ch));
3065 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003066 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003067 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003068 /* Handle **keywords */
3069 if (i < nch) {
3070 node *ch;
3071 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003072 if (TYPE(ch) != DOUBLESTAR) {
3073 REQ(ch, STAR);
3074 ch = CHILD(n, i+1);
3075 REQ(ch, STAR);
3076 ch = CHILD(n, i+2);
3077 }
3078 else
3079 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003080 REQ(ch, NAME);
3081 c->c_flags |= CO_VARKEYWORDS;
3082 com_newlocal(c, STR(ch));
3083 }
3084 if (complex) {
3085 /* Generate code for complex arguments only after
3086 having counted the simple arguments */
3087 int ilocal = 0;
3088 for (i = 0; i < nch; i++) {
3089 node *ch = CHILD(n, i);
3090 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003091 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003092 break;
3093 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3094 fp = CHILD(ch, 0);
3095 if (TYPE(fp) != NAME) {
3096 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003097 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003098 com_fpdef(c, ch);
3099 }
3100 ilocal++;
3101 if (++i >= nch)
3102 break;
3103 ch = CHILD(n, i);
3104 if (TYPE(ch) == EQUAL)
3105 i += 2;
3106 else
3107 REQ(ch, COMMA);
3108 }
3109 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003110}
3111
3112static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003113com_file_input(c, n)
3114 struct compiling *c;
3115 node *n;
3116{
3117 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003118 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003119 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003120 doc = get_docstring(n);
3121 if (doc != NULL) {
3122 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003123 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003124 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003125 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003126 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003127 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003128 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003129 for (i = 0; i < NCH(n); i++) {
3130 node *ch = CHILD(n, i);
3131 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3132 com_node(c, ch);
3133 }
3134}
3135
3136/* Top-level compile-node interface */
3137
3138static void
3139compile_funcdef(c, n)
3140 struct compiling *c;
3141 node *n;
3142{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003143 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003144 node *ch;
3145 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003146 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003147 doc = get_docstring(CHILD(n, 4));
3148 if (doc != NULL) {
3149 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003150 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003151 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003152 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003153 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003154 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3155 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003156 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003157 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003158 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003159 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003160 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003161 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003162 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003163 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003164 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003165}
3166
3167static void
Guido van Rossum590baa41993-11-30 13:40:46 +00003168compile_lambdef(c, n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003169 struct compiling *c;
3170 node *n;
3171{
Guido van Rossum590baa41993-11-30 13:40:46 +00003172 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003173 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003174 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003175
3176 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003177 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003178 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003179 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003180 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003181 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003182 else
3183 ch = CHILD(n, 2);
3184 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003185 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003186 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003187}
3188
3189static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003190compile_classdef(c, n)
3191 struct compiling *c;
3192 node *n;
3193{
3194 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003195 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003196 REQ(n, classdef);
3197 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3198 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003199#ifdef PRIVATE_NAME_MANGLING
3200 c->c_private = c->c_name;
3201#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003202 ch = CHILD(n, NCH(n)-1); /* The suite */
3203 doc = get_docstring(ch);
3204 if (doc != NULL) {
3205 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003206 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003207 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003208 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003209 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003210 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003211 }
3212 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003213 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003214 com_node(c, ch);
3215 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003216 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003217 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003218 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003219}
3220
3221static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003222compile_node(c, n)
3223 struct compiling *c;
3224 node *n;
3225{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003226 com_addoparg(c, SET_LINENO, n->n_lineno);
3227
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003228 switch (TYPE(n)) {
3229
Guido van Rossum4c417781991-01-21 16:09:22 +00003230 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003231 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003232 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003233 n = CHILD(n, 0);
3234 if (TYPE(n) != NEWLINE)
3235 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003236 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003237 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003238 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003239 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003240 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003241 break;
3242
Guido van Rossum4c417781991-01-21 16:09:22 +00003243 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003244 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003245 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003246 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003247 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003248 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003249 break;
3250
Guido van Rossum590baa41993-11-30 13:40:46 +00003251 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003252 com_node(c, CHILD(n, 0));
3253 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003254 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003255 break;
3256
Guido van Rossum590baa41993-11-30 13:40:46 +00003257 case lambdef: /* anonymous function definition */
3258 compile_lambdef(c, n);
3259 break;
3260
Guido van Rossum4c417781991-01-21 16:09:22 +00003261 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003262 compile_funcdef(c, n);
3263 break;
3264
Guido van Rossum4c417781991-01-21 16:09:22 +00003265 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003266 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003267 break;
3268
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003269 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003270 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003271 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003272 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003273 }
3274}
3275
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003276/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00003277
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003278 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
3279 instructions that refer to local variables with LOAD_FAST etc.
3280 The latter instructions are much faster because they don't need to
3281 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003282
Guido van Rossum681d79a1995-07-18 14:51:37 +00003283 To find all local variables, we check all STORE_NAME, IMPORT_FROM
3284 and DELETE_NAME instructions. This yields all local variables,
3285 function definitions, class definitions and import statements.
3286 Argument names have already been entered into the list by the
3287 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003288
3289 All remaining LOAD_NAME instructions must refer to non-local (global
3290 or builtin) variables, so are replaced by LOAD_GLOBAL.
3291
3292 There are two problems: 'from foo import *' and 'exec' may introduce
3293 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00003294 case, we can still optimize bona fide locals (since those
3295 statements will be surrounded by fast_2_locals() and
3296 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003297
Guido van Rossum681d79a1995-07-18 14:51:37 +00003298 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00003299
3300static void
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003301optimize(c)
3302 struct compiling *c;
Guido van Rossum282914b1991-04-04 10:42:56 +00003303{
Guido van Rossum0a697f61991-04-16 08:39:12 +00003304 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00003305 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00003306 int oparg = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003307 PyObject *name;
3308 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003309
Guido van Rossum282914b1991-04-04 10:42:56 +00003310#define NEXTOP() (*next_instr++)
3311#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossum79f25d91997-04-29 20:08:16 +00003312#define GETITEM(v, i) (PyList_GetItem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003313#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
3314
Guido van Rossum79f25d91997-04-29 20:08:16 +00003315 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003316
3317 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00003318
Guido van Rossum79f25d91997-04-29 20:08:16 +00003319 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003320 for (;;) {
3321 opcode = NEXTOP();
3322 if (opcode == STOP_CODE)
3323 break;
3324 if (HAS_ARG(opcode))
3325 oparg = NEXTARG();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003326 switch (opcode) {
3327 case STORE_NAME:
3328 case DELETE_NAME:
3329 case IMPORT_FROM:
3330 com_addlocal_o(c, GETNAMEOBJ(oparg));
3331 break;
3332 case EXEC_STMT:
3333 c->c_flags &= ~CO_OPTIMIZED;
3334 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00003335 }
3336 }
3337
Guido van Rossum79f25d91997-04-29 20:08:16 +00003338 if (PyDict_GetItemString(c->c_locals, "*") != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003339 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003340
Guido van Rossum79f25d91997-04-29 20:08:16 +00003341 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003342 for (;;) {
3343 cur_instr = next_instr;
3344 opcode = NEXTOP();
3345 if (opcode == STOP_CODE)
3346 break;
3347 if (HAS_ARG(opcode))
3348 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003349 if (opcode == LOAD_NAME ||
3350 opcode == STORE_NAME ||
3351 opcode == DELETE_NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003352 PyObject *v;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003353 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00003354 name = GETNAMEOBJ(oparg);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003355 v = PyDict_GetItem(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003356 if (v == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003357 if (opcode == LOAD_NAME &&
3358 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003359 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003360 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00003361 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003362 i = PyInt_AsLong(v);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003363 switch (opcode) {
3364 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
3365 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
3366 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
3367 }
3368 cur_instr[1] = i & 0xff;
3369 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00003370 }
3371 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003372
Guido van Rossum681d79a1995-07-18 14:51:37 +00003373 if (c->c_errors == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00003374 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00003375}
3376
Guido van Rossum79f25d91997-04-29 20:08:16 +00003377PyCodeObject *
3378PyNode_Compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003379 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003380 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003381{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003382 return jcompile(n, filename, NULL);
3383}
3384
Guido van Rossum79f25d91997-04-29 20:08:16 +00003385static PyCodeObject *
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003386icompile(n, base)
3387 node *n;
3388 struct compiling *base;
3389{
3390 return jcompile(n, base->c_filename, base);
3391}
3392
Guido van Rossum79f25d91997-04-29 20:08:16 +00003393static PyCodeObject *
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003394jcompile(n, filename, base)
3395 node *n;
3396 char *filename;
3397 struct compiling *base;
3398{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003399 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003400 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003401 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003402 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003403#ifdef PRIVATE_NAME_MANGLING
3404 if (base)
3405 sc.c_private = base->c_private;
3406 else
3407 sc.c_private = NULL;
3408#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003409 compile_node(&sc, n);
3410 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003411 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003412 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003413 sc.c_flags |= CO_NEWLOCALS;
3414 }
3415 else if (TYPE(n) == classdef)
3416 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00003417 co = NULL;
3418 if (sc.c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003419 PyObject *consts, *names, *varnames, *filename, *name;
3420 consts = PyList_AsTuple(sc.c_consts);
3421 names = PyList_AsTuple(sc.c_names);
3422 varnames = PyList_AsTuple(sc.c_varnames);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003423 filename = PyString_InternFromString(sc.c_filename);
3424 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003425 if (!PyErr_Occurred())
3426 co = PyCode_New(sc.c_argcount,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003427 sc.c_nlocals,
Guido van Rossum8b993a91997-01-17 21:04:03 +00003428 sc.c_maxstacklevel,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003429 sc.c_flags,
3430 sc.c_code,
3431 consts,
3432 names,
3433 varnames,
3434 filename,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003435 name,
3436 sc.c_firstlineno,
3437 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003438 Py_XDECREF(consts);
3439 Py_XDECREF(names);
3440 Py_XDECREF(varnames);
3441 Py_XDECREF(filename);
3442 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003443 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003444 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003445 return co;
3446}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003447
3448int
3449PyCode_Addr2Line(co, addrq)
3450 PyCodeObject *co;
3451 int addrq;
3452{
3453 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003454 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003455 int line = co->co_firstlineno;
3456 int addr = 0;
3457 while (--size >= 0) {
3458 addr += *p++;
3459 if (addr > addrq)
3460 break;
3461 line += *p++;
3462 }
3463 return line;
3464}