blob: d676b56929429abb9ce380b2e84603b1b874aa33 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum10dc2e81990-11-18 17:27:39 +000032/* Compile an expression node to intermediate code */
33
Guido van Rossum3f5da241990-12-20 15:06:42 +000034/* XXX TO DO:
Guido van Rossum8b993a91997-01-17 21:04:03 +000035 XXX add __doc__ attribute == co_doc to code object attributes?
36 XXX (it's currently the first item of the co_const tuple)
Guido van Rossum3f5da241990-12-20 15:06:42 +000037 XXX Generate simple jump for break/return outside 'try...finally'
Guido van Rossum8b993a91997-01-17 21:04:03 +000038 XXX Allow 'continue' inside try-finally
Guido van Rossum8b993a91997-01-17 21:04:03 +000039 XXX New opcode for loading the initial index for a for loop
Guido van Rossum681d79a1995-07-18 14:51:37 +000040 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000041*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000042
Guido van Rossum8ff077b1996-08-24 06:21:31 +000043#ifndef NO_PRIVATE_NAME_MANGLING
44#define PRIVATE_NAME_MANGLING
45#endif
46
Guido van Rossum79f25d91997-04-29 20:08:16 +000047#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000048
Guido van Rossum10dc2e81990-11-18 17:27:39 +000049#include "node.h"
50#include "token.h"
51#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000052#include "compile.h"
53#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000054#include "structmember.h"
55
56#include <ctype.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000057
Guido van Rossumb05a5c71997-05-07 17:46:13 +000058/* Three symbols from graminit.h are also defined in Python.h, with
59 Py_ prefixes to their names. Python.h can't include graminit.h
60 (which defines too many confusing symbols), but we can check here
61 that they haven't changed (which is very unlikely, but possible). */
62#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000063 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000064#endif
65#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000066 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000067#endif
68#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000069 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000070#endif
71
Guido van Rossum8e793d91997-03-03 19:13:14 +000072int Py_OptimizeFlag = 0;
73
Guido van Rossum8861b741996-07-30 16:49:37 +000074#define OP_DELETE 0
75#define OP_ASSIGN 1
76#define OP_APPLY 2
77
Guido van Rossum79f25d91997-04-29 20:08:16 +000078#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000079
80static struct memberlist code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000081 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
82 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000083 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000084 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000085 {"co_code", T_OBJECT, OFF(co_code), READONLY},
86 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
87 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000088 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000089 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000090 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000091 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
92 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000093 {NULL} /* Sentinel */
94};
95
Guido van Rossum79f25d91997-04-29 20:08:16 +000096static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +000097code_getattr(co, name)
Guido van Rossum79f25d91997-04-29 20:08:16 +000098 PyCodeObject *co;
Guido van Rossum3f5da241990-12-20 15:06:42 +000099 char *name;
100{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000101 return PyMember_Get((char *)co, code_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000102}
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000103
104static void
Guido van Rossum3f5da241990-12-20 15:06:42 +0000105code_dealloc(co)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000106 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000107{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000108 Py_XDECREF(co->co_code);
109 Py_XDECREF(co->co_consts);
110 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000111 Py_XDECREF(co->co_varnames);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000112 Py_XDECREF(co->co_filename);
113 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000114 Py_XDECREF(co->co_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000115 PyMem_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000116}
117
Guido van Rossum79f25d91997-04-29 20:08:16 +0000118static PyObject *
Guido van Rossum2dff9911992-09-03 20:50:59 +0000119code_repr(co)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000120 PyCodeObject *co;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000121{
122 char buf[500];
123 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000124 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000125 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000126
Guido van Rossuma396a882000-04-07 01:21:36 +0000127 if (co->co_firstlineno != 0)
128 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000129 if (co->co_filename && PyString_Check(co->co_filename))
130 filename = PyString_AsString(co->co_filename);
131 if (co->co_name && PyString_Check(co->co_name))
132 name = PyString_AsString(co->co_name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000133 sprintf(buf, "<code object %.100s at %lx, file \"%.300s\", line %d>",
134 name, (long)co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000135 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000136}
137
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000138static int
139code_compare(co, cp)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000140 PyCodeObject *co, *cp;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000141{
142 int cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000143 cmp = co->co_argcount - cp->co_argcount;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000144 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000145 cmp = co->co_nlocals - cp->co_nlocals;
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_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000148 if (cmp) return cmp;
Guido van Rossumd076c731998-10-07 19:42:25 +0000149 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000150 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000151 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
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_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000154 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000155 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000156 return cmp;
157}
158
159static long
160code_hash(co)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000161 PyCodeObject *co;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000162{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000163 long h, h1, h2, h3, h4;
Guido van Rossumd076c731998-10-07 19:42:25 +0000164 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000165 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000166 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000167 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000168 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000169 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000170 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000171 if (h4 == -1) return -1;
172 h = h1 ^ h2 ^ h3 ^ h4 ^
173 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000174 if (h == -1) h = -2;
175 return h;
176}
177
Guido van Rossum79f25d91997-04-29 20:08:16 +0000178PyTypeObject PyCode_Type = {
179 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000180 0,
181 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000182 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000183 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000184 (destructor)code_dealloc, /*tp_dealloc*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000185 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000186 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000187 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000188 (cmpfunc)code_compare, /*tp_compare*/
189 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000190 0, /*tp_as_number*/
191 0, /*tp_as_sequence*/
192 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000193 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000194};
195
Guido van Rossum644a12b1997-04-09 19:24:53 +0000196#define NAME_CHARS \
197 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
198
Guido van Rossum79f25d91997-04-29 20:08:16 +0000199PyCodeObject *
200PyCode_New(argcount, nlocals, stacksize, flags,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000201 code, consts, names, varnames, filename, name,
202 firstlineno, lnotab)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000203 int argcount;
204 int nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000205 int stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000206 int flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000207 PyObject *code;
208 PyObject *consts;
209 PyObject *names;
210 PyObject *varnames;
211 PyObject *filename;
212 PyObject *name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000213 int firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000214 PyObject *lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000215{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000216 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000217 int i;
Guido van Rossumd076c731998-10-07 19:42:25 +0000218 PyBufferProcs *pb;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000219 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000220 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000221 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000222 consts == NULL || !PyTuple_Check(consts) ||
223 names == NULL || !PyTuple_Check(names) ||
224 varnames == NULL || !PyTuple_Check(varnames) ||
225 name == NULL || !PyString_Check(name) ||
226 filename == NULL || !PyString_Check(filename) ||
227 lnotab == NULL || !PyString_Check(lnotab)) {
228 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000229 return NULL;
230 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000231 pb = code->ob_type->tp_as_buffer;
232 if (pb == NULL ||
233 pb->bf_getreadbuffer == NULL ||
234 pb->bf_getsegcount == NULL ||
235 (*pb->bf_getsegcount)(code, NULL) != 1)
236 {
237 PyErr_BadInternalCall();
238 return NULL;
239 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000240 /* Make sure names and varnames are all strings, & intern them */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000241 for (i = PyTuple_Size(names); --i >= 0; ) {
242 PyObject *v = PyTuple_GetItem(names, i);
243 if (v == NULL || !PyString_Check(v)) {
244 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000245 return NULL;
246 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000247 PyString_InternInPlace(&PyTuple_GET_ITEM(names, i));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000248 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000249 for (i = PyTuple_Size(varnames); --i >= 0; ) {
250 PyObject *v = PyTuple_GetItem(varnames, i);
251 if (v == NULL || !PyString_Check(v)) {
252 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000253 return NULL;
254 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000255 PyString_InternInPlace(&PyTuple_GET_ITEM(varnames, i));
256 }
257 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000258 for (i = PyTuple_Size(consts); --i >= 0; ) {
259 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000260 char *p;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000261 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000262 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000263 p = PyString_AsString(v);
Guido van Rossum644a12b1997-04-09 19:24:53 +0000264 if ((int)strspn(p, NAME_CHARS)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000265 != PyString_Size(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000266 continue;
267 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000268 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000269 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000270 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000271 co->co_argcount = argcount;
272 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000273 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000274 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000275 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000276 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000277 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000278 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000279 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000280 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000281 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000282 co->co_varnames = varnames;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000283 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000284 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000285 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000286 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000287 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000288 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000289 co->co_lnotab = lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000290 }
291 return co;
292}
293
294
295/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000296
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000297struct compiling {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000298 PyObject *c_code; /* string */
299 PyObject *c_consts; /* list of objects */
300 PyObject *c_names; /* list of strings (names) */
301 PyObject *c_globals; /* dictionary (value=None) */
302 PyObject *c_locals; /* dictionary (value=localID) */
303 PyObject *c_varnames; /* list (inverse of c_locals) */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000304 int c_nlocals; /* index of next local */
305 int c_argcount; /* number of top-level arguments */
306 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000307 int c_nexti; /* index into c_code */
308 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000309 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000310 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000311 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000312 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000313 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000314 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000315 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000316 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000317 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000318 int c_stacklevel; /* Current stack level */
319 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000320 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000321 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000322 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000323#ifdef PRIVATE_NAME_MANGLING
324 char *c_private; /* for private name mangling */
325#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000326};
327
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000328
Guido van Rossum452a9831996-09-17 14:32:04 +0000329/* Error message including line number */
330
331static void
332com_error(c, exc, msg)
333 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000334 PyObject *exc;
Guido van Rossum452a9831996-09-17 14:32:04 +0000335 char *msg;
336{
337 int n = strlen(msg);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000338 PyObject *v;
Guido van Rossum452a9831996-09-17 14:32:04 +0000339 char buffer[30];
340 char *s;
Guido van Rossum635abd21997-01-06 22:56:52 +0000341 c->c_errors++;
Guido van Rossum452a9831996-09-17 14:32:04 +0000342 if (c->c_lineno <= 1) {
343 /* Unknown line number or single interactive command */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000344 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000345 return;
346 }
347 sprintf(buffer, " (line %d)", c->c_lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000348 v = PyString_FromStringAndSize((char *)NULL, n + strlen(buffer));
Guido van Rossum452a9831996-09-17 14:32:04 +0000349 if (v == NULL)
350 return; /* MemoryError, too bad */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000351 s = PyString_AS_STRING((PyStringObject *)v);
Guido van Rossum452a9831996-09-17 14:32:04 +0000352 strcpy(s, msg);
353 strcat(s, buffer);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000354 PyErr_SetObject(exc, v);
355 Py_DECREF(v);
Guido van Rossum452a9831996-09-17 14:32:04 +0000356}
357
358
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000359/* Interface to the block stack */
360
361static void
362block_push(c, type)
363 struct compiling *c;
364 int type;
365{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000366 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000367 com_error(c, PyExc_SystemError,
368 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000369 }
370 else {
371 c->c_block[c->c_nblocks++] = type;
372 }
373}
374
375static void
376block_pop(c, type)
377 struct compiling *c;
378 int type;
379{
380 if (c->c_nblocks > 0)
381 c->c_nblocks--;
382 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000383 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000384 }
385}
386
387
Guido van Rossum681d79a1995-07-18 14:51:37 +0000388/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000389
Guido van Rossum79f25d91997-04-29 20:08:16 +0000390static int com_init Py_PROTO((struct compiling *, char *));
391static void com_free Py_PROTO((struct compiling *));
392static void com_push Py_PROTO((struct compiling *, int));
393static void com_pop Py_PROTO((struct compiling *, int));
394static void com_done Py_PROTO((struct compiling *));
395static void com_node Py_PROTO((struct compiling *, struct _node *));
396static void com_factor Py_PROTO((struct compiling *, struct _node *));
397static void com_addbyte Py_PROTO((struct compiling *, int));
398static void com_addint Py_PROTO((struct compiling *, int));
399static void com_addoparg Py_PROTO((struct compiling *, int, int));
400static void com_addfwref Py_PROTO((struct compiling *, int, int *));
401static void com_backpatch Py_PROTO((struct compiling *, int));
402static int com_add Py_PROTO((struct compiling *, PyObject *, PyObject *));
403static int com_addconst Py_PROTO((struct compiling *, PyObject *));
404static int com_addname Py_PROTO((struct compiling *, PyObject *));
405static void com_addopname Py_PROTO((struct compiling *, int, node *));
406static void com_list Py_PROTO((struct compiling *, node *, int));
407static int com_argdefs Py_PROTO((struct compiling *, node *));
408static int com_newlocal Py_PROTO((struct compiling *, char *));
409static PyCodeObject *icompile Py_PROTO((struct _node *, struct compiling *));
410static PyCodeObject *jcompile Py_PROTO((struct _node *, char *,
411 struct compiling *));
412static PyObject *parsestrplus Py_PROTO((node *));
413static PyObject *parsestr Py_PROTO((char *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000414
415static int
Guido van Rossum590baa41993-11-30 13:40:46 +0000416com_init(c, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000417 struct compiling *c;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000418 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000419{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000420 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
421 1000)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000422 goto fail_3;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000423 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000424 goto fail_2;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000425 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000426 goto fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000427 if ((c->c_globals = PyDict_New()) == NULL)
Guido van Rossumc5e96291991-12-10 13:53:51 +0000428 goto fail_0;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000429 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000430 goto fail_00;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000431 if ((c->c_varnames = PyList_New(0)) == NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000432 goto fail_000;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000433 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
434 1000)) == NULL)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000435 goto fail_0000;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000436 c->c_nlocals = 0;
437 c->c_argcount = 0;
438 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000439 c->c_nexti = 0;
440 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000441 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000442 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000443 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000444 c->c_begin = 0;
445 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000446 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000447 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000448 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000449 c->c_stacklevel = 0;
450 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000451 c->c_firstlineno = 0;
452 c->c_last_addr = 0;
453 c->c_last_line = 0;
454 c-> c_lnotab_next = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000455 return 1;
456
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000457 fail_0000:
Guido van Rossum72badf51999-12-20 20:40:12 +0000458 Py_DECREF(c->c_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000459 fail_000:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000460 Py_DECREF(c->c_locals);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000461 fail_00:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000462 Py_DECREF(c->c_globals);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000463 fail_0:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000464 Py_DECREF(c->c_names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000465 fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000466 Py_DECREF(c->c_consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000467 fail_2:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000468 Py_DECREF(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000469 fail_3:
470 return 0;
471}
472
473static void
474com_free(c)
475 struct compiling *c;
476{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000477 Py_XDECREF(c->c_code);
478 Py_XDECREF(c->c_consts);
479 Py_XDECREF(c->c_names);
480 Py_XDECREF(c->c_globals);
481 Py_XDECREF(c->c_locals);
482 Py_XDECREF(c->c_varnames);
483 Py_XDECREF(c->c_lnotab);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000484}
485
486static void
Guido van Rossum8b993a91997-01-17 21:04:03 +0000487com_push(c, n)
488 struct compiling *c;
489 int n;
490{
491 c->c_stacklevel += n;
492 if (c->c_stacklevel > c->c_maxstacklevel)
493 c->c_maxstacklevel = c->c_stacklevel;
494}
495
496static void
497com_pop(c, n)
498 struct compiling *c;
499 int n;
500{
501 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000502 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000503 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
504 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000505 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000506 c->c_stacklevel = 0;
507 }
508 else
509 c->c_stacklevel -= n;
510}
511
512static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000513com_done(c)
514 struct compiling *c;
515{
516 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000517 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000518 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000519 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000520}
521
522static void
523com_addbyte(c, byte)
524 struct compiling *c;
525 int byte;
526{
527 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000528 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000529 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000530 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000531 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000532 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000533 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000534 com_error(c, PyExc_SystemError,
535 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000536 }
537 if (c->c_code == NULL)
538 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000539 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000540 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000541 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000542 c->c_errors++;
543 return;
544 }
545 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000546 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000547}
548
549static void
550com_addint(c, x)
551 struct compiling *c;
552 int x;
553{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000554 com_addbyte(c, x & 0xff);
555 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000556}
557
558static void
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000559com_add_lnotab(c, addr, line)
560 struct compiling *c;
561 int addr;
562 int line;
563{
564 int size;
565 char *p;
566 if (c->c_lnotab == NULL)
567 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000568 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000569 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000570 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000571 c->c_errors++;
572 return;
573 }
574 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000575 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000576 *p++ = addr;
577 *p++ = line;
578 c->c_lnotab_next += 2;
579}
580
581static void
582com_set_lineno(c, lineno)
583 struct compiling *c;
584 int lineno;
585{
586 c->c_lineno = lineno;
587 if (c->c_firstlineno == 0) {
588 c->c_firstlineno = c->c_last_line = lineno;
589 }
590 else {
591 int incr_addr = c->c_nexti - c->c_last_addr;
592 int incr_line = lineno - c->c_last_line;
593 while (incr_addr > 0 || incr_line > 0) {
594 int trunc_addr = incr_addr;
595 int trunc_line = incr_line;
596 if (trunc_addr > 255)
597 trunc_addr = 255;
598 if (trunc_line > 255)
599 trunc_line = 255;
600 com_add_lnotab(c, trunc_addr, trunc_line);
601 incr_addr -= trunc_addr;
602 incr_line -= trunc_line;
603 }
604 c->c_last_addr = c->c_nexti;
605 c->c_last_line = lineno;
606 }
607}
608
609static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000610com_addoparg(c, op, arg)
611 struct compiling *c;
612 int op;
613 int arg;
614{
Guido van Rossum8e793d91997-03-03 19:13:14 +0000615 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000616 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000617 if (Py_OptimizeFlag)
618 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000619 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000620 com_addbyte(c, op);
621 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000622}
623
624static void
625com_addfwref(c, op, p_anchor)
626 struct compiling *c;
627 int op;
628 int *p_anchor;
629{
630 /* Compile a forward reference for backpatching */
631 int here;
632 int anchor;
633 com_addbyte(c, op);
634 here = c->c_nexti;
635 anchor = *p_anchor;
636 *p_anchor = here;
637 com_addint(c, anchor == 0 ? 0 : here - anchor);
638}
639
640static void
641com_backpatch(c, anchor)
642 struct compiling *c;
643 int anchor; /* Must be nonzero */
644{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000645 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000646 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000647 int dist;
648 int prev;
649 for (;;) {
650 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000651 prev = code[anchor] + (code[anchor+1] << 8);
652 dist = target - (anchor+2);
653 code[anchor] = dist & 0xff;
654 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000655 if (!prev)
656 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000657 anchor -= prev;
658 }
659}
660
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000661/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000662
663static int
664com_add(c, list, v)
665 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000666 PyObject *list;
667 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000668{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000669 int n = PyList_Size(list);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000670 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +0000671 /* XXX This is quadratic in the number of names per compilation unit.
672 XXX Should use a dictionary. */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000673 for (i = n; --i >= 0; ) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000674 PyObject *w = PyList_GetItem(list, i);
675 if (v->ob_type == w->ob_type && PyObject_Compare(v, w) == 0)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000676 return i;
677 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000678 /* Check for error from PyObject_Compare */
679 if (PyErr_Occurred() || PyList_Append(list, v) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000680 c->c_errors++;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000681 return n;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000682}
683
684static int
685com_addconst(c, v)
686 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000687 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000688{
689 return com_add(c, c->c_consts, v);
690}
691
692static int
693com_addname(c, v)
694 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000695 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000696{
697 return com_add(c, c->c_names, v);
698}
699
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000700#ifdef PRIVATE_NAME_MANGLING
701static int
702com_mangle(c, name, buffer, maxlen)
703 struct compiling *c;
704 char *name;
705 char *buffer;
706 int maxlen;
707{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000708 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000709 This is independent from how the name is used. */
710 char *p;
711 int nlen, plen;
712 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000713 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000714 return 0; /* Don't mangle __extremely_long_names */
715 if (name[nlen-1] == '_' && name[nlen-2] == '_')
716 return 0; /* Don't mangle __whatever__ */
717 p = c->c_private;
718 /* Strip leading underscores from class name */
719 while (*p == '_')
720 p++;
721 if (*p == '\0')
722 return 0; /* Don't mangle if class is just underscores */
723 plen = strlen(p);
724 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000725 plen = maxlen-nlen-2; /* Truncate class name if too long */
726 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000727 buffer[0] = '_';
728 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000729 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000730 /* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
731 return 1;
732}
733#endif
734
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000735static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000736com_addopnamestr(c, op, name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000737 struct compiling *c;
738 int op;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000739 char *name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000740{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000741 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000742 int i;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000743#ifdef PRIVATE_NAME_MANGLING
744 char buffer[256];
745 if (name != NULL && name[0] == '_' && name[1] == '_' &&
746 c->c_private != NULL &&
747 com_mangle(c, name, buffer, (int)sizeof(buffer)))
748 name = buffer;
749#endif
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000750 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000751 c->c_errors++;
752 i = 255;
753 }
754 else {
755 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000756 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000757 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000758 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
759 switch (op) {
760 case LOAD_NAME:
761 case STORE_NAME:
762 case DELETE_NAME:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000763 if (PyDict_GetItemString(c->c_globals, name) != NULL) {
Guido van Rossumc5e96291991-12-10 13:53:51 +0000764 switch (op) {
765 case LOAD_NAME: op = LOAD_GLOBAL; break;
766 case STORE_NAME: op = STORE_GLOBAL; break;
767 case DELETE_NAME: op = DELETE_GLOBAL; break;
768 }
769 }
770 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000771 com_addoparg(c, op, i);
772}
773
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000774static void
775com_addopname(c, op, n)
776 struct compiling *c;
777 int op;
778 node *n;
779{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000780 char *name;
781 char buffer[1000];
782 /* XXX it is possible to write this code without the 1000
783 chars on the total length of dotted names, I just can't be
784 bothered right now */
785 if (TYPE(n) == STAR)
786 name = "*";
787 else if (TYPE(n) == dotted_name) {
788 char *p = buffer;
789 int i;
790 name = buffer;
791 for (i = 0; i < NCH(n); i += 2) {
792 char *s = STR(CHILD(n, i));
793 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000794 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000795 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +0000796 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000797 break;
798 }
799 if (p != buffer)
800 *p++ = '.';
801 strcpy(p, s);
802 p = strchr(p, '\0');
803 }
804 }
805 else {
806 REQ(n, NAME);
807 name = STR(n);
808 }
809 com_addopnamestr(c, op, name);
810}
811
Guido van Rossum79f25d91997-04-29 20:08:16 +0000812static PyObject *
Guido van Rossum452a9831996-09-17 14:32:04 +0000813parsenumber(co, s)
814 struct compiling *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000815 char *s;
816{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000817 extern double atof Py_PROTO((const char *));
Guido van Rossumc5e96291991-12-10 13:53:51 +0000818 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000819 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000820 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +0000821#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +0000822 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +0000823 int imflag;
824#endif
825
Guido van Rossum282914b1991-04-04 10:42:56 +0000826 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000827 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +0000828#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +0000829 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +0000830#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000831 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000832 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000833 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000834 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000835 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000836 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000837 if (*end == '\0') {
838 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000839 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000840 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000841 return NULL;
842 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000843 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000844 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000845 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +0000846#ifndef WITHOUT_COMPLEX
847 if (imflag) {
848 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000849 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +0000850 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000851 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000852 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +0000853 }
Guido van Rossumac1fc951997-10-08 15:23:55 +0000854 else
Guido van Rossum50564e81996-01-12 01:13:16 +0000855#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +0000856 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000857 PyFPE_START_PROTECT("atof", return 0)
858 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000859 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000860 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000861 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000862}
863
Guido van Rossum79f25d91997-04-29 20:08:16 +0000864static PyObject *
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000865parsestr(s)
866 char *s;
867{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000868 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000869 int len;
870 char *buf;
871 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000872 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000873 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +0000874 int first = *s;
875 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000876 int rawmode = 0;
877 int unicode = 0;
878 if (isalpha(quote) || quote == '_') {
879 if (quote == 'u' || quote == 'U') {
880 quote = *++s;
881 unicode = 1;
882 }
883 if (quote == 'r' || quote == 'R') {
884 quote = *++s;
885 rawmode = 1;
886 }
887 }
Guido van Rossum8054fad1993-10-26 15:19:44 +0000888 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000889 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000890 return NULL;
891 }
892 s++;
893 len = strlen(s);
Guido van Rossum8054fad1993-10-26 15:19:44 +0000894 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000895 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000896 return NULL;
897 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000898 if (len >= 4 && s[0] == quote && s[1] == quote) {
899 s += 2;
900 len -= 2;
901 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000902 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000903 return NULL;
904 }
905 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000906 if (unicode) {
907 if (rawmode)
908 return PyUnicode_DecodeRawUnicodeEscape(
909 s, len, NULL);
910 else
911 return PyUnicode_DecodeUnicodeEscape(
912 s, len, NULL);
913 }
914 else if (rawmode || strchr(s, '\\') == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000915 return PyString_FromStringAndSize(s, len);
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000916 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000917 v = PyString_FromStringAndSize((char *)NULL, len);
918 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000919 end = s + len;
920 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000921 if (*s != '\\') {
922 *p++ = *s++;
923 continue;
924 }
925 s++;
926 switch (*s++) {
927 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000928 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000929 case '\\': *p++ = '\\'; break;
930 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000931 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000932 case 'b': *p++ = '\b'; break;
933 case 'f': *p++ = '\014'; break; /* FF */
934 case 't': *p++ = '\t'; break;
935 case 'n': *p++ = '\n'; break;
936 case 'r': *p++ = '\r'; break;
937 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000938 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
939 case '0': case '1': case '2': case '3':
940 case '4': case '5': case '6': case '7':
941 c = s[-1] - '0';
942 if ('0' <= *s && *s <= '7') {
943 c = (c<<3) + *s++ - '0';
944 if ('0' <= *s && *s <= '7')
945 c = (c<<3) + *s++ - '0';
946 }
947 *p++ = c;
948 break;
949 case 'x':
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000950 if (isxdigit(Py_CHARMASK(*s))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000951 unsigned int x = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000952 do {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000953 c = Py_CHARMASK(*s);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000954 s++;
Guido van Rossumed1100f1997-10-20 23:24:07 +0000955 x = (x<<4) & ~0xF;
956 if (isdigit(c))
957 x += c - '0';
958 else if (islower(c))
959 x += 10 + c - 'a';
960 else
961 x += 10 + c - 'A';
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000962 } while (isxdigit(Py_CHARMASK(*s)));
Guido van Rossumed1100f1997-10-20 23:24:07 +0000963 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000964 break;
965 }
966 /* FALLTHROUGH */
967 default: *p++ = '\\'; *p++ = s[-1]; break;
968 }
969 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000970 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000971 return v;
972}
973
Guido van Rossum79f25d91997-04-29 20:08:16 +0000974static PyObject *
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000975parsestrplus(n)
976 node *n;
977{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000978 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000979 int i;
980 REQ(CHILD(n, 0), STRING);
981 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
982 /* String literal concatenation */
983 for (i = 1; i < NCH(n) && v != NULL; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000984 PyString_ConcatAndDel(&v, parsestr(STR(CHILD(n, i))));
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000985 }
986 }
987 return v;
988}
989
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000990static void
991com_list_constructor(c, n)
992 struct compiling *c;
993 node *n;
994{
995 int len;
996 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000997 if (TYPE(n) != testlist)
998 REQ(n, exprlist);
999 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
1000 len = (NCH(n) + 1) / 2;
1001 for (i = 0; i < NCH(n); i += 2)
1002 com_node(c, CHILD(n, i));
1003 com_addoparg(c, BUILD_LIST, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001004 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001005}
1006
1007static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001008com_dictmaker(c, n)
1009 struct compiling *c;
1010 node *n;
1011{
1012 int i;
1013 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1014 for (i = 0; i+2 < NCH(n); i += 4) {
1015 /* We must arrange things just right for STORE_SUBSCR.
1016 It wants the stack to look like (value) (dict) (key) */
1017 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001018 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001019 com_node(c, CHILD(n, i+2)); /* value */
1020 com_addbyte(c, ROT_TWO);
1021 com_node(c, CHILD(n, i)); /* key */
1022 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001023 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001024 }
1025}
1026
1027static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001028com_atom(c, n)
1029 struct compiling *c;
1030 node *n;
1031{
1032 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001033 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001034 int i;
1035 REQ(n, atom);
1036 ch = CHILD(n, 0);
1037 switch (TYPE(ch)) {
1038 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001039 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001040 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001041 com_push(c, 1);
1042 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001043 else
1044 com_node(c, CHILD(n, 1));
1045 break;
1046 case LSQB:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001047 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001048 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001049 com_push(c, 1);
1050 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001051 else
1052 com_list_constructor(c, CHILD(n, 1));
1053 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001054 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001055 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001056 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001057 if (TYPE(CHILD(n, 1)) != RBRACE)
1058 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001059 break;
1060 case BACKQUOTE:
1061 com_node(c, CHILD(n, 1));
1062 com_addbyte(c, UNARY_CONVERT);
1063 break;
1064 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001065 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001066 i = 255;
1067 }
1068 else {
1069 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001070 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001071 }
1072 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001073 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001074 break;
1075 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001076 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001077 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001078 c->c_errors++;
1079 i = 255;
1080 }
1081 else {
1082 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001083 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001084 }
1085 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001086 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001087 break;
1088 case NAME:
1089 com_addopname(c, LOAD_NAME, ch);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001090 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001091 break;
1092 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001093 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001094 com_error(c, PyExc_SystemError,
1095 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001096 }
1097}
1098
1099static void
1100com_slice(c, n, op)
1101 struct compiling *c;
1102 node *n;
1103 int op;
1104{
1105 if (NCH(n) == 1) {
1106 com_addbyte(c, op);
1107 }
1108 else if (NCH(n) == 2) {
1109 if (TYPE(CHILD(n, 0)) != COLON) {
1110 com_node(c, CHILD(n, 0));
1111 com_addbyte(c, op+1);
1112 }
1113 else {
1114 com_node(c, CHILD(n, 1));
1115 com_addbyte(c, op+2);
1116 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001117 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001118 }
1119 else {
1120 com_node(c, CHILD(n, 0));
1121 com_node(c, CHILD(n, 2));
1122 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001123 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001124 }
1125}
1126
Guido van Rossum635abd21997-01-06 22:56:52 +00001127static void
1128com_argument(c, n, pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001129 struct compiling *c;
1130 node *n; /* argument */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001131 PyObject **pkeywords;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001132{
1133 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001134 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001135 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001136 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001137 com_error(c, PyExc_SyntaxError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001138 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001139 }
1140 else {
1141 com_node(c, CHILD(n, 0));
1142 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001143 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001144 }
1145 m = n;
1146 do {
1147 m = CHILD(m, 0);
1148 } while (NCH(m) == 1);
1149 if (TYPE(m) != NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001150 com_error(c, PyExc_SyntaxError,
1151 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001152 }
1153 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001154 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001155 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001156 *pkeywords = PyDict_New();
Guido van Rossum635abd21997-01-06 22:56:52 +00001157 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001158 c->c_errors++;
1159 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001160 if (PyDict_GetItem(*pkeywords, v) != NULL)
1161 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001162 "duplicate keyword argument");
1163 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001164 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001165 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001166 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001167 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001168 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001169 }
1170 }
1171 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001172}
1173
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001174static void
1175com_call_function(c, n)
1176 struct compiling *c;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001177 node *n; /* EITHER arglist OR ')' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001178{
1179 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001180 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001181 }
1182 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001183 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001184 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001185 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001186 int star_flag = 0;
1187 int starstar_flag = 0;
1188 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001189 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001190 na = 0;
1191 nk = 0;
1192 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001193 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001194 if (TYPE(ch) == STAR ||
1195 TYPE(ch) == DOUBLESTAR)
1196 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001197 if (ch->n_lineno != lineno) {
1198 lineno = ch->n_lineno;
1199 com_addoparg(c, SET_LINENO, lineno);
1200 }
1201 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001202 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001203 na++;
1204 else
1205 nk++;
1206 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001207 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001208 while (i < NCH(n)) {
1209 node *tok = CHILD(n, i);
1210 node *ch = CHILD(n, i+1);
1211 i += 3;
1212 switch (TYPE(tok)) {
1213 case STAR: star_flag = 1; break;
1214 case DOUBLESTAR: starstar_flag = 1; break;
1215 }
1216 com_node(c, ch);
1217 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001218 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001219 com_error(c, PyExc_SyntaxError,
1220 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001221 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001222 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001223 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001224 star_flag + (starstar_flag << 1);
1225 else
1226 opcode = CALL_FUNCTION;
1227 com_addoparg(c, opcode, na | (nk << 8));
1228 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001229 }
1230}
1231
1232static void
1233com_select_member(c, n)
1234 struct compiling *c;
1235 node *n;
1236{
1237 com_addopname(c, LOAD_ATTR, n);
1238}
1239
1240static void
Guido van Rossum8861b741996-07-30 16:49:37 +00001241com_sliceobj(c, n)
1242 struct compiling *c;
1243 node *n;
1244{
1245 int i=0;
1246 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001247 node *ch;
1248
1249 /* first argument */
1250 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001251 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001252 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001253 i++;
1254 }
1255 else {
1256 com_node(c, CHILD(n,i));
1257 i++;
1258 REQ(CHILD(n,i),COLON);
1259 i++;
1260 }
1261 /* second argument */
1262 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1263 com_node(c, CHILD(n,i));
1264 i++;
1265 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001266 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001267 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001268 com_push(c, 1);
1269 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001270 /* remaining arguments */
1271 for (; i < NCH(n); i++) {
1272 ns++;
1273 ch=CHILD(n,i);
1274 REQ(ch, sliceop);
1275 if (NCH(ch) == 1) {
1276 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001277 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001278 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001279 }
1280 else
1281 com_node(c, CHILD(ch,1));
1282 }
1283 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001284 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001285}
1286
1287static void
1288com_subscript(c, n)
1289 struct compiling *c;
1290 node *n;
1291{
1292 node *ch;
1293 REQ(n, subscript);
1294 ch = CHILD(n,0);
1295 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001296 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001297 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001298 com_push(c, 1);
1299 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001300 else {
1301 /* check for slice */
1302 if ((TYPE(ch) == COLON || NCH(n) > 1))
1303 com_sliceobj(c, n);
1304 else {
1305 REQ(ch, test);
1306 com_node(c, ch);
1307 }
1308 }
1309}
1310
1311static void
1312com_subscriptlist(c, n, assigning)
1313 struct compiling *c;
1314 node *n;
1315 int assigning;
1316{
1317 int i, op;
1318 REQ(n, subscriptlist);
1319 /* Check to make backward compatible slice behavior for '[i:j]' */
1320 if (NCH(n) == 1) {
1321 node *sub = CHILD(n, 0); /* subscript */
1322 /* Make it is a simple slice.
Guido van Rossum8b993a91997-01-17 21:04:03 +00001323 Should have exactly one colon. */
Guido van Rossum8861b741996-07-30 16:49:37 +00001324 if ((TYPE(CHILD(sub, 0)) == COLON
1325 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
Guido van Rossum8b993a91997-01-17 21:04:03 +00001326 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1327 {
Guido van Rossum8861b741996-07-30 16:49:37 +00001328 if (assigning == OP_APPLY)
1329 op = SLICE;
1330 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001331 op = ((assigning == OP_ASSIGN) ?
1332 STORE_SLICE : DELETE_SLICE);
Guido van Rossum8861b741996-07-30 16:49:37 +00001333 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001334 if (op == STORE_SLICE)
1335 com_pop(c, 2);
1336 else if (op == DELETE_SLICE)
1337 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001338 return;
1339 }
1340 }
1341 /* Else normal subscriptlist. Compile each subscript. */
1342 for (i = 0; i < NCH(n); i += 2)
1343 com_subscript(c, CHILD(n, i));
1344 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001345 if (NCH(n) > 1) {
1346 i = (NCH(n)+1) / 2;
1347 com_addoparg(c, BUILD_TUPLE, i);
1348 com_pop(c, i-1);
1349 }
1350 if (assigning == OP_APPLY) {
Guido van Rossum8861b741996-07-30 16:49:37 +00001351 op = BINARY_SUBSCR;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001352 i = 1;
1353 }
1354 else if (assigning == OP_ASSIGN) {
1355 op = STORE_SUBSCR;
1356 i = 3;
1357 }
1358 else {
1359 op = DELETE_SUBSCR;
1360 i = 2;
1361 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001362 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001363 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001364}
1365
1366static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001367com_apply_trailer(c, n)
1368 struct compiling *c;
1369 node *n;
1370{
1371 REQ(n, trailer);
1372 switch (TYPE(CHILD(n, 0))) {
1373 case LPAR:
1374 com_call_function(c, CHILD(n, 1));
1375 break;
1376 case DOT:
1377 com_select_member(c, CHILD(n, 1));
1378 break;
1379 case LSQB:
Guido van Rossum8861b741996-07-30 16:49:37 +00001380 com_subscriptlist(c, CHILD(n, 1), OP_APPLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001381 break;
1382 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001383 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001384 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001385 }
1386}
1387
1388static void
Guido van Rossum50564e81996-01-12 01:13:16 +00001389com_power(c, n)
1390 struct compiling *c;
1391 node *n;
1392{
1393 int i;
1394 REQ(n, power);
1395 com_atom(c, CHILD(n, 0));
1396 for (i = 1; i < NCH(n); i++) {
1397 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1398 com_factor(c, CHILD(n, i+1));
1399 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001400 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001401 break;
1402 }
1403 else
1404 com_apply_trailer(c, CHILD(n, i));
1405 }
1406}
1407
1408static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001409com_factor(c, n)
1410 struct compiling *c;
1411 node *n;
1412{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001413 REQ(n, factor);
1414 if (TYPE(CHILD(n, 0)) == PLUS) {
1415 com_factor(c, CHILD(n, 1));
1416 com_addbyte(c, UNARY_POSITIVE);
1417 }
1418 else if (TYPE(CHILD(n, 0)) == MINUS) {
1419 com_factor(c, CHILD(n, 1));
1420 com_addbyte(c, UNARY_NEGATIVE);
1421 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001422 else if (TYPE(CHILD(n, 0)) == TILDE) {
1423 com_factor(c, CHILD(n, 1));
1424 com_addbyte(c, UNARY_INVERT);
1425 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001426 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001427 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001428 }
1429}
1430
1431static void
1432com_term(c, n)
1433 struct compiling *c;
1434 node *n;
1435{
1436 int i;
1437 int op;
1438 REQ(n, term);
1439 com_factor(c, CHILD(n, 0));
1440 for (i = 2; i < NCH(n); i += 2) {
1441 com_factor(c, CHILD(n, i));
1442 switch (TYPE(CHILD(n, i-1))) {
1443 case STAR:
1444 op = BINARY_MULTIPLY;
1445 break;
1446 case SLASH:
1447 op = BINARY_DIVIDE;
1448 break;
1449 case PERCENT:
1450 op = BINARY_MODULO;
1451 break;
1452 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001453 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001454 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001455 op = 255;
1456 }
1457 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001458 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001459 }
1460}
1461
1462static void
1463com_arith_expr(c, n)
1464 struct compiling *c;
1465 node *n;
1466{
1467 int i;
1468 int op;
1469 REQ(n, arith_expr);
1470 com_term(c, CHILD(n, 0));
1471 for (i = 2; i < NCH(n); i += 2) {
1472 com_term(c, CHILD(n, i));
1473 switch (TYPE(CHILD(n, i-1))) {
1474 case PLUS:
1475 op = BINARY_ADD;
1476 break;
1477 case MINUS:
1478 op = BINARY_SUBTRACT;
1479 break;
1480 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001481 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001482 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001483 op = 255;
1484 }
1485 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001486 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001487 }
1488}
1489
1490static void
1491com_shift_expr(c, n)
1492 struct compiling *c;
1493 node *n;
1494{
1495 int i;
1496 int op;
1497 REQ(n, shift_expr);
1498 com_arith_expr(c, CHILD(n, 0));
1499 for (i = 2; i < NCH(n); i += 2) {
1500 com_arith_expr(c, CHILD(n, i));
1501 switch (TYPE(CHILD(n, i-1))) {
1502 case LEFTSHIFT:
1503 op = BINARY_LSHIFT;
1504 break;
1505 case RIGHTSHIFT:
1506 op = BINARY_RSHIFT;
1507 break;
1508 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001509 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001510 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001511 op = 255;
1512 }
1513 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001514 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001515 }
1516}
1517
1518static void
1519com_and_expr(c, n)
1520 struct compiling *c;
1521 node *n;
1522{
1523 int i;
1524 int op;
1525 REQ(n, and_expr);
1526 com_shift_expr(c, CHILD(n, 0));
1527 for (i = 2; i < NCH(n); i += 2) {
1528 com_shift_expr(c, CHILD(n, i));
1529 if (TYPE(CHILD(n, i-1)) == AMPER) {
1530 op = BINARY_AND;
1531 }
1532 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001533 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001534 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001535 op = 255;
1536 }
1537 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001538 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001539 }
1540}
1541
1542static void
1543com_xor_expr(c, n)
1544 struct compiling *c;
1545 node *n;
1546{
1547 int i;
1548 int op;
1549 REQ(n, xor_expr);
1550 com_and_expr(c, CHILD(n, 0));
1551 for (i = 2; i < NCH(n); i += 2) {
1552 com_and_expr(c, CHILD(n, i));
1553 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1554 op = BINARY_XOR;
1555 }
1556 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001557 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001558 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001559 op = 255;
1560 }
1561 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001562 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001563 }
1564}
1565
1566static void
1567com_expr(c, n)
1568 struct compiling *c;
1569 node *n;
1570{
1571 int i;
1572 int op;
1573 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001574 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001575 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001576 com_xor_expr(c, CHILD(n, i));
1577 if (TYPE(CHILD(n, i-1)) == VBAR) {
1578 op = BINARY_OR;
1579 }
1580 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001581 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001582 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001583 op = 255;
1584 }
1585 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001586 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001587 }
1588}
1589
1590static enum cmp_op
1591cmp_type(n)
1592 node *n;
1593{
1594 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001595 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001596 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1597 if (NCH(n) == 1) {
1598 n = CHILD(n, 0);
1599 switch (TYPE(n)) {
1600 case LESS: return LT;
1601 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001602 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001603 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001604 case LESSEQUAL: return LE;
1605 case GREATEREQUAL: return GE;
1606 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001607 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1608 if (strcmp(STR(n), "is") == 0) return IS;
1609 }
1610 }
1611 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001612 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001613 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1614 return NOT_IN;
1615 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1616 return IS_NOT;
1617 }
1618 }
1619 return BAD;
1620}
1621
1622static void
1623com_comparison(c, n)
1624 struct compiling *c;
1625 node *n;
1626{
1627 int i;
1628 enum cmp_op op;
1629 int anchor;
1630 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1631 com_expr(c, CHILD(n, 0));
1632 if (NCH(n) == 1)
1633 return;
1634
1635 /****************************************************************
1636 The following code is generated for all but the last
1637 comparison in a chain:
1638
1639 label: on stack: opcode: jump to:
1640
1641 a <code to load b>
1642 a, b DUP_TOP
1643 a, b, b ROT_THREE
1644 b, a, b COMPARE_OP
1645 b, 0-or-1 JUMP_IF_FALSE L1
1646 b, 1 POP_TOP
1647 b
1648
1649 We are now ready to repeat this sequence for the next
1650 comparison in the chain.
1651
1652 For the last we generate:
1653
1654 b <code to load c>
1655 b, c COMPARE_OP
1656 0-or-1
1657
1658 If there were any jumps to L1 (i.e., there was more than one
1659 comparison), we generate:
1660
1661 0-or-1 JUMP_FORWARD L2
1662 L1: b, 0 ROT_TWO
1663 0, b POP_TOP
1664 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00001665 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001666 ****************************************************************/
1667
1668 anchor = 0;
1669
1670 for (i = 2; i < NCH(n); i += 2) {
1671 com_expr(c, CHILD(n, i));
1672 if (i+2 < NCH(n)) {
1673 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001674 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001675 com_addbyte(c, ROT_THREE);
1676 }
1677 op = cmp_type(CHILD(n, i-1));
1678 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001679 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001680 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001681 }
1682 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001683 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001684 if (i+2 < NCH(n)) {
1685 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1686 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001687 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001688 }
1689 }
1690
1691 if (anchor) {
1692 int anchor2 = 0;
1693 com_addfwref(c, JUMP_FORWARD, &anchor2);
1694 com_backpatch(c, anchor);
1695 com_addbyte(c, ROT_TWO);
1696 com_addbyte(c, POP_TOP);
1697 com_backpatch(c, anchor2);
1698 }
1699}
1700
1701static void
1702com_not_test(c, n)
1703 struct compiling *c;
1704 node *n;
1705{
1706 REQ(n, not_test); /* 'not' not_test | comparison */
1707 if (NCH(n) == 1) {
1708 com_comparison(c, CHILD(n, 0));
1709 }
1710 else {
1711 com_not_test(c, CHILD(n, 1));
1712 com_addbyte(c, UNARY_NOT);
1713 }
1714}
1715
1716static void
1717com_and_test(c, n)
1718 struct compiling *c;
1719 node *n;
1720{
1721 int i;
1722 int anchor;
1723 REQ(n, and_test); /* not_test ('and' not_test)* */
1724 anchor = 0;
1725 i = 0;
1726 for (;;) {
1727 com_not_test(c, CHILD(n, i));
1728 if ((i += 2) >= NCH(n))
1729 break;
1730 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1731 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001732 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001733 }
1734 if (anchor)
1735 com_backpatch(c, anchor);
1736}
1737
1738static void
1739com_test(c, n)
1740 struct compiling *c;
1741 node *n;
1742{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001743 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00001744 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001745 PyObject *v;
Guido van Rossum57531fe1993-11-30 14:57:42 +00001746 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001747 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001748 v = (PyObject *) icompile(CHILD(n, 0), c);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001749 if (v == NULL) {
1750 c->c_errors++;
1751 i = 255;
1752 }
1753 else {
1754 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001755 Py_DECREF(v);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001756 }
1757 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001758 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001759 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001760 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001761 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001762 else {
1763 int anchor = 0;
1764 int i = 0;
1765 for (;;) {
1766 com_and_test(c, CHILD(n, i));
1767 if ((i += 2) >= NCH(n))
1768 break;
1769 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1770 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001771 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001772 }
1773 if (anchor)
1774 com_backpatch(c, anchor);
1775 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001776}
1777
1778static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001779com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001780 struct compiling *c;
1781 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001782 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001783{
1784 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001785 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001786 com_node(c, CHILD(n, 0));
1787 }
1788 else {
1789 int i;
1790 int len;
1791 len = (NCH(n) + 1) / 2;
1792 for (i = 0; i < NCH(n); i += 2)
1793 com_node(c, CHILD(n, i));
1794 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001795 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001796 }
1797}
1798
1799
1800/* Begin of assignment compilation */
1801
Guido van Rossum79f25d91997-04-29 20:08:16 +00001802static void com_assign_name Py_PROTO((struct compiling *, node *, int));
1803static void com_assign Py_PROTO((struct compiling *, node *, int));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001804
1805static void
1806com_assign_attr(c, n, assigning)
1807 struct compiling *c;
1808 node *n;
1809 int assigning;
1810{
1811 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001812 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001813}
1814
1815static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001816com_assign_trailer(c, n, assigning)
1817 struct compiling *c;
1818 node *n;
1819 int assigning;
1820{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001821 REQ(n, trailer);
1822 switch (TYPE(CHILD(n, 0))) {
1823 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001824 com_error(c, PyExc_SyntaxError,
1825 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001826 break;
1827 case DOT: /* '.' NAME */
1828 com_assign_attr(c, CHILD(n, 1), assigning);
1829 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001830 case LSQB: /* '[' subscriptlist ']' */
1831 com_subscriptlist(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001832 break;
1833 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001834 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001835 }
1836}
1837
1838static void
1839com_assign_tuple(c, n, assigning)
1840 struct compiling *c;
1841 node *n;
1842 int assigning;
1843{
1844 int i;
1845 if (TYPE(n) != testlist)
1846 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001847 if (assigning) {
1848 i = (NCH(n)+1)/2;
1849 com_addoparg(c, UNPACK_TUPLE, i);
1850 com_push(c, i-1);
1851 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001852 for (i = 0; i < NCH(n); i += 2)
1853 com_assign(c, CHILD(n, i), assigning);
1854}
1855
1856static void
1857com_assign_list(c, n, assigning)
1858 struct compiling *c;
1859 node *n;
1860 int assigning;
1861{
1862 int i;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001863 if (assigning) {
1864 i = (NCH(n)+1)/2;
1865 com_addoparg(c, UNPACK_LIST, i);
1866 com_push(c, i-1);
1867 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001868 for (i = 0; i < NCH(n); i += 2)
1869 com_assign(c, CHILD(n, i), assigning);
1870}
1871
1872static void
1873com_assign_name(c, n, assigning)
1874 struct compiling *c;
1875 node *n;
1876 int assigning;
1877{
1878 REQ(n, NAME);
1879 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001880 if (assigning)
1881 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001882}
1883
1884static void
1885com_assign(c, n, assigning)
1886 struct compiling *c;
1887 node *n;
1888 int assigning;
1889{
1890 /* Loop to avoid trivial recursion */
1891 for (;;) {
1892 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001893
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001894 case exprlist:
1895 case testlist:
1896 if (NCH(n) > 1) {
1897 com_assign_tuple(c, n, assigning);
1898 return;
1899 }
1900 n = CHILD(n, 0);
1901 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001902
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001903 case test:
1904 case and_test:
1905 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001906 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001907 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001908 case xor_expr:
1909 case and_expr:
1910 case shift_expr:
1911 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001912 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00001913 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001914 if (NCH(n) > 1) {
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 operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001917 return;
1918 }
1919 n = CHILD(n, 0);
1920 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001921
Guido van Rossum50564e81996-01-12 01:13:16 +00001922 case power: /* atom trailer* ('**' power)* */
1923/* ('+'|'-'|'~') factor | atom trailer* */
1924 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001925 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001926 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001927 return;
1928 }
Guido van Rossum50564e81996-01-12 01:13:16 +00001929 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001930 int i;
1931 com_node(c, CHILD(n, 0));
1932 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00001933 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001934 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001935 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00001936 return;
1937 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001938 com_apply_trailer(c, CHILD(n, i));
1939 } /* NB i is still alive */
1940 com_assign_trailer(c,
1941 CHILD(n, i), assigning);
1942 return;
1943 }
1944 n = CHILD(n, 0);
1945 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001946
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001947 case atom:
1948 switch (TYPE(CHILD(n, 0))) {
1949 case LPAR:
1950 n = CHILD(n, 1);
1951 if (TYPE(n) == RPAR) {
1952 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001953 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001954 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001955 return;
1956 }
1957 break;
1958 case LSQB:
1959 n = CHILD(n, 1);
1960 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001961 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001962 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001963 return;
1964 }
1965 com_assign_list(c, n, assigning);
1966 return;
1967 case NAME:
1968 com_assign_name(c, CHILD(n, 0), assigning);
1969 return;
1970 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001971 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001972 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001973 return;
1974 }
1975 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001976
1977 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001978 com_error(c, PyExc_SyntaxError,
1979 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001980 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001981
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001982 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001983 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001984 com_error(c, PyExc_SystemError,
1985 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001986 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001987
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001988 }
1989 }
1990}
Guido van Rossum7c531111997-03-11 18:42:21 +00001991
Guido van Rossum79f25d91997-04-29 20:08:16 +00001992/* Forward */ static node *get_rawdocstring Py_PROTO((node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001993
1994static void
1995com_expr_stmt(c, n)
1996 struct compiling *c;
1997 node *n;
1998{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001999 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002000 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002001 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002002 return;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002003 com_node(c, CHILD(n, NCH(n)-1));
2004 if (NCH(n) == 1) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002005 if (c->c_interactive)
2006 com_addbyte(c, PRINT_EXPR);
2007 else
2008 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002009 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002010 }
2011 else {
2012 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002013 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002014 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002015 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002016 com_push(c, 1);
2017 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002018 com_assign(c, CHILD(n, i), OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002019 }
2020 }
2021}
2022
2023static void
Guido van Rossum228d7f31997-04-02 05:24:36 +00002024com_assert_stmt(c, n)
2025 struct compiling *c;
2026 node *n;
2027{
2028 int a = 0, b = 0;
2029 int i;
2030 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2031 /* Generate code like for
2032
2033 if __debug__:
2034 if not <test>:
2035 raise AssertionError [, <message>]
2036
2037 where <message> is the second test, if present.
2038 */
2039 if (Py_OptimizeFlag)
2040 return;
2041 com_addopnamestr(c, LOAD_GLOBAL, "__debug__");
2042 com_push(c, 1);
2043 com_addfwref(c, JUMP_IF_FALSE, &a);
2044 com_addbyte(c, POP_TOP);
2045 com_pop(c, 1);
2046 com_node(c, CHILD(n, 1));
2047 com_addfwref(c, JUMP_IF_TRUE, &b);
2048 com_addbyte(c, POP_TOP);
2049 com_pop(c, 1);
2050 /* Raise that exception! */
2051 com_addopnamestr(c, LOAD_GLOBAL, "AssertionError");
2052 com_push(c, 1);
2053 i = NCH(n)/2; /* Either 2 or 4 */
2054 if (i > 1)
2055 com_node(c, CHILD(n, 3));
2056 com_addoparg(c, RAISE_VARARGS, i);
2057 com_pop(c, i);
2058 /* The interpreter does not fall through */
2059 /* All jumps converge here */
2060 com_backpatch(c, a);
2061 com_backpatch(c, b);
2062 com_addbyte(c, POP_TOP);
2063}
2064
2065static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002066com_print_stmt(c, n)
2067 struct compiling *c;
2068 node *n;
2069{
2070 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002071 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
2072 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002073 com_node(c, CHILD(n, i));
2074 com_addbyte(c, PRINT_ITEM);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002075 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002076 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002077 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002078 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002079 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002080}
2081
2082static void
2083com_return_stmt(c, n)
2084 struct compiling *c;
2085 node *n;
2086{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002087 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002088 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002089 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002090 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002091 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002092 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002093 com_push(c, 1);
2094 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002095 else
2096 com_node(c, CHILD(n, 1));
2097 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002098 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002099}
2100
2101static void
2102com_raise_stmt(c, n)
2103 struct compiling *c;
2104 node *n;
2105{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002106 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002107 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2108 if (NCH(n) > 1) {
2109 com_node(c, CHILD(n, 1));
2110 if (NCH(n) > 3) {
2111 com_node(c, CHILD(n, 3));
2112 if (NCH(n) > 5)
2113 com_node(c, CHILD(n, 5));
2114 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002115 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002116 i = NCH(n)/2;
2117 com_addoparg(c, RAISE_VARARGS, i);
2118 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002119}
2120
2121static void
2122com_import_stmt(c, n)
2123 struct compiling *c;
2124 node *n;
2125{
2126 int i;
2127 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002128 /* 'import' dotted_name (',' dotted_name)* |
2129 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002130 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002131 /* 'from' dotted_name 'import' ... */
2132 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002133 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002134 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002135 for (i = 3; i < NCH(n); i += 2)
2136 com_addopname(c, IMPORT_FROM, CHILD(n, i));
2137 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002138 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002139 }
2140 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002141 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002142 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002143 REQ(CHILD(n, i), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002144 com_addopname(c, IMPORT_NAME, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002145 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002146 com_addopname(c, STORE_NAME, CHILD(CHILD(n, i), 0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002147 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002148 }
2149 }
2150}
2151
2152static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00002153com_global_stmt(c, n)
2154 struct compiling *c;
2155 node *n;
2156{
2157 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002158 REQ(n, global_stmt);
2159 /* 'global' NAME (',' NAME)* */
2160 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002161 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002162#ifdef PRIVATE_NAME_MANGLING
2163 char buffer[256];
2164 if (s != NULL && s[0] == '_' && s[1] == '_' &&
2165 c->c_private != NULL &&
2166 com_mangle(c, s, buffer, (int)sizeof(buffer)))
2167 s = buffer;
2168#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +00002169 if (PyDict_GetItemString(c->c_locals, s) != NULL) {
2170 com_error(c, PyExc_SyntaxError,
2171 "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002172 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002173 else if (PyDict_SetItemString(c->c_globals, s, Py_None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002174 c->c_errors++;
2175 }
2176}
2177
Guido van Rossum681d79a1995-07-18 14:51:37 +00002178static int
2179com_newlocal_o(c, nameval)
2180 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002181 PyObject *nameval;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002182{
2183 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002184 PyObject *ival;
2185 if (PyList_Size(c->c_varnames) != c->c_nlocals) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002186 /* This is usually caused by an error on a previous call */
2187 if (c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002188 com_error(c, PyExc_SystemError,
2189 "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002190 }
2191 return 0;
2192 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002193 ival = PyInt_FromLong(i = c->c_nlocals++);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002194 if (ival == NULL)
2195 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002196 else if (PyDict_SetItem(c->c_locals, nameval, ival) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002197 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002198 else if (PyList_Append(c->c_varnames, nameval) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002199 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002200 Py_XDECREF(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002201 return i;
2202}
2203
2204static int
2205com_addlocal_o(c, nameval)
2206 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002207 PyObject *nameval;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002208{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002209 PyObject *ival = PyDict_GetItem(c->c_locals, nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002210 if (ival != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002211 return PyInt_AsLong(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002212 return com_newlocal_o(c, nameval);
2213}
2214
2215static int
2216com_newlocal(c, name)
2217 struct compiling *c;
2218 char *name;
2219{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002220 PyObject *nameval = PyString_InternFromString(name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002221 int i;
2222 if (nameval == NULL) {
2223 c->c_errors++;
2224 return 0;
2225 }
2226 i = com_newlocal_o(c, nameval);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002227 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002228 return i;
2229}
2230
Guido van Rossumc5e96291991-12-10 13:53:51 +00002231static void
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002232com_exec_stmt(c, n)
2233 struct compiling *c;
2234 node *n;
2235{
2236 REQ(n, exec_stmt);
2237 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2238 com_node(c, CHILD(n, 1));
2239 if (NCH(n) >= 4)
2240 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002241 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002242 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002243 com_push(c, 1);
2244 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002245 if (NCH(n) >= 6)
2246 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002247 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002248 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002249 com_push(c, 1);
2250 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002251 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002252 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002253}
2254
Guido van Rossum7c531111997-03-11 18:42:21 +00002255static int
2256is_constant_false(c, n)
2257 struct compiling *c;
2258 node *n;
2259{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002260 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002261 int i;
2262
2263 /* Label to avoid tail recursion */
2264 next:
2265 switch (TYPE(n)) {
2266
2267 case suite:
2268 if (NCH(n) == 1) {
2269 n = CHILD(n, 0);
2270 goto next;
2271 }
2272 /* Fall through */
2273 case file_input:
2274 for (i = 0; i < NCH(n); i++) {
2275 node *ch = CHILD(n, i);
2276 if (TYPE(ch) == stmt) {
2277 n = ch;
2278 goto next;
2279 }
2280 }
2281 break;
2282
2283 case stmt:
2284 case simple_stmt:
2285 case small_stmt:
2286 n = CHILD(n, 0);
2287 goto next;
2288
2289 case expr_stmt:
2290 case testlist:
2291 case test:
2292 case and_test:
2293 case not_test:
2294 case comparison:
2295 case expr:
2296 case xor_expr:
2297 case and_expr:
2298 case shift_expr:
2299 case arith_expr:
2300 case term:
2301 case factor:
2302 case power:
2303 case atom:
2304 if (NCH(n) == 1) {
2305 n = CHILD(n, 0);
2306 goto next;
2307 }
2308 break;
2309
2310 case NAME:
2311 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2312 return 1;
2313 break;
2314
2315 case NUMBER:
2316 v = parsenumber(c, STR(n));
2317 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002318 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002319 break;
2320 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002321 i = PyObject_IsTrue(v);
2322 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002323 return i == 0;
2324
2325 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002326 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002327 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002328 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002329 break;
2330 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002331 i = PyObject_IsTrue(v);
2332 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002333 return i == 0;
2334
2335 }
2336 return 0;
2337}
2338
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002339static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002340com_if_stmt(c, n)
2341 struct compiling *c;
2342 node *n;
2343{
2344 int i;
2345 int anchor = 0;
2346 REQ(n, if_stmt);
2347 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2348 for (i = 0; i+3 < NCH(n); i+=4) {
2349 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002350 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002351 if (is_constant_false(c, ch))
2352 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002353 if (i > 0)
2354 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002355 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002356 com_addfwref(c, JUMP_IF_FALSE, &a);
2357 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002358 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002359 com_node(c, CHILD(n, i+3));
2360 com_addfwref(c, JUMP_FORWARD, &anchor);
2361 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002362 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002363 com_addbyte(c, POP_TOP);
2364 }
2365 if (i+2 < NCH(n))
2366 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002367 if (anchor)
2368 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002369}
2370
2371static void
2372com_while_stmt(c, n)
2373 struct compiling *c;
2374 node *n;
2375{
2376 int break_anchor = 0;
2377 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002378 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002379 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2380 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002381 block_push(c, SETUP_LOOP);
2382 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002383 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002384 com_node(c, CHILD(n, 1));
2385 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2386 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002387 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002388 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002389 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002390 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002391 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2392 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002393 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002394 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002395 com_addbyte(c, POP_TOP);
2396 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002397 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002398 if (NCH(n) > 4)
2399 com_node(c, CHILD(n, 6));
2400 com_backpatch(c, break_anchor);
2401}
2402
2403static void
2404com_for_stmt(c, n)
2405 struct compiling *c;
2406 node *n;
2407{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002408 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002409 int break_anchor = 0;
2410 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002411 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002412 REQ(n, for_stmt);
2413 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2414 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002415 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002416 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002417 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002418 if (v == NULL)
2419 c->c_errors++;
2420 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002421 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002422 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002423 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002424 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002425 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002426 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002427 com_assign(c, CHILD(n, 1), OP_ASSIGN);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002428 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002429 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002430 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002431 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2432 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002433 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002434 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002435 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002436 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002437 if (NCH(n) > 8)
2438 com_node(c, CHILD(n, 8));
2439 com_backpatch(c, break_anchor);
2440}
2441
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002442/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002443
2444 SETUP_FINALLY L
2445 <code for S>
2446 POP_BLOCK
2447 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002448 L: <code for Sf>
2449 END_FINALLY
2450
2451 The special instructions use the block stack. Each block
2452 stack entry contains the instruction that created it (here
2453 SETUP_FINALLY), the level of the value stack at the time the
2454 block stack entry was created, and a label (here L).
2455
2456 SETUP_FINALLY:
2457 Pushes the current value stack level and the label
2458 onto the block stack.
2459 POP_BLOCK:
2460 Pops en entry from the block stack, and pops the value
2461 stack until its level is the same as indicated on the
2462 block stack. (The label is ignored.)
2463 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002464 Pops a variable number of entries from the *value* stack
2465 and re-raises the exception they specify. The number of
2466 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002467
2468 The block stack is unwound when an exception is raised:
2469 when a SETUP_FINALLY entry is found, the exception is pushed
2470 onto the value stack (and the exception condition is cleared),
2471 and the interpreter jumps to the label gotten from the block
2472 stack.
2473
2474 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002475 (The contents of the value stack is shown in [], with the top
2476 at the right; 'tb' is trace-back info, 'val' the exception's
2477 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002478
2479 Value stack Label Instruction Argument
2480 [] SETUP_EXCEPT L1
2481 [] <code for S>
2482 [] POP_BLOCK
2483 [] JUMP_FORWARD L0
2484
Guido van Rossum3f5da241990-12-20 15:06:42 +00002485 [tb, val, exc] L1: DUP )
2486 [tb, val, exc, exc] <evaluate E1> )
2487 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2488 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2489 [tb, val, exc, 1] POP )
2490 [tb, val, exc] POP
2491 [tb, val] <assign to V1> (or POP if no V1)
2492 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002493 [] <code for S1>
2494 JUMP_FORWARD L0
2495
Guido van Rossum3f5da241990-12-20 15:06:42 +00002496 [tb, val, exc, 0] L2: POP
2497 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002498 .............................etc.......................
2499
Guido van Rossum3f5da241990-12-20 15:06:42 +00002500 [tb, val, exc, 0] Ln+1: POP
2501 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002502
2503 [] L0: <next statement>
2504
2505 Of course, parts are not generated if Vi or Ei is not present.
2506*/
2507
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002508static void
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002509com_try_except(c, n)
2510 struct compiling *c;
2511 node *n;
2512{
2513 int except_anchor = 0;
2514 int end_anchor = 0;
2515 int else_anchor = 0;
2516 int i;
2517 node *ch;
2518
2519 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2520 block_push(c, SETUP_EXCEPT);
2521 com_node(c, CHILD(n, 2));
2522 com_addbyte(c, POP_BLOCK);
2523 block_pop(c, SETUP_EXCEPT);
2524 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2525 com_backpatch(c, except_anchor);
2526 for (i = 3;
2527 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2528 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002529 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002530 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002531 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002532 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002533 break;
2534 }
2535 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002536 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002537 com_addoparg(c, SET_LINENO, ch->n_lineno);
2538 if (NCH(ch) > 1) {
2539 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002540 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002541 com_node(c, CHILD(ch, 1));
2542 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002543 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002544 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2545 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002546 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002547 }
2548 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002549 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002550 if (NCH(ch) > 3)
Guido van Rossum8861b741996-07-30 16:49:37 +00002551 com_assign(c, CHILD(ch, 3), OP_ASSIGN);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002552 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002553 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002554 com_pop(c, 1);
2555 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002556 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002557 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002558 com_node(c, CHILD(n, i+2));
2559 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2560 if (except_anchor) {
2561 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002562 /* We come in with [tb, val, exc, 0] on the
2563 stack; one pop and it's the same as
2564 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002565 com_addbyte(c, POP_TOP);
2566 }
2567 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002568 /* We actually come in here with [tb, val, exc] but the
2569 END_FINALLY will zap those and jump around.
2570 The c_stacklevel does not reflect them so we need not pop
2571 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002572 com_addbyte(c, END_FINALLY);
2573 com_backpatch(c, else_anchor);
2574 if (i < NCH(n))
2575 com_node(c, CHILD(n, i+2));
2576 com_backpatch(c, end_anchor);
2577}
2578
2579static void
2580com_try_finally(c, n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002581 struct compiling *c;
2582 node *n;
2583{
2584 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002585 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002586
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002587 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2588 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002589 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002590 com_addbyte(c, POP_BLOCK);
2591 block_pop(c, SETUP_FINALLY);
2592 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002593 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002594 /* While the generated code pushes only one item,
2595 the try-finally handling can enter here with
2596 up to three items. OK, here are the details:
2597 3 for an exception, 2 for RETURN, 1 for BREAK. */
2598 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002599 com_backpatch(c, finally_anchor);
2600 ch = CHILD(n, NCH(n)-1);
2601 com_addoparg(c, SET_LINENO, ch->n_lineno);
2602 com_node(c, ch);
2603 com_addbyte(c, END_FINALLY);
2604 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002605 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002606}
2607
2608static void
2609com_try_stmt(c, n)
2610 struct compiling *c;
2611 node *n;
2612{
2613 REQ(n, try_stmt);
2614 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2615 | 'try' ':' suite 'finally' ':' suite */
2616 if (TYPE(CHILD(n, 3)) != except_clause)
2617 com_try_finally(c, n);
2618 else
2619 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002620}
2621
Guido van Rossum8b993a91997-01-17 21:04:03 +00002622static node *
2623get_rawdocstring(n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002624 node *n;
2625{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002626 int i;
2627
Guido van Rossum8b993a91997-01-17 21:04:03 +00002628 /* Label to avoid tail recursion */
2629 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002630 switch (TYPE(n)) {
2631
2632 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002633 if (NCH(n) == 1) {
2634 n = CHILD(n, 0);
2635 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002636 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002637 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002638 case file_input:
2639 for (i = 0; i < NCH(n); i++) {
2640 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002641 if (TYPE(ch) == stmt) {
2642 n = ch;
2643 goto next;
2644 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002645 }
2646 break;
2647
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002648 case stmt:
2649 case simple_stmt:
2650 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002651 n = CHILD(n, 0);
2652 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002653
2654 case expr_stmt:
2655 case testlist:
2656 case test:
2657 case and_test:
2658 case not_test:
2659 case comparison:
2660 case expr:
2661 case xor_expr:
2662 case and_expr:
2663 case shift_expr:
2664 case arith_expr:
2665 case term:
2666 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002667 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002668 if (NCH(n) == 1) {
2669 n = CHILD(n, 0);
2670 goto next;
2671 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002672 break;
2673
2674 case atom:
2675 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002676 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002677 break;
2678
2679 }
2680 return NULL;
2681}
2682
Guido van Rossum79f25d91997-04-29 20:08:16 +00002683static PyObject *
Guido van Rossum8b993a91997-01-17 21:04:03 +00002684get_docstring(n)
2685 node *n;
2686{
Guido van Rossum541563e1999-01-28 15:08:09 +00002687 /* Don't generate doc-strings if run with -OO */
2688 if (Py_OptimizeFlag > 1)
2689 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002690 n = get_rawdocstring(n);
2691 if (n == NULL)
2692 return NULL;
2693 return parsestrplus(n);
2694}
2695
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002696static void
2697com_suite(c, n)
2698 struct compiling *c;
2699 node *n;
2700{
2701 REQ(n, suite);
2702 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2703 if (NCH(n) == 1) {
2704 com_node(c, CHILD(n, 0));
2705 }
2706 else {
2707 int i;
2708 for (i = 0; i < NCH(n); i++) {
2709 node *ch = CHILD(n, i);
2710 if (TYPE(ch) == stmt)
2711 com_node(c, ch);
2712 }
2713 }
2714}
2715
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002716/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002717static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002718com_continue_stmt(c, n)
2719 struct compiling *c;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002720 node *n; /* Not used, but passed for consistency */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002721{
2722 int i = c->c_nblocks;
2723 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2724 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2725 }
2726 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002727 com_error(c, PyExc_SyntaxError,
2728 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002729 }
2730 /* XXX Could allow it inside a 'finally' clause
2731 XXX if we could pop the exception still on the stack */
2732}
2733
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002734static int
Guido van Rossum681d79a1995-07-18 14:51:37 +00002735com_argdefs(c, n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002736 struct compiling *c;
2737 node *n;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002738{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002739 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002740 if (TYPE(n) == lambdef) {
2741 /* lambdef: 'lambda' [varargslist] ':' test */
2742 n = CHILD(n, 1);
2743 }
2744 else {
2745 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2746 n = CHILD(n, 2);
2747 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2748 n = CHILD(n, 1);
2749 }
2750 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002751 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002752 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002753 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002754 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2755 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002756 nargs = 0;
2757 ndefs = 0;
2758 for (i = 0; i < nch; i++) {
2759 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002760 if (TYPE(CHILD(n, i)) == STAR ||
2761 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002762 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002763 nargs++;
2764 i++;
2765 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002766 t = RPAR; /* Anything except EQUAL or COMMA */
2767 else
2768 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002769 if (t == EQUAL) {
2770 i++;
2771 ndefs++;
2772 com_node(c, CHILD(n, i));
2773 i++;
2774 if (i >= nch)
2775 break;
2776 t = TYPE(CHILD(n, i));
2777 }
2778 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00002779 /* Treat "(a=1, b)" as an error */
2780 if (ndefs)
2781 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00002782 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002783 }
2784 if (t != COMMA)
2785 break;
2786 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002787 return ndefs;
2788}
2789
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002790static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002791com_funcdef(c, n)
2792 struct compiling *c;
2793 node *n;
2794{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002795 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002796 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002797 v = (PyObject *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002798 if (v == NULL)
2799 c->c_errors++;
2800 else {
2801 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002802 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002803 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002804 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002805 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002806 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002807 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002808 com_pop(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002809 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002810 }
2811}
2812
2813static void
Guido van Rossum25831651993-05-19 14:50:45 +00002814com_bases(c, n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002815 struct compiling *c;
2816 node *n;
2817{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002818 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002819 REQ(n, testlist);
2820 /* testlist: test (',' test)* [','] */
2821 for (i = 0; i < NCH(n); i += 2)
2822 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002823 i = (NCH(n)+1) / 2;
2824 com_addoparg(c, BUILD_TUPLE, i);
2825 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00002826}
2827
2828static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002829com_classdef(c, n)
2830 struct compiling *c;
2831 node *n;
2832{
Guido van Rossum25831651993-05-19 14:50:45 +00002833 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002834 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002835 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002836 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00002837 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00002838 c->c_errors++;
2839 return;
2840 }
2841 /* Push the class name on the stack */
2842 i = com_addconst(c, v);
2843 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002844 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002845 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00002846 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002847 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00002848 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002849 com_push(c, 1);
2850 }
Guido van Rossum25831651993-05-19 14:50:45 +00002851 else
2852 com_bases(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002853 v = (PyObject *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002854 if (v == NULL)
2855 c->c_errors++;
2856 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002857 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002858 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002859 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002860 com_addoparg(c, MAKE_FUNCTION, 0);
2861 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002862 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002863 com_pop(c, 2);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002864 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002865 Py_DECREF(v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002866 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002867}
2868
2869static void
2870com_node(c, n)
2871 struct compiling *c;
2872 node *n;
2873{
2874 switch (TYPE(n)) {
2875
2876 /* Definition nodes */
2877
2878 case funcdef:
2879 com_funcdef(c, n);
2880 break;
2881 case classdef:
2882 com_classdef(c, n);
2883 break;
2884
2885 /* Trivial parse tree nodes */
2886
2887 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002888 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002889 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002890 com_node(c, CHILD(n, 0));
2891 break;
2892
2893 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002894 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2895 com_addoparg(c, SET_LINENO, n->n_lineno);
2896 {
2897 int i;
2898 for (i = 0; i < NCH(n)-1; i += 2)
2899 com_node(c, CHILD(n, i));
2900 }
2901 break;
2902
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002903 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002904 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002905 com_node(c, CHILD(n, 0));
2906 break;
2907
2908 /* Statement nodes */
2909
2910 case expr_stmt:
2911 com_expr_stmt(c, n);
2912 break;
2913 case print_stmt:
2914 com_print_stmt(c, n);
2915 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002916 case del_stmt: /* 'del' exprlist */
Guido van Rossum8861b741996-07-30 16:49:37 +00002917 com_assign(c, CHILD(n, 1), OP_DELETE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002918 break;
2919 case pass_stmt:
2920 break;
2921 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002922 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002923 com_error(c, PyExc_SyntaxError,
2924 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002925 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002926 com_addbyte(c, BREAK_LOOP);
2927 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002928 case continue_stmt:
2929 com_continue_stmt(c, n);
2930 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002931 case return_stmt:
2932 com_return_stmt(c, n);
2933 break;
2934 case raise_stmt:
2935 com_raise_stmt(c, n);
2936 break;
2937 case import_stmt:
2938 com_import_stmt(c, n);
2939 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002940 case global_stmt:
2941 com_global_stmt(c, n);
2942 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002943 case exec_stmt:
2944 com_exec_stmt(c, n);
2945 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002946 case assert_stmt:
2947 com_assert_stmt(c, n);
2948 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002949 case if_stmt:
2950 com_if_stmt(c, n);
2951 break;
2952 case while_stmt:
2953 com_while_stmt(c, n);
2954 break;
2955 case for_stmt:
2956 com_for_stmt(c, n);
2957 break;
2958 case try_stmt:
2959 com_try_stmt(c, n);
2960 break;
2961 case suite:
2962 com_suite(c, n);
2963 break;
2964
2965 /* Expression nodes */
2966
2967 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002968 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002969 break;
2970 case test:
2971 com_test(c, n);
2972 break;
2973 case and_test:
2974 com_and_test(c, n);
2975 break;
2976 case not_test:
2977 com_not_test(c, n);
2978 break;
2979 case comparison:
2980 com_comparison(c, n);
2981 break;
2982 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002983 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002984 break;
2985 case expr:
2986 com_expr(c, n);
2987 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002988 case xor_expr:
2989 com_xor_expr(c, n);
2990 break;
2991 case and_expr:
2992 com_and_expr(c, n);
2993 break;
2994 case shift_expr:
2995 com_shift_expr(c, n);
2996 break;
2997 case arith_expr:
2998 com_arith_expr(c, n);
2999 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003000 case term:
3001 com_term(c, n);
3002 break;
3003 case factor:
3004 com_factor(c, n);
3005 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003006 case power:
3007 com_power(c, n);
3008 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003009 case atom:
3010 com_atom(c, n);
3011 break;
3012
3013 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003014 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003015 com_error(c, PyExc_SystemError,
3016 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003017 }
3018}
3019
Guido van Rossum79f25d91997-04-29 20:08:16 +00003020static void com_fplist Py_PROTO((struct compiling *, node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003021
3022static void
3023com_fpdef(c, n)
3024 struct compiling *c;
3025 node *n;
3026{
3027 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3028 if (TYPE(CHILD(n, 0)) == LPAR)
3029 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003030 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003031 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003032 com_pop(c, 1);
3033 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003034}
3035
3036static void
3037com_fplist(c, n)
3038 struct compiling *c;
3039 node *n;
3040{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003041 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003042 if (NCH(n) == 1) {
3043 com_fpdef(c, CHILD(n, 0));
3044 }
3045 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003046 int i = (NCH(n)+1)/2;
3047 com_addoparg(c, UNPACK_TUPLE, i);
3048 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003049 for (i = 0; i < NCH(n); i += 2)
3050 com_fpdef(c, CHILD(n, i));
3051 }
3052}
3053
3054static void
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003055com_arglist(c, n)
3056 struct compiling *c;
3057 node *n;
3058{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003059 int nch, i;
3060 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003061 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003062 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003063 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003064 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003065 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003066 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003067 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003068 node *ch = CHILD(n, i);
3069 node *fp;
3070 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00003071 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003072 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003073 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3074 fp = CHILD(ch, 0);
3075 if (TYPE(fp) == NAME)
3076 name = STR(fp);
3077 else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003078 name = nbuf;
3079 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003080 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003081 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003082 com_newlocal(c, name);
3083 c->c_argcount++;
3084 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003085 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003086 ch = CHILD(n, i);
3087 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003088 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003089 else
3090 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003091 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003092 /* Handle *arguments */
3093 if (i < nch) {
3094 node *ch;
3095 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003096 if (TYPE(ch) != DOUBLESTAR) {
3097 REQ(ch, STAR);
3098 ch = CHILD(n, i+1);
3099 if (TYPE(ch) == NAME) {
3100 c->c_flags |= CO_VARARGS;
3101 i += 3;
3102 com_newlocal(c, STR(ch));
3103 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003104 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003105 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003106 /* Handle **keywords */
3107 if (i < nch) {
3108 node *ch;
3109 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003110 if (TYPE(ch) != DOUBLESTAR) {
3111 REQ(ch, STAR);
3112 ch = CHILD(n, i+1);
3113 REQ(ch, STAR);
3114 ch = CHILD(n, i+2);
3115 }
3116 else
3117 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003118 REQ(ch, NAME);
3119 c->c_flags |= CO_VARKEYWORDS;
3120 com_newlocal(c, STR(ch));
3121 }
3122 if (complex) {
3123 /* Generate code for complex arguments only after
3124 having counted the simple arguments */
3125 int ilocal = 0;
3126 for (i = 0; i < nch; i++) {
3127 node *ch = CHILD(n, i);
3128 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003129 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003130 break;
3131 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3132 fp = CHILD(ch, 0);
3133 if (TYPE(fp) != NAME) {
3134 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003135 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003136 com_fpdef(c, ch);
3137 }
3138 ilocal++;
3139 if (++i >= nch)
3140 break;
3141 ch = CHILD(n, i);
3142 if (TYPE(ch) == EQUAL)
3143 i += 2;
3144 else
3145 REQ(ch, COMMA);
3146 }
3147 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003148}
3149
3150static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003151com_file_input(c, n)
3152 struct compiling *c;
3153 node *n;
3154{
3155 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003156 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003157 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003158 doc = get_docstring(n);
3159 if (doc != NULL) {
3160 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003161 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003162 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003163 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003164 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003165 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003166 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003167 for (i = 0; i < NCH(n); i++) {
3168 node *ch = CHILD(n, i);
3169 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3170 com_node(c, ch);
3171 }
3172}
3173
3174/* Top-level compile-node interface */
3175
3176static void
3177compile_funcdef(c, n)
3178 struct compiling *c;
3179 node *n;
3180{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003181 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003182 node *ch;
3183 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003184 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003185 doc = get_docstring(CHILD(n, 4));
3186 if (doc != NULL) {
3187 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003188 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003189 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003190 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003191 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003192 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3193 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003194 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003195 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003196 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003197 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003198 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003199 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003200 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003201 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003202 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003203}
3204
3205static void
Guido van Rossum590baa41993-11-30 13:40:46 +00003206compile_lambdef(c, n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003207 struct compiling *c;
3208 node *n;
3209{
Guido van Rossum590baa41993-11-30 13:40:46 +00003210 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003211 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003212 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003213
3214 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003215 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003216 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003217 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003218 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003219 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003220 else
3221 ch = CHILD(n, 2);
3222 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003223 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003224 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003225}
3226
3227static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003228compile_classdef(c, n)
3229 struct compiling *c;
3230 node *n;
3231{
3232 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003233 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003234 REQ(n, classdef);
3235 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3236 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003237#ifdef PRIVATE_NAME_MANGLING
3238 c->c_private = c->c_name;
3239#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003240 ch = CHILD(n, NCH(n)-1); /* The suite */
3241 doc = get_docstring(ch);
3242 if (doc != NULL) {
3243 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003244 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003245 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003246 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003247 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003248 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003249 }
3250 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003251 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003252 com_node(c, ch);
3253 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003254 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003255 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003256 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003257}
3258
3259static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003260compile_node(c, n)
3261 struct compiling *c;
3262 node *n;
3263{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003264 com_addoparg(c, SET_LINENO, n->n_lineno);
3265
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003266 switch (TYPE(n)) {
3267
Guido van Rossum4c417781991-01-21 16:09:22 +00003268 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003269 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003270 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003271 n = CHILD(n, 0);
3272 if (TYPE(n) != NEWLINE)
3273 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003274 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003275 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003276 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003277 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003278 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003279 break;
3280
Guido van Rossum4c417781991-01-21 16:09:22 +00003281 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003282 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003283 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003284 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003285 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003286 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003287 break;
3288
Guido van Rossum590baa41993-11-30 13:40:46 +00003289 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003290 com_node(c, CHILD(n, 0));
3291 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003292 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003293 break;
3294
Guido van Rossum590baa41993-11-30 13:40:46 +00003295 case lambdef: /* anonymous function definition */
3296 compile_lambdef(c, n);
3297 break;
3298
Guido van Rossum4c417781991-01-21 16:09:22 +00003299 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003300 compile_funcdef(c, n);
3301 break;
3302
Guido van Rossum4c417781991-01-21 16:09:22 +00003303 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003304 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003305 break;
3306
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003307 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003308 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003309 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003310 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003311 }
3312}
3313
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003314/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00003315
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003316 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
3317 instructions that refer to local variables with LOAD_FAST etc.
3318 The latter instructions are much faster because they don't need to
3319 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003320
Guido van Rossum681d79a1995-07-18 14:51:37 +00003321 To find all local variables, we check all STORE_NAME, IMPORT_FROM
3322 and DELETE_NAME instructions. This yields all local variables,
3323 function definitions, class definitions and import statements.
3324 Argument names have already been entered into the list by the
3325 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003326
3327 All remaining LOAD_NAME instructions must refer to non-local (global
3328 or builtin) variables, so are replaced by LOAD_GLOBAL.
3329
3330 There are two problems: 'from foo import *' and 'exec' may introduce
3331 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00003332 case, we can still optimize bona fide locals (since those
3333 statements will be surrounded by fast_2_locals() and
3334 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003335
Guido van Rossum681d79a1995-07-18 14:51:37 +00003336 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00003337
3338static void
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003339optimize(c)
3340 struct compiling *c;
Guido van Rossum282914b1991-04-04 10:42:56 +00003341{
Guido van Rossum0a697f61991-04-16 08:39:12 +00003342 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00003343 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00003344 int oparg = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003345 PyObject *name;
3346 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003347
Guido van Rossum282914b1991-04-04 10:42:56 +00003348#define NEXTOP() (*next_instr++)
3349#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossum79f25d91997-04-29 20:08:16 +00003350#define GETITEM(v, i) (PyList_GetItem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003351#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
3352
Guido van Rossum79f25d91997-04-29 20:08:16 +00003353 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003354
3355 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00003356
Guido van Rossum79f25d91997-04-29 20:08:16 +00003357 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003358 for (;;) {
3359 opcode = NEXTOP();
3360 if (opcode == STOP_CODE)
3361 break;
3362 if (HAS_ARG(opcode))
3363 oparg = NEXTARG();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003364 switch (opcode) {
3365 case STORE_NAME:
3366 case DELETE_NAME:
3367 case IMPORT_FROM:
3368 com_addlocal_o(c, GETNAMEOBJ(oparg));
3369 break;
3370 case EXEC_STMT:
3371 c->c_flags &= ~CO_OPTIMIZED;
3372 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00003373 }
3374 }
3375
Guido van Rossum79f25d91997-04-29 20:08:16 +00003376 if (PyDict_GetItemString(c->c_locals, "*") != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003377 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003378
Guido van Rossum79f25d91997-04-29 20:08:16 +00003379 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003380 for (;;) {
3381 cur_instr = next_instr;
3382 opcode = NEXTOP();
3383 if (opcode == STOP_CODE)
3384 break;
3385 if (HAS_ARG(opcode))
3386 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003387 if (opcode == LOAD_NAME ||
3388 opcode == STORE_NAME ||
3389 opcode == DELETE_NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003390 PyObject *v;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003391 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00003392 name = GETNAMEOBJ(oparg);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003393 v = PyDict_GetItem(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003394 if (v == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003395 if (opcode == LOAD_NAME &&
3396 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003397 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003398 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00003399 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003400 i = PyInt_AsLong(v);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003401 switch (opcode) {
3402 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
3403 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
3404 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
3405 }
3406 cur_instr[1] = i & 0xff;
3407 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00003408 }
3409 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003410
Guido van Rossum681d79a1995-07-18 14:51:37 +00003411 if (c->c_errors == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00003412 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00003413}
3414
Guido van Rossum79f25d91997-04-29 20:08:16 +00003415PyCodeObject *
3416PyNode_Compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003417 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003418 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003419{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003420 return jcompile(n, filename, NULL);
3421}
3422
Guido van Rossum79f25d91997-04-29 20:08:16 +00003423static PyCodeObject *
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003424icompile(n, base)
3425 node *n;
3426 struct compiling *base;
3427{
3428 return jcompile(n, base->c_filename, base);
3429}
3430
Guido van Rossum79f25d91997-04-29 20:08:16 +00003431static PyCodeObject *
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003432jcompile(n, filename, base)
3433 node *n;
3434 char *filename;
3435 struct compiling *base;
3436{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003437 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003438 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003439 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003440 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003441#ifdef PRIVATE_NAME_MANGLING
3442 if (base)
3443 sc.c_private = base->c_private;
3444 else
3445 sc.c_private = NULL;
3446#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003447 compile_node(&sc, n);
3448 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003449 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003450 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003451 sc.c_flags |= CO_NEWLOCALS;
3452 }
3453 else if (TYPE(n) == classdef)
3454 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00003455 co = NULL;
3456 if (sc.c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003457 PyObject *consts, *names, *varnames, *filename, *name;
3458 consts = PyList_AsTuple(sc.c_consts);
3459 names = PyList_AsTuple(sc.c_names);
3460 varnames = PyList_AsTuple(sc.c_varnames);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003461 filename = PyString_InternFromString(sc.c_filename);
3462 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003463 if (!PyErr_Occurred())
3464 co = PyCode_New(sc.c_argcount,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003465 sc.c_nlocals,
Guido van Rossum8b993a91997-01-17 21:04:03 +00003466 sc.c_maxstacklevel,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003467 sc.c_flags,
3468 sc.c_code,
3469 consts,
3470 names,
3471 varnames,
3472 filename,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003473 name,
3474 sc.c_firstlineno,
3475 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003476 Py_XDECREF(consts);
3477 Py_XDECREF(names);
3478 Py_XDECREF(varnames);
3479 Py_XDECREF(filename);
3480 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003481 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003482 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003483 return co;
3484}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003485
3486int
3487PyCode_Addr2Line(co, addrq)
3488 PyCodeObject *co;
3489 int addrq;
3490{
3491 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003492 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003493 int line = co->co_firstlineno;
3494 int addr = 0;
3495 while (--size >= 0) {
3496 addr += *p++;
3497 if (addr > addrq)
3498 break;
3499 line += *p++;
3500 }
3501 return line;
3502}