blob: 453aae35e9c225f01819a5a7bdcaacc580966fd8 [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 Rossum44679592000-04-10 16:20:31 +0000143 cmp = PyObject_Compare(co->co_name, cp->co_name);
144 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000145 cmp = co->co_argcount - cp->co_argcount;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000146 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000147 cmp = co->co_nlocals - cp->co_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000148 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000149 cmp = co->co_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000150 if (cmp) return cmp;
Guido van Rossumd076c731998-10-07 19:42:25 +0000151 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000152 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000153 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000154 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000155 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000156 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000157 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000158 return cmp;
159}
160
161static long
162code_hash(co)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000163 PyCodeObject *co;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000164{
Guido van Rossum44679592000-04-10 16:20:31 +0000165 long h, h0, h1, h2, h3, h4;
166 h0 = PyObject_Hash(co->co_name);
167 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000168 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000169 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000170 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000171 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000172 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000173 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000174 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000175 if (h4 == -1) return -1;
Guido van Rossum44679592000-04-10 16:20:31 +0000176 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000177 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000178 if (h == -1) h = -2;
179 return h;
180}
181
Guido van Rossum79f25d91997-04-29 20:08:16 +0000182PyTypeObject PyCode_Type = {
183 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000184 0,
185 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000186 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000187 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000188 (destructor)code_dealloc, /*tp_dealloc*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000189 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000190 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000191 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000192 (cmpfunc)code_compare, /*tp_compare*/
193 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000194 0, /*tp_as_number*/
195 0, /*tp_as_sequence*/
196 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000197 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000198};
199
Guido van Rossum644a12b1997-04-09 19:24:53 +0000200#define NAME_CHARS \
201 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
202
Guido van Rossum79f25d91997-04-29 20:08:16 +0000203PyCodeObject *
204PyCode_New(argcount, nlocals, stacksize, flags,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000205 code, consts, names, varnames, filename, name,
206 firstlineno, lnotab)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000207 int argcount;
208 int nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000209 int stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000210 int flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000211 PyObject *code;
212 PyObject *consts;
213 PyObject *names;
214 PyObject *varnames;
215 PyObject *filename;
216 PyObject *name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000217 int firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000218 PyObject *lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000219{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000220 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000221 int i;
Guido van Rossumd076c731998-10-07 19:42:25 +0000222 PyBufferProcs *pb;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000223 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000224 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000225 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000226 consts == NULL || !PyTuple_Check(consts) ||
227 names == NULL || !PyTuple_Check(names) ||
228 varnames == NULL || !PyTuple_Check(varnames) ||
229 name == NULL || !PyString_Check(name) ||
230 filename == NULL || !PyString_Check(filename) ||
231 lnotab == NULL || !PyString_Check(lnotab)) {
232 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000233 return NULL;
234 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000235 pb = code->ob_type->tp_as_buffer;
236 if (pb == NULL ||
237 pb->bf_getreadbuffer == NULL ||
238 pb->bf_getsegcount == NULL ||
239 (*pb->bf_getsegcount)(code, NULL) != 1)
240 {
241 PyErr_BadInternalCall();
242 return NULL;
243 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000244 /* Make sure names and varnames are all strings, & intern them */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000245 for (i = PyTuple_Size(names); --i >= 0; ) {
246 PyObject *v = PyTuple_GetItem(names, i);
247 if (v == NULL || !PyString_Check(v)) {
248 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000249 return NULL;
250 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000251 PyString_InternInPlace(&PyTuple_GET_ITEM(names, i));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000252 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000253 for (i = PyTuple_Size(varnames); --i >= 0; ) {
254 PyObject *v = PyTuple_GetItem(varnames, i);
255 if (v == NULL || !PyString_Check(v)) {
256 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000257 return NULL;
258 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000259 PyString_InternInPlace(&PyTuple_GET_ITEM(varnames, i));
260 }
261 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000262 for (i = PyTuple_Size(consts); --i >= 0; ) {
263 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000264 char *p;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000265 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000266 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000267 p = PyString_AsString(v);
Guido van Rossum644a12b1997-04-09 19:24:53 +0000268 if ((int)strspn(p, NAME_CHARS)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000269 != PyString_Size(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000270 continue;
271 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000272 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000273 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000274 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000275 co->co_argcount = argcount;
276 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000277 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000278 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000279 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000280 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000281 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000282 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000283 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000284 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000285 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000286 co->co_varnames = varnames;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000287 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000288 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000289 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000290 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000291 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000292 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000293 co->co_lnotab = lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000294 }
295 return co;
296}
297
298
299/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000300
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000301struct compiling {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000302 PyObject *c_code; /* string */
303 PyObject *c_consts; /* list of objects */
304 PyObject *c_names; /* list of strings (names) */
305 PyObject *c_globals; /* dictionary (value=None) */
306 PyObject *c_locals; /* dictionary (value=localID) */
307 PyObject *c_varnames; /* list (inverse of c_locals) */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000308 int c_nlocals; /* index of next local */
309 int c_argcount; /* number of top-level arguments */
310 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000311 int c_nexti; /* index into c_code */
312 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000313 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000314 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000315 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000316 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000317 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000318 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000319 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000320 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000321 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000322 int c_stacklevel; /* Current stack level */
323 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000324 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000325 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000326 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000327#ifdef PRIVATE_NAME_MANGLING
328 char *c_private; /* for private name mangling */
329#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000330};
331
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000332
Guido van Rossum452a9831996-09-17 14:32:04 +0000333/* Error message including line number */
334
335static void
336com_error(c, exc, msg)
337 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000338 PyObject *exc;
Guido van Rossum452a9831996-09-17 14:32:04 +0000339 char *msg;
340{
341 int n = strlen(msg);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000342 PyObject *v;
Guido van Rossum452a9831996-09-17 14:32:04 +0000343 char buffer[30];
344 char *s;
Guido van Rossum635abd21997-01-06 22:56:52 +0000345 c->c_errors++;
Guido van Rossum452a9831996-09-17 14:32:04 +0000346 if (c->c_lineno <= 1) {
347 /* Unknown line number or single interactive command */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000348 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000349 return;
350 }
351 sprintf(buffer, " (line %d)", c->c_lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000352 v = PyString_FromStringAndSize((char *)NULL, n + strlen(buffer));
Guido van Rossum452a9831996-09-17 14:32:04 +0000353 if (v == NULL)
354 return; /* MemoryError, too bad */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000355 s = PyString_AS_STRING((PyStringObject *)v);
Guido van Rossum452a9831996-09-17 14:32:04 +0000356 strcpy(s, msg);
357 strcat(s, buffer);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000358 PyErr_SetObject(exc, v);
359 Py_DECREF(v);
Guido van Rossum452a9831996-09-17 14:32:04 +0000360}
361
362
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000363/* Interface to the block stack */
364
365static void
366block_push(c, type)
367 struct compiling *c;
368 int type;
369{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000370 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000371 com_error(c, PyExc_SystemError,
372 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000373 }
374 else {
375 c->c_block[c->c_nblocks++] = type;
376 }
377}
378
379static void
380block_pop(c, type)
381 struct compiling *c;
382 int type;
383{
384 if (c->c_nblocks > 0)
385 c->c_nblocks--;
386 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000387 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000388 }
389}
390
391
Guido van Rossum681d79a1995-07-18 14:51:37 +0000392/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000393
Guido van Rossum79f25d91997-04-29 20:08:16 +0000394static int com_init Py_PROTO((struct compiling *, char *));
395static void com_free Py_PROTO((struct compiling *));
396static void com_push Py_PROTO((struct compiling *, int));
397static void com_pop Py_PROTO((struct compiling *, int));
398static void com_done Py_PROTO((struct compiling *));
399static void com_node Py_PROTO((struct compiling *, struct _node *));
400static void com_factor Py_PROTO((struct compiling *, struct _node *));
401static void com_addbyte Py_PROTO((struct compiling *, int));
402static void com_addint Py_PROTO((struct compiling *, int));
403static void com_addoparg Py_PROTO((struct compiling *, int, int));
404static void com_addfwref Py_PROTO((struct compiling *, int, int *));
405static void com_backpatch Py_PROTO((struct compiling *, int));
406static int com_add Py_PROTO((struct compiling *, PyObject *, PyObject *));
407static int com_addconst Py_PROTO((struct compiling *, PyObject *));
408static int com_addname Py_PROTO((struct compiling *, PyObject *));
409static void com_addopname Py_PROTO((struct compiling *, int, node *));
410static void com_list Py_PROTO((struct compiling *, node *, int));
411static int com_argdefs Py_PROTO((struct compiling *, node *));
412static int com_newlocal Py_PROTO((struct compiling *, char *));
413static PyCodeObject *icompile Py_PROTO((struct _node *, struct compiling *));
414static PyCodeObject *jcompile Py_PROTO((struct _node *, char *,
415 struct compiling *));
416static PyObject *parsestrplus Py_PROTO((node *));
417static PyObject *parsestr Py_PROTO((char *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000418
419static int
Guido van Rossum590baa41993-11-30 13:40:46 +0000420com_init(c, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000421 struct compiling *c;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000422 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000423{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000424 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
425 1000)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000426 goto fail_3;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000427 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000428 goto fail_2;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000429 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000430 goto fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000431 if ((c->c_globals = PyDict_New()) == NULL)
Guido van Rossumc5e96291991-12-10 13:53:51 +0000432 goto fail_0;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000433 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000434 goto fail_00;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000435 if ((c->c_varnames = PyList_New(0)) == NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000436 goto fail_000;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000437 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
438 1000)) == NULL)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000439 goto fail_0000;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000440 c->c_nlocals = 0;
441 c->c_argcount = 0;
442 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000443 c->c_nexti = 0;
444 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000445 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000446 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000447 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000448 c->c_begin = 0;
449 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000450 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000451 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000452 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000453 c->c_stacklevel = 0;
454 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000455 c->c_firstlineno = 0;
456 c->c_last_addr = 0;
457 c->c_last_line = 0;
458 c-> c_lnotab_next = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000459 return 1;
460
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000461 fail_0000:
Guido van Rossum72badf51999-12-20 20:40:12 +0000462 Py_DECREF(c->c_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000463 fail_000:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000464 Py_DECREF(c->c_locals);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000465 fail_00:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000466 Py_DECREF(c->c_globals);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000467 fail_0:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000468 Py_DECREF(c->c_names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000469 fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000470 Py_DECREF(c->c_consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000471 fail_2:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000472 Py_DECREF(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000473 fail_3:
474 return 0;
475}
476
477static void
478com_free(c)
479 struct compiling *c;
480{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000481 Py_XDECREF(c->c_code);
482 Py_XDECREF(c->c_consts);
483 Py_XDECREF(c->c_names);
484 Py_XDECREF(c->c_globals);
485 Py_XDECREF(c->c_locals);
486 Py_XDECREF(c->c_varnames);
487 Py_XDECREF(c->c_lnotab);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000488}
489
490static void
Guido van Rossum8b993a91997-01-17 21:04:03 +0000491com_push(c, n)
492 struct compiling *c;
493 int n;
494{
495 c->c_stacklevel += n;
496 if (c->c_stacklevel > c->c_maxstacklevel)
497 c->c_maxstacklevel = c->c_stacklevel;
498}
499
500static void
501com_pop(c, n)
502 struct compiling *c;
503 int n;
504{
505 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000506 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000507 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
508 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000509 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000510 c->c_stacklevel = 0;
511 }
512 else
513 c->c_stacklevel -= n;
514}
515
516static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000517com_done(c)
518 struct compiling *c;
519{
520 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000521 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000522 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000523 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000524}
525
526static void
527com_addbyte(c, byte)
528 struct compiling *c;
529 int byte;
530{
531 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000532 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000533 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000534 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000535 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000536 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000537 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000538 com_error(c, PyExc_SystemError,
539 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000540 }
541 if (c->c_code == NULL)
542 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000543 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000544 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000545 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000546 c->c_errors++;
547 return;
548 }
549 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000550 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000551}
552
553static void
554com_addint(c, x)
555 struct compiling *c;
556 int x;
557{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000558 com_addbyte(c, x & 0xff);
559 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000560}
561
562static void
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000563com_add_lnotab(c, addr, line)
564 struct compiling *c;
565 int addr;
566 int line;
567{
568 int size;
569 char *p;
570 if (c->c_lnotab == NULL)
571 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000572 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000573 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000574 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000575 c->c_errors++;
576 return;
577 }
578 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000579 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000580 *p++ = addr;
581 *p++ = line;
582 c->c_lnotab_next += 2;
583}
584
585static void
586com_set_lineno(c, lineno)
587 struct compiling *c;
588 int lineno;
589{
590 c->c_lineno = lineno;
591 if (c->c_firstlineno == 0) {
592 c->c_firstlineno = c->c_last_line = lineno;
593 }
594 else {
595 int incr_addr = c->c_nexti - c->c_last_addr;
596 int incr_line = lineno - c->c_last_line;
597 while (incr_addr > 0 || incr_line > 0) {
598 int trunc_addr = incr_addr;
599 int trunc_line = incr_line;
600 if (trunc_addr > 255)
601 trunc_addr = 255;
602 if (trunc_line > 255)
603 trunc_line = 255;
604 com_add_lnotab(c, trunc_addr, trunc_line);
605 incr_addr -= trunc_addr;
606 incr_line -= trunc_line;
607 }
608 c->c_last_addr = c->c_nexti;
609 c->c_last_line = lineno;
610 }
611}
612
613static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000614com_addoparg(c, op, arg)
615 struct compiling *c;
616 int op;
617 int arg;
618{
Guido van Rossum8e793d91997-03-03 19:13:14 +0000619 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000620 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000621 if (Py_OptimizeFlag)
622 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000623 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000624 com_addbyte(c, op);
625 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000626}
627
628static void
629com_addfwref(c, op, p_anchor)
630 struct compiling *c;
631 int op;
632 int *p_anchor;
633{
634 /* Compile a forward reference for backpatching */
635 int here;
636 int anchor;
637 com_addbyte(c, op);
638 here = c->c_nexti;
639 anchor = *p_anchor;
640 *p_anchor = here;
641 com_addint(c, anchor == 0 ? 0 : here - anchor);
642}
643
644static void
645com_backpatch(c, anchor)
646 struct compiling *c;
647 int anchor; /* Must be nonzero */
648{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000649 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000650 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000651 int dist;
652 int prev;
653 for (;;) {
654 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000655 prev = code[anchor] + (code[anchor+1] << 8);
656 dist = target - (anchor+2);
657 code[anchor] = dist & 0xff;
658 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000659 if (!prev)
660 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000661 anchor -= prev;
662 }
663}
664
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000665/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000666
667static int
668com_add(c, list, v)
669 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000670 PyObject *list;
671 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000672{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000673 int n = PyList_Size(list);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000674 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +0000675 /* XXX This is quadratic in the number of names per compilation unit.
676 XXX Should use a dictionary. */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000677 for (i = n; --i >= 0; ) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000678 PyObject *w = PyList_GetItem(list, i);
679 if (v->ob_type == w->ob_type && PyObject_Compare(v, w) == 0)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000680 return i;
681 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000682 /* Check for error from PyObject_Compare */
683 if (PyErr_Occurred() || PyList_Append(list, v) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000684 c->c_errors++;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000685 return n;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000686}
687
688static int
689com_addconst(c, v)
690 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000691 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000692{
693 return com_add(c, c->c_consts, v);
694}
695
696static int
697com_addname(c, v)
698 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000699 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000700{
701 return com_add(c, c->c_names, v);
702}
703
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000704#ifdef PRIVATE_NAME_MANGLING
705static int
706com_mangle(c, name, buffer, maxlen)
707 struct compiling *c;
708 char *name;
709 char *buffer;
710 int maxlen;
711{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000712 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000713 This is independent from how the name is used. */
714 char *p;
715 int nlen, plen;
716 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000717 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000718 return 0; /* Don't mangle __extremely_long_names */
719 if (name[nlen-1] == '_' && name[nlen-2] == '_')
720 return 0; /* Don't mangle __whatever__ */
721 p = c->c_private;
722 /* Strip leading underscores from class name */
723 while (*p == '_')
724 p++;
725 if (*p == '\0')
726 return 0; /* Don't mangle if class is just underscores */
727 plen = strlen(p);
728 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000729 plen = maxlen-nlen-2; /* Truncate class name if too long */
730 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000731 buffer[0] = '_';
732 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000733 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000734 /* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
735 return 1;
736}
737#endif
738
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000739static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000740com_addopnamestr(c, op, name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000741 struct compiling *c;
742 int op;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000743 char *name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000744{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000745 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000746 int i;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000747#ifdef PRIVATE_NAME_MANGLING
748 char buffer[256];
749 if (name != NULL && name[0] == '_' && name[1] == '_' &&
750 c->c_private != NULL &&
751 com_mangle(c, name, buffer, (int)sizeof(buffer)))
752 name = buffer;
753#endif
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000754 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000755 c->c_errors++;
756 i = 255;
757 }
758 else {
759 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000760 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000761 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000762 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
763 switch (op) {
764 case LOAD_NAME:
765 case STORE_NAME:
766 case DELETE_NAME:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000767 if (PyDict_GetItemString(c->c_globals, name) != NULL) {
Guido van Rossumc5e96291991-12-10 13:53:51 +0000768 switch (op) {
769 case LOAD_NAME: op = LOAD_GLOBAL; break;
770 case STORE_NAME: op = STORE_GLOBAL; break;
771 case DELETE_NAME: op = DELETE_GLOBAL; break;
772 }
773 }
774 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000775 com_addoparg(c, op, i);
776}
777
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000778static void
779com_addopname(c, op, n)
780 struct compiling *c;
781 int op;
782 node *n;
783{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000784 char *name;
785 char buffer[1000];
786 /* XXX it is possible to write this code without the 1000
787 chars on the total length of dotted names, I just can't be
788 bothered right now */
789 if (TYPE(n) == STAR)
790 name = "*";
791 else if (TYPE(n) == dotted_name) {
792 char *p = buffer;
793 int i;
794 name = buffer;
795 for (i = 0; i < NCH(n); i += 2) {
796 char *s = STR(CHILD(n, i));
797 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000798 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000799 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +0000800 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000801 break;
802 }
803 if (p != buffer)
804 *p++ = '.';
805 strcpy(p, s);
806 p = strchr(p, '\0');
807 }
808 }
809 else {
810 REQ(n, NAME);
811 name = STR(n);
812 }
813 com_addopnamestr(c, op, name);
814}
815
Guido van Rossum79f25d91997-04-29 20:08:16 +0000816static PyObject *
Guido van Rossum452a9831996-09-17 14:32:04 +0000817parsenumber(co, s)
818 struct compiling *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000819 char *s;
820{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000821 extern double atof Py_PROTO((const char *));
Guido van Rossumc5e96291991-12-10 13:53:51 +0000822 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000823 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000824 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +0000825#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +0000826 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +0000827 int imflag;
828#endif
829
Guido van Rossum282914b1991-04-04 10:42:56 +0000830 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000831 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +0000832#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +0000833 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +0000834#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000835 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000836 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000837 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000838 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000839 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000840 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000841 if (*end == '\0') {
842 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000843 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000844 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000845 return NULL;
846 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000847 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000848 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000849 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +0000850#ifndef WITHOUT_COMPLEX
851 if (imflag) {
852 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000853 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +0000854 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000855 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000856 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +0000857 }
Guido van Rossumac1fc951997-10-08 15:23:55 +0000858 else
Guido van Rossum50564e81996-01-12 01:13:16 +0000859#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +0000860 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000861 PyFPE_START_PROTECT("atof", return 0)
862 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000863 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000864 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000865 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000866}
867
Guido van Rossum79f25d91997-04-29 20:08:16 +0000868static PyObject *
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000869parsestr(s)
870 char *s;
871{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000872 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000873 int len;
874 char *buf;
875 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000876 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000877 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +0000878 int first = *s;
879 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000880 int rawmode = 0;
881 int unicode = 0;
882 if (isalpha(quote) || quote == '_') {
883 if (quote == 'u' || quote == 'U') {
884 quote = *++s;
885 unicode = 1;
886 }
887 if (quote == 'r' || quote == 'R') {
888 quote = *++s;
889 rawmode = 1;
890 }
891 }
Guido van Rossum8054fad1993-10-26 15:19:44 +0000892 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000893 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000894 return NULL;
895 }
896 s++;
897 len = strlen(s);
Guido van Rossum8054fad1993-10-26 15:19:44 +0000898 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000899 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000900 return NULL;
901 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000902 if (len >= 4 && s[0] == quote && s[1] == quote) {
903 s += 2;
904 len -= 2;
905 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000906 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000907 return NULL;
908 }
909 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000910 if (unicode) {
911 if (rawmode)
912 return PyUnicode_DecodeRawUnicodeEscape(
913 s, len, NULL);
914 else
915 return PyUnicode_DecodeUnicodeEscape(
916 s, len, NULL);
917 }
918 else if (rawmode || strchr(s, '\\') == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000919 return PyString_FromStringAndSize(s, len);
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000920 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000921 v = PyString_FromStringAndSize((char *)NULL, len);
922 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000923 end = s + len;
924 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000925 if (*s != '\\') {
926 *p++ = *s++;
927 continue;
928 }
929 s++;
930 switch (*s++) {
931 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000932 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000933 case '\\': *p++ = '\\'; break;
934 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000935 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000936 case 'b': *p++ = '\b'; break;
937 case 'f': *p++ = '\014'; break; /* FF */
938 case 't': *p++ = '\t'; break;
939 case 'n': *p++ = '\n'; break;
940 case 'r': *p++ = '\r'; break;
941 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000942 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
943 case '0': case '1': case '2': case '3':
944 case '4': case '5': case '6': case '7':
945 c = s[-1] - '0';
946 if ('0' <= *s && *s <= '7') {
947 c = (c<<3) + *s++ - '0';
948 if ('0' <= *s && *s <= '7')
949 c = (c<<3) + *s++ - '0';
950 }
951 *p++ = c;
952 break;
953 case 'x':
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000954 if (isxdigit(Py_CHARMASK(*s))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000955 unsigned int x = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000956 do {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000957 c = Py_CHARMASK(*s);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000958 s++;
Guido van Rossumed1100f1997-10-20 23:24:07 +0000959 x = (x<<4) & ~0xF;
960 if (isdigit(c))
961 x += c - '0';
962 else if (islower(c))
963 x += 10 + c - 'a';
964 else
965 x += 10 + c - 'A';
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000966 } while (isxdigit(Py_CHARMASK(*s)));
Guido van Rossumed1100f1997-10-20 23:24:07 +0000967 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000968 break;
969 }
970 /* FALLTHROUGH */
971 default: *p++ = '\\'; *p++ = s[-1]; break;
972 }
973 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000974 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000975 return v;
976}
977
Guido van Rossum79f25d91997-04-29 20:08:16 +0000978static PyObject *
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000979parsestrplus(n)
980 node *n;
981{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000982 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000983 int i;
984 REQ(CHILD(n, 0), STRING);
985 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
986 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +0000987 for (i = 1; i < NCH(n); i++) {
988 PyObject *s;
989 s = parsestr(STR(CHILD(n, i)));
990 if (s == NULL)
991 goto onError;
992 if (PyString_Check(v) && PyString_Check(s)) {
993 PyString_ConcatAndDel(&v, s);
994 if (v == NULL)
995 goto onError;
996 }
997 else {
998 PyObject *temp;
999 temp = PyUnicode_Concat(v, s);
1000 Py_DECREF(s);
1001 if (temp == NULL)
1002 goto onError;
1003 Py_DECREF(v);
1004 v = temp;
1005 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001006 }
1007 }
1008 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001009
1010 onError:
1011 Py_XDECREF(v);
1012 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001013}
1014
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001015static void
1016com_list_constructor(c, n)
1017 struct compiling *c;
1018 node *n;
1019{
1020 int len;
1021 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001022 if (TYPE(n) != testlist)
1023 REQ(n, exprlist);
1024 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
1025 len = (NCH(n) + 1) / 2;
1026 for (i = 0; i < NCH(n); i += 2)
1027 com_node(c, CHILD(n, i));
1028 com_addoparg(c, BUILD_LIST, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001029 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001030}
1031
1032static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001033com_dictmaker(c, n)
1034 struct compiling *c;
1035 node *n;
1036{
1037 int i;
1038 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1039 for (i = 0; i+2 < NCH(n); i += 4) {
1040 /* We must arrange things just right for STORE_SUBSCR.
1041 It wants the stack to look like (value) (dict) (key) */
1042 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001043 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001044 com_node(c, CHILD(n, i+2)); /* value */
1045 com_addbyte(c, ROT_TWO);
1046 com_node(c, CHILD(n, i)); /* key */
1047 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001048 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001049 }
1050}
1051
1052static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001053com_atom(c, n)
1054 struct compiling *c;
1055 node *n;
1056{
1057 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001058 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001059 int i;
1060 REQ(n, atom);
1061 ch = CHILD(n, 0);
1062 switch (TYPE(ch)) {
1063 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001064 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001065 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001066 com_push(c, 1);
1067 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001068 else
1069 com_node(c, CHILD(n, 1));
1070 break;
1071 case LSQB:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001072 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001073 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001074 com_push(c, 1);
1075 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001076 else
1077 com_list_constructor(c, CHILD(n, 1));
1078 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001079 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001080 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001081 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001082 if (TYPE(CHILD(n, 1)) != RBRACE)
1083 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001084 break;
1085 case BACKQUOTE:
1086 com_node(c, CHILD(n, 1));
1087 com_addbyte(c, UNARY_CONVERT);
1088 break;
1089 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001090 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001091 i = 255;
1092 }
1093 else {
1094 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001095 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001096 }
1097 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001098 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001099 break;
1100 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001101 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001102 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001103 c->c_errors++;
1104 i = 255;
1105 }
1106 else {
1107 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001108 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001109 }
1110 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001111 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001112 break;
1113 case NAME:
1114 com_addopname(c, LOAD_NAME, ch);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001115 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001116 break;
1117 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001118 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001119 com_error(c, PyExc_SystemError,
1120 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001121 }
1122}
1123
1124static void
1125com_slice(c, n, op)
1126 struct compiling *c;
1127 node *n;
1128 int op;
1129{
1130 if (NCH(n) == 1) {
1131 com_addbyte(c, op);
1132 }
1133 else if (NCH(n) == 2) {
1134 if (TYPE(CHILD(n, 0)) != COLON) {
1135 com_node(c, CHILD(n, 0));
1136 com_addbyte(c, op+1);
1137 }
1138 else {
1139 com_node(c, CHILD(n, 1));
1140 com_addbyte(c, op+2);
1141 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001142 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001143 }
1144 else {
1145 com_node(c, CHILD(n, 0));
1146 com_node(c, CHILD(n, 2));
1147 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001148 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001149 }
1150}
1151
Guido van Rossum635abd21997-01-06 22:56:52 +00001152static void
1153com_argument(c, n, pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001154 struct compiling *c;
1155 node *n; /* argument */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001156 PyObject **pkeywords;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001157{
1158 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001159 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001160 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001161 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001162 com_error(c, PyExc_SyntaxError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001163 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001164 }
1165 else {
1166 com_node(c, CHILD(n, 0));
1167 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001168 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001169 }
1170 m = n;
1171 do {
1172 m = CHILD(m, 0);
1173 } while (NCH(m) == 1);
1174 if (TYPE(m) != NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001175 com_error(c, PyExc_SyntaxError,
1176 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001177 }
1178 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001179 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001180 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001181 *pkeywords = PyDict_New();
Guido van Rossum635abd21997-01-06 22:56:52 +00001182 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001183 c->c_errors++;
1184 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001185 if (PyDict_GetItem(*pkeywords, v) != NULL)
1186 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001187 "duplicate keyword argument");
1188 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001189 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001190 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001191 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001192 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001193 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001194 }
1195 }
1196 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001197}
1198
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001199static void
1200com_call_function(c, n)
1201 struct compiling *c;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001202 node *n; /* EITHER arglist OR ')' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001203{
1204 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001205 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001206 }
1207 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001208 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001209 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001210 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001211 int star_flag = 0;
1212 int starstar_flag = 0;
1213 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001214 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001215 na = 0;
1216 nk = 0;
1217 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001218 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001219 if (TYPE(ch) == STAR ||
1220 TYPE(ch) == DOUBLESTAR)
1221 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001222 if (ch->n_lineno != lineno) {
1223 lineno = ch->n_lineno;
1224 com_addoparg(c, SET_LINENO, lineno);
1225 }
1226 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001227 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001228 na++;
1229 else
1230 nk++;
1231 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001232 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001233 while (i < NCH(n)) {
1234 node *tok = CHILD(n, i);
1235 node *ch = CHILD(n, i+1);
1236 i += 3;
1237 switch (TYPE(tok)) {
1238 case STAR: star_flag = 1; break;
1239 case DOUBLESTAR: starstar_flag = 1; break;
1240 }
1241 com_node(c, ch);
1242 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001243 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001244 com_error(c, PyExc_SyntaxError,
1245 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001246 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001247 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001248 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001249 star_flag + (starstar_flag << 1);
1250 else
1251 opcode = CALL_FUNCTION;
1252 com_addoparg(c, opcode, na | (nk << 8));
1253 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001254 }
1255}
1256
1257static void
1258com_select_member(c, n)
1259 struct compiling *c;
1260 node *n;
1261{
1262 com_addopname(c, LOAD_ATTR, n);
1263}
1264
1265static void
Guido van Rossum8861b741996-07-30 16:49:37 +00001266com_sliceobj(c, n)
1267 struct compiling *c;
1268 node *n;
1269{
1270 int i=0;
1271 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001272 node *ch;
1273
1274 /* first argument */
1275 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001276 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001277 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001278 i++;
1279 }
1280 else {
1281 com_node(c, CHILD(n,i));
1282 i++;
1283 REQ(CHILD(n,i),COLON);
1284 i++;
1285 }
1286 /* second argument */
1287 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1288 com_node(c, CHILD(n,i));
1289 i++;
1290 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001291 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001292 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001293 com_push(c, 1);
1294 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001295 /* remaining arguments */
1296 for (; i < NCH(n); i++) {
1297 ns++;
1298 ch=CHILD(n,i);
1299 REQ(ch, sliceop);
1300 if (NCH(ch) == 1) {
1301 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001302 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001303 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001304 }
1305 else
1306 com_node(c, CHILD(ch,1));
1307 }
1308 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001309 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001310}
1311
1312static void
1313com_subscript(c, n)
1314 struct compiling *c;
1315 node *n;
1316{
1317 node *ch;
1318 REQ(n, subscript);
1319 ch = CHILD(n,0);
1320 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001321 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001322 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001323 com_push(c, 1);
1324 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001325 else {
1326 /* check for slice */
1327 if ((TYPE(ch) == COLON || NCH(n) > 1))
1328 com_sliceobj(c, n);
1329 else {
1330 REQ(ch, test);
1331 com_node(c, ch);
1332 }
1333 }
1334}
1335
1336static void
1337com_subscriptlist(c, n, assigning)
1338 struct compiling *c;
1339 node *n;
1340 int assigning;
1341{
1342 int i, op;
1343 REQ(n, subscriptlist);
1344 /* Check to make backward compatible slice behavior for '[i:j]' */
1345 if (NCH(n) == 1) {
1346 node *sub = CHILD(n, 0); /* subscript */
1347 /* Make it is a simple slice.
Guido van Rossum8b993a91997-01-17 21:04:03 +00001348 Should have exactly one colon. */
Guido van Rossum8861b741996-07-30 16:49:37 +00001349 if ((TYPE(CHILD(sub, 0)) == COLON
1350 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
Guido van Rossum8b993a91997-01-17 21:04:03 +00001351 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1352 {
Guido van Rossum8861b741996-07-30 16:49:37 +00001353 if (assigning == OP_APPLY)
1354 op = SLICE;
1355 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001356 op = ((assigning == OP_ASSIGN) ?
1357 STORE_SLICE : DELETE_SLICE);
Guido van Rossum8861b741996-07-30 16:49:37 +00001358 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001359 if (op == STORE_SLICE)
1360 com_pop(c, 2);
1361 else if (op == DELETE_SLICE)
1362 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001363 return;
1364 }
1365 }
1366 /* Else normal subscriptlist. Compile each subscript. */
1367 for (i = 0; i < NCH(n); i += 2)
1368 com_subscript(c, CHILD(n, i));
1369 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001370 if (NCH(n) > 1) {
1371 i = (NCH(n)+1) / 2;
1372 com_addoparg(c, BUILD_TUPLE, i);
1373 com_pop(c, i-1);
1374 }
1375 if (assigning == OP_APPLY) {
Guido van Rossum8861b741996-07-30 16:49:37 +00001376 op = BINARY_SUBSCR;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001377 i = 1;
1378 }
1379 else if (assigning == OP_ASSIGN) {
1380 op = STORE_SUBSCR;
1381 i = 3;
1382 }
1383 else {
1384 op = DELETE_SUBSCR;
1385 i = 2;
1386 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001387 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001388 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001389}
1390
1391static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001392com_apply_trailer(c, n)
1393 struct compiling *c;
1394 node *n;
1395{
1396 REQ(n, trailer);
1397 switch (TYPE(CHILD(n, 0))) {
1398 case LPAR:
1399 com_call_function(c, CHILD(n, 1));
1400 break;
1401 case DOT:
1402 com_select_member(c, CHILD(n, 1));
1403 break;
1404 case LSQB:
Guido van Rossum8861b741996-07-30 16:49:37 +00001405 com_subscriptlist(c, CHILD(n, 1), OP_APPLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001406 break;
1407 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001408 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001409 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001410 }
1411}
1412
1413static void
Guido van Rossum50564e81996-01-12 01:13:16 +00001414com_power(c, n)
1415 struct compiling *c;
1416 node *n;
1417{
1418 int i;
1419 REQ(n, power);
1420 com_atom(c, CHILD(n, 0));
1421 for (i = 1; i < NCH(n); i++) {
1422 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1423 com_factor(c, CHILD(n, i+1));
1424 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001425 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001426 break;
1427 }
1428 else
1429 com_apply_trailer(c, CHILD(n, i));
1430 }
1431}
1432
1433static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001434com_factor(c, n)
1435 struct compiling *c;
1436 node *n;
1437{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001438 REQ(n, factor);
1439 if (TYPE(CHILD(n, 0)) == PLUS) {
1440 com_factor(c, CHILD(n, 1));
1441 com_addbyte(c, UNARY_POSITIVE);
1442 }
1443 else if (TYPE(CHILD(n, 0)) == MINUS) {
1444 com_factor(c, CHILD(n, 1));
1445 com_addbyte(c, UNARY_NEGATIVE);
1446 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001447 else if (TYPE(CHILD(n, 0)) == TILDE) {
1448 com_factor(c, CHILD(n, 1));
1449 com_addbyte(c, UNARY_INVERT);
1450 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001451 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001452 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001453 }
1454}
1455
1456static void
1457com_term(c, n)
1458 struct compiling *c;
1459 node *n;
1460{
1461 int i;
1462 int op;
1463 REQ(n, term);
1464 com_factor(c, CHILD(n, 0));
1465 for (i = 2; i < NCH(n); i += 2) {
1466 com_factor(c, CHILD(n, i));
1467 switch (TYPE(CHILD(n, i-1))) {
1468 case STAR:
1469 op = BINARY_MULTIPLY;
1470 break;
1471 case SLASH:
1472 op = BINARY_DIVIDE;
1473 break;
1474 case PERCENT:
1475 op = BINARY_MODULO;
1476 break;
1477 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001478 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001479 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001480 op = 255;
1481 }
1482 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001483 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001484 }
1485}
1486
1487static void
1488com_arith_expr(c, n)
1489 struct compiling *c;
1490 node *n;
1491{
1492 int i;
1493 int op;
1494 REQ(n, arith_expr);
1495 com_term(c, CHILD(n, 0));
1496 for (i = 2; i < NCH(n); i += 2) {
1497 com_term(c, CHILD(n, i));
1498 switch (TYPE(CHILD(n, i-1))) {
1499 case PLUS:
1500 op = BINARY_ADD;
1501 break;
1502 case MINUS:
1503 op = BINARY_SUBTRACT;
1504 break;
1505 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001506 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001507 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001508 op = 255;
1509 }
1510 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001511 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001512 }
1513}
1514
1515static void
1516com_shift_expr(c, n)
1517 struct compiling *c;
1518 node *n;
1519{
1520 int i;
1521 int op;
1522 REQ(n, shift_expr);
1523 com_arith_expr(c, CHILD(n, 0));
1524 for (i = 2; i < NCH(n); i += 2) {
1525 com_arith_expr(c, CHILD(n, i));
1526 switch (TYPE(CHILD(n, i-1))) {
1527 case LEFTSHIFT:
1528 op = BINARY_LSHIFT;
1529 break;
1530 case RIGHTSHIFT:
1531 op = BINARY_RSHIFT;
1532 break;
1533 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001534 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001535 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001536 op = 255;
1537 }
1538 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001539 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001540 }
1541}
1542
1543static void
1544com_and_expr(c, n)
1545 struct compiling *c;
1546 node *n;
1547{
1548 int i;
1549 int op;
1550 REQ(n, and_expr);
1551 com_shift_expr(c, CHILD(n, 0));
1552 for (i = 2; i < NCH(n); i += 2) {
1553 com_shift_expr(c, CHILD(n, i));
1554 if (TYPE(CHILD(n, i-1)) == AMPER) {
1555 op = BINARY_AND;
1556 }
1557 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001558 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001559 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001560 op = 255;
1561 }
1562 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001563 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001564 }
1565}
1566
1567static void
1568com_xor_expr(c, n)
1569 struct compiling *c;
1570 node *n;
1571{
1572 int i;
1573 int op;
1574 REQ(n, xor_expr);
1575 com_and_expr(c, CHILD(n, 0));
1576 for (i = 2; i < NCH(n); i += 2) {
1577 com_and_expr(c, CHILD(n, i));
1578 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1579 op = BINARY_XOR;
1580 }
1581 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001582 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001583 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001584 op = 255;
1585 }
1586 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001587 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001588 }
1589}
1590
1591static void
1592com_expr(c, n)
1593 struct compiling *c;
1594 node *n;
1595{
1596 int i;
1597 int op;
1598 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001599 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001600 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001601 com_xor_expr(c, CHILD(n, i));
1602 if (TYPE(CHILD(n, i-1)) == VBAR) {
1603 op = BINARY_OR;
1604 }
1605 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001606 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001607 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001608 op = 255;
1609 }
1610 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001611 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001612 }
1613}
1614
1615static enum cmp_op
1616cmp_type(n)
1617 node *n;
1618{
1619 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001620 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001621 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1622 if (NCH(n) == 1) {
1623 n = CHILD(n, 0);
1624 switch (TYPE(n)) {
1625 case LESS: return LT;
1626 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001627 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001628 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001629 case LESSEQUAL: return LE;
1630 case GREATEREQUAL: return GE;
1631 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001632 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1633 if (strcmp(STR(n), "is") == 0) return IS;
1634 }
1635 }
1636 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001637 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001638 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1639 return NOT_IN;
1640 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1641 return IS_NOT;
1642 }
1643 }
1644 return BAD;
1645}
1646
1647static void
1648com_comparison(c, n)
1649 struct compiling *c;
1650 node *n;
1651{
1652 int i;
1653 enum cmp_op op;
1654 int anchor;
1655 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1656 com_expr(c, CHILD(n, 0));
1657 if (NCH(n) == 1)
1658 return;
1659
1660 /****************************************************************
1661 The following code is generated for all but the last
1662 comparison in a chain:
1663
1664 label: on stack: opcode: jump to:
1665
1666 a <code to load b>
1667 a, b DUP_TOP
1668 a, b, b ROT_THREE
1669 b, a, b COMPARE_OP
1670 b, 0-or-1 JUMP_IF_FALSE L1
1671 b, 1 POP_TOP
1672 b
1673
1674 We are now ready to repeat this sequence for the next
1675 comparison in the chain.
1676
1677 For the last we generate:
1678
1679 b <code to load c>
1680 b, c COMPARE_OP
1681 0-or-1
1682
1683 If there were any jumps to L1 (i.e., there was more than one
1684 comparison), we generate:
1685
1686 0-or-1 JUMP_FORWARD L2
1687 L1: b, 0 ROT_TWO
1688 0, b POP_TOP
1689 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00001690 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001691 ****************************************************************/
1692
1693 anchor = 0;
1694
1695 for (i = 2; i < NCH(n); i += 2) {
1696 com_expr(c, CHILD(n, i));
1697 if (i+2 < NCH(n)) {
1698 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001699 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001700 com_addbyte(c, ROT_THREE);
1701 }
1702 op = cmp_type(CHILD(n, i-1));
1703 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001704 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001705 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001706 }
1707 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001708 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001709 if (i+2 < NCH(n)) {
1710 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1711 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001712 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001713 }
1714 }
1715
1716 if (anchor) {
1717 int anchor2 = 0;
1718 com_addfwref(c, JUMP_FORWARD, &anchor2);
1719 com_backpatch(c, anchor);
1720 com_addbyte(c, ROT_TWO);
1721 com_addbyte(c, POP_TOP);
1722 com_backpatch(c, anchor2);
1723 }
1724}
1725
1726static void
1727com_not_test(c, n)
1728 struct compiling *c;
1729 node *n;
1730{
1731 REQ(n, not_test); /* 'not' not_test | comparison */
1732 if (NCH(n) == 1) {
1733 com_comparison(c, CHILD(n, 0));
1734 }
1735 else {
1736 com_not_test(c, CHILD(n, 1));
1737 com_addbyte(c, UNARY_NOT);
1738 }
1739}
1740
1741static void
1742com_and_test(c, n)
1743 struct compiling *c;
1744 node *n;
1745{
1746 int i;
1747 int anchor;
1748 REQ(n, and_test); /* not_test ('and' not_test)* */
1749 anchor = 0;
1750 i = 0;
1751 for (;;) {
1752 com_not_test(c, CHILD(n, i));
1753 if ((i += 2) >= NCH(n))
1754 break;
1755 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1756 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001757 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001758 }
1759 if (anchor)
1760 com_backpatch(c, anchor);
1761}
1762
1763static void
1764com_test(c, n)
1765 struct compiling *c;
1766 node *n;
1767{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001768 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00001769 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001770 PyObject *v;
Guido van Rossum57531fe1993-11-30 14:57:42 +00001771 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001772 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001773 v = (PyObject *) icompile(CHILD(n, 0), c);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001774 if (v == NULL) {
1775 c->c_errors++;
1776 i = 255;
1777 }
1778 else {
1779 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001780 Py_DECREF(v);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001781 }
1782 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001783 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001784 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001785 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001786 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001787 else {
1788 int anchor = 0;
1789 int i = 0;
1790 for (;;) {
1791 com_and_test(c, CHILD(n, i));
1792 if ((i += 2) >= NCH(n))
1793 break;
1794 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1795 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001796 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001797 }
1798 if (anchor)
1799 com_backpatch(c, anchor);
1800 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001801}
1802
1803static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001804com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001805 struct compiling *c;
1806 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001807 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001808{
1809 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001810 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001811 com_node(c, CHILD(n, 0));
1812 }
1813 else {
1814 int i;
1815 int len;
1816 len = (NCH(n) + 1) / 2;
1817 for (i = 0; i < NCH(n); i += 2)
1818 com_node(c, CHILD(n, i));
1819 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001820 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001821 }
1822}
1823
1824
1825/* Begin of assignment compilation */
1826
Guido van Rossum79f25d91997-04-29 20:08:16 +00001827static void com_assign_name Py_PROTO((struct compiling *, node *, int));
1828static void com_assign Py_PROTO((struct compiling *, node *, int));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001829
1830static void
1831com_assign_attr(c, n, assigning)
1832 struct compiling *c;
1833 node *n;
1834 int assigning;
1835{
1836 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001837 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001838}
1839
1840static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001841com_assign_trailer(c, n, assigning)
1842 struct compiling *c;
1843 node *n;
1844 int assigning;
1845{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001846 REQ(n, trailer);
1847 switch (TYPE(CHILD(n, 0))) {
1848 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001849 com_error(c, PyExc_SyntaxError,
1850 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001851 break;
1852 case DOT: /* '.' NAME */
1853 com_assign_attr(c, CHILD(n, 1), assigning);
1854 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001855 case LSQB: /* '[' subscriptlist ']' */
1856 com_subscriptlist(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001857 break;
1858 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001859 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001860 }
1861}
1862
1863static void
1864com_assign_tuple(c, n, assigning)
1865 struct compiling *c;
1866 node *n;
1867 int assigning;
1868{
1869 int i;
1870 if (TYPE(n) != testlist)
1871 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001872 if (assigning) {
1873 i = (NCH(n)+1)/2;
1874 com_addoparg(c, UNPACK_TUPLE, i);
1875 com_push(c, i-1);
1876 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001877 for (i = 0; i < NCH(n); i += 2)
1878 com_assign(c, CHILD(n, i), assigning);
1879}
1880
1881static void
1882com_assign_list(c, n, assigning)
1883 struct compiling *c;
1884 node *n;
1885 int assigning;
1886{
1887 int i;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001888 if (assigning) {
1889 i = (NCH(n)+1)/2;
1890 com_addoparg(c, UNPACK_LIST, i);
1891 com_push(c, i-1);
1892 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001893 for (i = 0; i < NCH(n); i += 2)
1894 com_assign(c, CHILD(n, i), assigning);
1895}
1896
1897static void
1898com_assign_name(c, n, assigning)
1899 struct compiling *c;
1900 node *n;
1901 int assigning;
1902{
1903 REQ(n, NAME);
1904 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001905 if (assigning)
1906 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001907}
1908
1909static void
1910com_assign(c, n, assigning)
1911 struct compiling *c;
1912 node *n;
1913 int assigning;
1914{
1915 /* Loop to avoid trivial recursion */
1916 for (;;) {
1917 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001918
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001919 case exprlist:
1920 case testlist:
1921 if (NCH(n) > 1) {
1922 com_assign_tuple(c, n, assigning);
1923 return;
1924 }
1925 n = CHILD(n, 0);
1926 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001927
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001928 case test:
1929 case and_test:
1930 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001931 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001932 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001933 case xor_expr:
1934 case and_expr:
1935 case shift_expr:
1936 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001937 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00001938 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001939 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001940 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001941 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001942 return;
1943 }
1944 n = CHILD(n, 0);
1945 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001946
Guido van Rossum50564e81996-01-12 01:13:16 +00001947 case power: /* atom trailer* ('**' power)* */
1948/* ('+'|'-'|'~') factor | atom trailer* */
1949 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001950 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001951 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001952 return;
1953 }
Guido van Rossum50564e81996-01-12 01:13:16 +00001954 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001955 int i;
1956 com_node(c, CHILD(n, 0));
1957 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00001958 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001959 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001960 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00001961 return;
1962 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001963 com_apply_trailer(c, CHILD(n, i));
1964 } /* NB i is still alive */
1965 com_assign_trailer(c,
1966 CHILD(n, i), assigning);
1967 return;
1968 }
1969 n = CHILD(n, 0);
1970 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001971
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001972 case atom:
1973 switch (TYPE(CHILD(n, 0))) {
1974 case LPAR:
1975 n = CHILD(n, 1);
1976 if (TYPE(n) == RPAR) {
1977 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001978 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001979 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001980 return;
1981 }
1982 break;
1983 case LSQB:
1984 n = CHILD(n, 1);
1985 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001986 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001987 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001988 return;
1989 }
1990 com_assign_list(c, n, assigning);
1991 return;
1992 case NAME:
1993 com_assign_name(c, CHILD(n, 0), assigning);
1994 return;
1995 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001996 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001997 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001998 return;
1999 }
2000 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002001
2002 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002003 com_error(c, PyExc_SyntaxError,
2004 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002005 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002006
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002007 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002008 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002009 com_error(c, PyExc_SystemError,
2010 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002011 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002012
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002013 }
2014 }
2015}
Guido van Rossum7c531111997-03-11 18:42:21 +00002016
Guido van Rossum79f25d91997-04-29 20:08:16 +00002017/* Forward */ static node *get_rawdocstring Py_PROTO((node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002018
2019static void
2020com_expr_stmt(c, n)
2021 struct compiling *c;
2022 node *n;
2023{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002024 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002025 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002026 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002027 return;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002028 com_node(c, CHILD(n, NCH(n)-1));
2029 if (NCH(n) == 1) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002030 if (c->c_interactive)
2031 com_addbyte(c, PRINT_EXPR);
2032 else
2033 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002034 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002035 }
2036 else {
2037 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002038 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002039 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002040 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002041 com_push(c, 1);
2042 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002043 com_assign(c, CHILD(n, i), OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002044 }
2045 }
2046}
2047
2048static void
Guido van Rossum228d7f31997-04-02 05:24:36 +00002049com_assert_stmt(c, n)
2050 struct compiling *c;
2051 node *n;
2052{
2053 int a = 0, b = 0;
2054 int i;
2055 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2056 /* Generate code like for
2057
2058 if __debug__:
2059 if not <test>:
2060 raise AssertionError [, <message>]
2061
2062 where <message> is the second test, if present.
2063 */
2064 if (Py_OptimizeFlag)
2065 return;
2066 com_addopnamestr(c, LOAD_GLOBAL, "__debug__");
2067 com_push(c, 1);
2068 com_addfwref(c, JUMP_IF_FALSE, &a);
2069 com_addbyte(c, POP_TOP);
2070 com_pop(c, 1);
2071 com_node(c, CHILD(n, 1));
2072 com_addfwref(c, JUMP_IF_TRUE, &b);
2073 com_addbyte(c, POP_TOP);
2074 com_pop(c, 1);
2075 /* Raise that exception! */
2076 com_addopnamestr(c, LOAD_GLOBAL, "AssertionError");
2077 com_push(c, 1);
2078 i = NCH(n)/2; /* Either 2 or 4 */
2079 if (i > 1)
2080 com_node(c, CHILD(n, 3));
2081 com_addoparg(c, RAISE_VARARGS, i);
2082 com_pop(c, i);
2083 /* The interpreter does not fall through */
2084 /* All jumps converge here */
2085 com_backpatch(c, a);
2086 com_backpatch(c, b);
2087 com_addbyte(c, POP_TOP);
2088}
2089
2090static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002091com_print_stmt(c, n)
2092 struct compiling *c;
2093 node *n;
2094{
2095 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002096 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
2097 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002098 com_node(c, CHILD(n, i));
2099 com_addbyte(c, PRINT_ITEM);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002100 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002101 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002102 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002103 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002104 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002105}
2106
2107static void
2108com_return_stmt(c, n)
2109 struct compiling *c;
2110 node *n;
2111{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002112 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002113 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002114 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002115 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002116 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002117 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002118 com_push(c, 1);
2119 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002120 else
2121 com_node(c, CHILD(n, 1));
2122 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002123 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002124}
2125
2126static void
2127com_raise_stmt(c, n)
2128 struct compiling *c;
2129 node *n;
2130{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002131 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002132 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2133 if (NCH(n) > 1) {
2134 com_node(c, CHILD(n, 1));
2135 if (NCH(n) > 3) {
2136 com_node(c, CHILD(n, 3));
2137 if (NCH(n) > 5)
2138 com_node(c, CHILD(n, 5));
2139 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002140 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002141 i = NCH(n)/2;
2142 com_addoparg(c, RAISE_VARARGS, i);
2143 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002144}
2145
2146static void
2147com_import_stmt(c, n)
2148 struct compiling *c;
2149 node *n;
2150{
2151 int i;
2152 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002153 /* 'import' dotted_name (',' dotted_name)* |
2154 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002155 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002156 /* 'from' dotted_name 'import' ... */
2157 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002158 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002159 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002160 for (i = 3; i < NCH(n); i += 2)
2161 com_addopname(c, IMPORT_FROM, CHILD(n, i));
2162 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002163 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002164 }
2165 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002166 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002167 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002168 REQ(CHILD(n, i), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002169 com_addopname(c, IMPORT_NAME, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002170 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002171 com_addopname(c, STORE_NAME, CHILD(CHILD(n, i), 0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002172 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002173 }
2174 }
2175}
2176
2177static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00002178com_global_stmt(c, n)
2179 struct compiling *c;
2180 node *n;
2181{
2182 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002183 REQ(n, global_stmt);
2184 /* 'global' NAME (',' NAME)* */
2185 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002186 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002187#ifdef PRIVATE_NAME_MANGLING
2188 char buffer[256];
2189 if (s != NULL && s[0] == '_' && s[1] == '_' &&
2190 c->c_private != NULL &&
2191 com_mangle(c, s, buffer, (int)sizeof(buffer)))
2192 s = buffer;
2193#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +00002194 if (PyDict_GetItemString(c->c_locals, s) != NULL) {
2195 com_error(c, PyExc_SyntaxError,
2196 "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002197 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002198 else if (PyDict_SetItemString(c->c_globals, s, Py_None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002199 c->c_errors++;
2200 }
2201}
2202
Guido van Rossum681d79a1995-07-18 14:51:37 +00002203static int
2204com_newlocal_o(c, nameval)
2205 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002206 PyObject *nameval;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002207{
2208 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002209 PyObject *ival;
2210 if (PyList_Size(c->c_varnames) != c->c_nlocals) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002211 /* This is usually caused by an error on a previous call */
2212 if (c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002213 com_error(c, PyExc_SystemError,
2214 "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002215 }
2216 return 0;
2217 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002218 ival = PyInt_FromLong(i = c->c_nlocals++);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002219 if (ival == NULL)
2220 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002221 else if (PyDict_SetItem(c->c_locals, nameval, ival) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002222 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002223 else if (PyList_Append(c->c_varnames, nameval) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002224 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002225 Py_XDECREF(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002226 return i;
2227}
2228
2229static int
2230com_addlocal_o(c, nameval)
2231 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002232 PyObject *nameval;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002233{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002234 PyObject *ival = PyDict_GetItem(c->c_locals, nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002235 if (ival != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002236 return PyInt_AsLong(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002237 return com_newlocal_o(c, nameval);
2238}
2239
2240static int
2241com_newlocal(c, name)
2242 struct compiling *c;
2243 char *name;
2244{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002245 PyObject *nameval = PyString_InternFromString(name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002246 int i;
2247 if (nameval == NULL) {
2248 c->c_errors++;
2249 return 0;
2250 }
2251 i = com_newlocal_o(c, nameval);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002252 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002253 return i;
2254}
2255
Guido van Rossumc5e96291991-12-10 13:53:51 +00002256static void
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002257com_exec_stmt(c, n)
2258 struct compiling *c;
2259 node *n;
2260{
2261 REQ(n, exec_stmt);
2262 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2263 com_node(c, CHILD(n, 1));
2264 if (NCH(n) >= 4)
2265 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002266 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002267 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002268 com_push(c, 1);
2269 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002270 if (NCH(n) >= 6)
2271 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002272 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002273 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002274 com_push(c, 1);
2275 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002276 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002277 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002278}
2279
Guido van Rossum7c531111997-03-11 18:42:21 +00002280static int
2281is_constant_false(c, n)
2282 struct compiling *c;
2283 node *n;
2284{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002285 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002286 int i;
2287
2288 /* Label to avoid tail recursion */
2289 next:
2290 switch (TYPE(n)) {
2291
2292 case suite:
2293 if (NCH(n) == 1) {
2294 n = CHILD(n, 0);
2295 goto next;
2296 }
2297 /* Fall through */
2298 case file_input:
2299 for (i = 0; i < NCH(n); i++) {
2300 node *ch = CHILD(n, i);
2301 if (TYPE(ch) == stmt) {
2302 n = ch;
2303 goto next;
2304 }
2305 }
2306 break;
2307
2308 case stmt:
2309 case simple_stmt:
2310 case small_stmt:
2311 n = CHILD(n, 0);
2312 goto next;
2313
2314 case expr_stmt:
2315 case testlist:
2316 case test:
2317 case and_test:
2318 case not_test:
2319 case comparison:
2320 case expr:
2321 case xor_expr:
2322 case and_expr:
2323 case shift_expr:
2324 case arith_expr:
2325 case term:
2326 case factor:
2327 case power:
2328 case atom:
2329 if (NCH(n) == 1) {
2330 n = CHILD(n, 0);
2331 goto next;
2332 }
2333 break;
2334
2335 case NAME:
2336 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2337 return 1;
2338 break;
2339
2340 case NUMBER:
2341 v = parsenumber(c, STR(n));
2342 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002343 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002344 break;
2345 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002346 i = PyObject_IsTrue(v);
2347 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002348 return i == 0;
2349
2350 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002351 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002352 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002353 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002354 break;
2355 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002356 i = PyObject_IsTrue(v);
2357 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002358 return i == 0;
2359
2360 }
2361 return 0;
2362}
2363
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002364static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002365com_if_stmt(c, n)
2366 struct compiling *c;
2367 node *n;
2368{
2369 int i;
2370 int anchor = 0;
2371 REQ(n, if_stmt);
2372 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2373 for (i = 0; i+3 < NCH(n); i+=4) {
2374 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002375 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002376 if (is_constant_false(c, ch))
2377 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002378 if (i > 0)
2379 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002380 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002381 com_addfwref(c, JUMP_IF_FALSE, &a);
2382 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002383 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002384 com_node(c, CHILD(n, i+3));
2385 com_addfwref(c, JUMP_FORWARD, &anchor);
2386 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002387 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002388 com_addbyte(c, POP_TOP);
2389 }
2390 if (i+2 < NCH(n))
2391 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002392 if (anchor)
2393 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002394}
2395
2396static void
2397com_while_stmt(c, n)
2398 struct compiling *c;
2399 node *n;
2400{
2401 int break_anchor = 0;
2402 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002403 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002404 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2405 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002406 block_push(c, SETUP_LOOP);
2407 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002408 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002409 com_node(c, CHILD(n, 1));
2410 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2411 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002412 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002413 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002414 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002415 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002416 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2417 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002418 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002419 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002420 com_addbyte(c, POP_TOP);
2421 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002422 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002423 if (NCH(n) > 4)
2424 com_node(c, CHILD(n, 6));
2425 com_backpatch(c, break_anchor);
2426}
2427
2428static void
2429com_for_stmt(c, n)
2430 struct compiling *c;
2431 node *n;
2432{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002433 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002434 int break_anchor = 0;
2435 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002436 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002437 REQ(n, for_stmt);
2438 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2439 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002440 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002441 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002442 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002443 if (v == NULL)
2444 c->c_errors++;
2445 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002446 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002447 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002448 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002449 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002450 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002451 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002452 com_assign(c, CHILD(n, 1), OP_ASSIGN);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002453 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002454 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002455 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002456 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2457 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002458 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002459 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002460 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002461 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002462 if (NCH(n) > 8)
2463 com_node(c, CHILD(n, 8));
2464 com_backpatch(c, break_anchor);
2465}
2466
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002467/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002468
2469 SETUP_FINALLY L
2470 <code for S>
2471 POP_BLOCK
2472 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002473 L: <code for Sf>
2474 END_FINALLY
2475
2476 The special instructions use the block stack. Each block
2477 stack entry contains the instruction that created it (here
2478 SETUP_FINALLY), the level of the value stack at the time the
2479 block stack entry was created, and a label (here L).
2480
2481 SETUP_FINALLY:
2482 Pushes the current value stack level and the label
2483 onto the block stack.
2484 POP_BLOCK:
2485 Pops en entry from the block stack, and pops the value
2486 stack until its level is the same as indicated on the
2487 block stack. (The label is ignored.)
2488 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002489 Pops a variable number of entries from the *value* stack
2490 and re-raises the exception they specify. The number of
2491 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002492
2493 The block stack is unwound when an exception is raised:
2494 when a SETUP_FINALLY entry is found, the exception is pushed
2495 onto the value stack (and the exception condition is cleared),
2496 and the interpreter jumps to the label gotten from the block
2497 stack.
2498
2499 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002500 (The contents of the value stack is shown in [], with the top
2501 at the right; 'tb' is trace-back info, 'val' the exception's
2502 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002503
2504 Value stack Label Instruction Argument
2505 [] SETUP_EXCEPT L1
2506 [] <code for S>
2507 [] POP_BLOCK
2508 [] JUMP_FORWARD L0
2509
Guido van Rossum3f5da241990-12-20 15:06:42 +00002510 [tb, val, exc] L1: DUP )
2511 [tb, val, exc, exc] <evaluate E1> )
2512 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2513 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2514 [tb, val, exc, 1] POP )
2515 [tb, val, exc] POP
2516 [tb, val] <assign to V1> (or POP if no V1)
2517 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002518 [] <code for S1>
2519 JUMP_FORWARD L0
2520
Guido van Rossum3f5da241990-12-20 15:06:42 +00002521 [tb, val, exc, 0] L2: POP
2522 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002523 .............................etc.......................
2524
Guido van Rossum3f5da241990-12-20 15:06:42 +00002525 [tb, val, exc, 0] Ln+1: POP
2526 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002527
2528 [] L0: <next statement>
2529
2530 Of course, parts are not generated if Vi or Ei is not present.
2531*/
2532
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002533static void
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002534com_try_except(c, n)
2535 struct compiling *c;
2536 node *n;
2537{
2538 int except_anchor = 0;
2539 int end_anchor = 0;
2540 int else_anchor = 0;
2541 int i;
2542 node *ch;
2543
2544 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2545 block_push(c, SETUP_EXCEPT);
2546 com_node(c, CHILD(n, 2));
2547 com_addbyte(c, POP_BLOCK);
2548 block_pop(c, SETUP_EXCEPT);
2549 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2550 com_backpatch(c, except_anchor);
2551 for (i = 3;
2552 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2553 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002554 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002555 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002556 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002557 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002558 break;
2559 }
2560 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002561 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002562 com_addoparg(c, SET_LINENO, ch->n_lineno);
2563 if (NCH(ch) > 1) {
2564 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002565 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002566 com_node(c, CHILD(ch, 1));
2567 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002568 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002569 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2570 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002571 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002572 }
2573 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002574 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002575 if (NCH(ch) > 3)
Guido van Rossum8861b741996-07-30 16:49:37 +00002576 com_assign(c, CHILD(ch, 3), OP_ASSIGN);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002577 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002578 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002579 com_pop(c, 1);
2580 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002581 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002582 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002583 com_node(c, CHILD(n, i+2));
2584 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2585 if (except_anchor) {
2586 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002587 /* We come in with [tb, val, exc, 0] on the
2588 stack; one pop and it's the same as
2589 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002590 com_addbyte(c, POP_TOP);
2591 }
2592 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002593 /* We actually come in here with [tb, val, exc] but the
2594 END_FINALLY will zap those and jump around.
2595 The c_stacklevel does not reflect them so we need not pop
2596 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002597 com_addbyte(c, END_FINALLY);
2598 com_backpatch(c, else_anchor);
2599 if (i < NCH(n))
2600 com_node(c, CHILD(n, i+2));
2601 com_backpatch(c, end_anchor);
2602}
2603
2604static void
2605com_try_finally(c, n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002606 struct compiling *c;
2607 node *n;
2608{
2609 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002610 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002611
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002612 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2613 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002614 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002615 com_addbyte(c, POP_BLOCK);
2616 block_pop(c, SETUP_FINALLY);
2617 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002618 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002619 /* While the generated code pushes only one item,
2620 the try-finally handling can enter here with
2621 up to three items. OK, here are the details:
2622 3 for an exception, 2 for RETURN, 1 for BREAK. */
2623 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002624 com_backpatch(c, finally_anchor);
2625 ch = CHILD(n, NCH(n)-1);
2626 com_addoparg(c, SET_LINENO, ch->n_lineno);
2627 com_node(c, ch);
2628 com_addbyte(c, END_FINALLY);
2629 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002630 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002631}
2632
2633static void
2634com_try_stmt(c, n)
2635 struct compiling *c;
2636 node *n;
2637{
2638 REQ(n, try_stmt);
2639 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2640 | 'try' ':' suite 'finally' ':' suite */
2641 if (TYPE(CHILD(n, 3)) != except_clause)
2642 com_try_finally(c, n);
2643 else
2644 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002645}
2646
Guido van Rossum8b993a91997-01-17 21:04:03 +00002647static node *
2648get_rawdocstring(n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002649 node *n;
2650{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002651 int i;
2652
Guido van Rossum8b993a91997-01-17 21:04:03 +00002653 /* Label to avoid tail recursion */
2654 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002655 switch (TYPE(n)) {
2656
2657 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002658 if (NCH(n) == 1) {
2659 n = CHILD(n, 0);
2660 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002661 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002662 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002663 case file_input:
2664 for (i = 0; i < NCH(n); i++) {
2665 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002666 if (TYPE(ch) == stmt) {
2667 n = ch;
2668 goto next;
2669 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002670 }
2671 break;
2672
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002673 case stmt:
2674 case simple_stmt:
2675 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002676 n = CHILD(n, 0);
2677 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002678
2679 case expr_stmt:
2680 case testlist:
2681 case test:
2682 case and_test:
2683 case not_test:
2684 case comparison:
2685 case expr:
2686 case xor_expr:
2687 case and_expr:
2688 case shift_expr:
2689 case arith_expr:
2690 case term:
2691 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002692 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002693 if (NCH(n) == 1) {
2694 n = CHILD(n, 0);
2695 goto next;
2696 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002697 break;
2698
2699 case atom:
2700 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002701 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002702 break;
2703
2704 }
2705 return NULL;
2706}
2707
Guido van Rossum79f25d91997-04-29 20:08:16 +00002708static PyObject *
Guido van Rossum8b993a91997-01-17 21:04:03 +00002709get_docstring(n)
2710 node *n;
2711{
Guido van Rossum541563e1999-01-28 15:08:09 +00002712 /* Don't generate doc-strings if run with -OO */
2713 if (Py_OptimizeFlag > 1)
2714 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002715 n = get_rawdocstring(n);
2716 if (n == NULL)
2717 return NULL;
2718 return parsestrplus(n);
2719}
2720
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002721static void
2722com_suite(c, n)
2723 struct compiling *c;
2724 node *n;
2725{
2726 REQ(n, suite);
2727 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2728 if (NCH(n) == 1) {
2729 com_node(c, CHILD(n, 0));
2730 }
2731 else {
2732 int i;
2733 for (i = 0; i < NCH(n); i++) {
2734 node *ch = CHILD(n, i);
2735 if (TYPE(ch) == stmt)
2736 com_node(c, ch);
2737 }
2738 }
2739}
2740
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002741/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002742static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002743com_continue_stmt(c, n)
2744 struct compiling *c;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002745 node *n; /* Not used, but passed for consistency */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002746{
2747 int i = c->c_nblocks;
2748 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2749 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2750 }
2751 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002752 com_error(c, PyExc_SyntaxError,
2753 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002754 }
2755 /* XXX Could allow it inside a 'finally' clause
2756 XXX if we could pop the exception still on the stack */
2757}
2758
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002759static int
Guido van Rossum681d79a1995-07-18 14:51:37 +00002760com_argdefs(c, n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002761 struct compiling *c;
2762 node *n;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002763{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002764 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002765 if (TYPE(n) == lambdef) {
2766 /* lambdef: 'lambda' [varargslist] ':' test */
2767 n = CHILD(n, 1);
2768 }
2769 else {
2770 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2771 n = CHILD(n, 2);
2772 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2773 n = CHILD(n, 1);
2774 }
2775 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002776 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002777 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002778 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002779 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2780 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002781 nargs = 0;
2782 ndefs = 0;
2783 for (i = 0; i < nch; i++) {
2784 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002785 if (TYPE(CHILD(n, i)) == STAR ||
2786 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002787 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002788 nargs++;
2789 i++;
2790 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002791 t = RPAR; /* Anything except EQUAL or COMMA */
2792 else
2793 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002794 if (t == EQUAL) {
2795 i++;
2796 ndefs++;
2797 com_node(c, CHILD(n, i));
2798 i++;
2799 if (i >= nch)
2800 break;
2801 t = TYPE(CHILD(n, i));
2802 }
2803 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00002804 /* Treat "(a=1, b)" as an error */
2805 if (ndefs)
2806 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00002807 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002808 }
2809 if (t != COMMA)
2810 break;
2811 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002812 return ndefs;
2813}
2814
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002815static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002816com_funcdef(c, n)
2817 struct compiling *c;
2818 node *n;
2819{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002820 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002821 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002822 v = (PyObject *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002823 if (v == NULL)
2824 c->c_errors++;
2825 else {
2826 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002827 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002828 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002829 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002830 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002831 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002832 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002833 com_pop(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002834 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002835 }
2836}
2837
2838static void
Guido van Rossum25831651993-05-19 14:50:45 +00002839com_bases(c, n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002840 struct compiling *c;
2841 node *n;
2842{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002843 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002844 REQ(n, testlist);
2845 /* testlist: test (',' test)* [','] */
2846 for (i = 0; i < NCH(n); i += 2)
2847 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002848 i = (NCH(n)+1) / 2;
2849 com_addoparg(c, BUILD_TUPLE, i);
2850 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00002851}
2852
2853static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002854com_classdef(c, n)
2855 struct compiling *c;
2856 node *n;
2857{
Guido van Rossum25831651993-05-19 14:50:45 +00002858 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002859 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002860 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002861 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00002862 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00002863 c->c_errors++;
2864 return;
2865 }
2866 /* Push the class name on the stack */
2867 i = com_addconst(c, v);
2868 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002869 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002870 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00002871 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002872 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00002873 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002874 com_push(c, 1);
2875 }
Guido van Rossum25831651993-05-19 14:50:45 +00002876 else
2877 com_bases(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002878 v = (PyObject *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002879 if (v == NULL)
2880 c->c_errors++;
2881 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002882 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002883 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002884 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002885 com_addoparg(c, MAKE_FUNCTION, 0);
2886 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002887 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002888 com_pop(c, 2);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002889 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002890 Py_DECREF(v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002891 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002892}
2893
2894static void
2895com_node(c, n)
2896 struct compiling *c;
2897 node *n;
2898{
2899 switch (TYPE(n)) {
2900
2901 /* Definition nodes */
2902
2903 case funcdef:
2904 com_funcdef(c, n);
2905 break;
2906 case classdef:
2907 com_classdef(c, n);
2908 break;
2909
2910 /* Trivial parse tree nodes */
2911
2912 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002913 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002914 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002915 com_node(c, CHILD(n, 0));
2916 break;
2917
2918 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002919 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2920 com_addoparg(c, SET_LINENO, n->n_lineno);
2921 {
2922 int i;
2923 for (i = 0; i < NCH(n)-1; i += 2)
2924 com_node(c, CHILD(n, i));
2925 }
2926 break;
2927
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002928 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002929 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002930 com_node(c, CHILD(n, 0));
2931 break;
2932
2933 /* Statement nodes */
2934
2935 case expr_stmt:
2936 com_expr_stmt(c, n);
2937 break;
2938 case print_stmt:
2939 com_print_stmt(c, n);
2940 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002941 case del_stmt: /* 'del' exprlist */
Guido van Rossum8861b741996-07-30 16:49:37 +00002942 com_assign(c, CHILD(n, 1), OP_DELETE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002943 break;
2944 case pass_stmt:
2945 break;
2946 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002947 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002948 com_error(c, PyExc_SyntaxError,
2949 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002950 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002951 com_addbyte(c, BREAK_LOOP);
2952 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002953 case continue_stmt:
2954 com_continue_stmt(c, n);
2955 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002956 case return_stmt:
2957 com_return_stmt(c, n);
2958 break;
2959 case raise_stmt:
2960 com_raise_stmt(c, n);
2961 break;
2962 case import_stmt:
2963 com_import_stmt(c, n);
2964 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002965 case global_stmt:
2966 com_global_stmt(c, n);
2967 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002968 case exec_stmt:
2969 com_exec_stmt(c, n);
2970 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002971 case assert_stmt:
2972 com_assert_stmt(c, n);
2973 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002974 case if_stmt:
2975 com_if_stmt(c, n);
2976 break;
2977 case while_stmt:
2978 com_while_stmt(c, n);
2979 break;
2980 case for_stmt:
2981 com_for_stmt(c, n);
2982 break;
2983 case try_stmt:
2984 com_try_stmt(c, n);
2985 break;
2986 case suite:
2987 com_suite(c, n);
2988 break;
2989
2990 /* Expression nodes */
2991
2992 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002993 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002994 break;
2995 case test:
2996 com_test(c, n);
2997 break;
2998 case and_test:
2999 com_and_test(c, n);
3000 break;
3001 case not_test:
3002 com_not_test(c, n);
3003 break;
3004 case comparison:
3005 com_comparison(c, n);
3006 break;
3007 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003008 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003009 break;
3010 case expr:
3011 com_expr(c, n);
3012 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003013 case xor_expr:
3014 com_xor_expr(c, n);
3015 break;
3016 case and_expr:
3017 com_and_expr(c, n);
3018 break;
3019 case shift_expr:
3020 com_shift_expr(c, n);
3021 break;
3022 case arith_expr:
3023 com_arith_expr(c, n);
3024 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003025 case term:
3026 com_term(c, n);
3027 break;
3028 case factor:
3029 com_factor(c, n);
3030 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003031 case power:
3032 com_power(c, n);
3033 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003034 case atom:
3035 com_atom(c, n);
3036 break;
3037
3038 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003039 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003040 com_error(c, PyExc_SystemError,
3041 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003042 }
3043}
3044
Guido van Rossum79f25d91997-04-29 20:08:16 +00003045static void com_fplist Py_PROTO((struct compiling *, node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003046
3047static void
3048com_fpdef(c, n)
3049 struct compiling *c;
3050 node *n;
3051{
3052 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3053 if (TYPE(CHILD(n, 0)) == LPAR)
3054 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003055 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003056 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003057 com_pop(c, 1);
3058 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003059}
3060
3061static void
3062com_fplist(c, n)
3063 struct compiling *c;
3064 node *n;
3065{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003066 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003067 if (NCH(n) == 1) {
3068 com_fpdef(c, CHILD(n, 0));
3069 }
3070 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003071 int i = (NCH(n)+1)/2;
3072 com_addoparg(c, UNPACK_TUPLE, i);
3073 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003074 for (i = 0; i < NCH(n); i += 2)
3075 com_fpdef(c, CHILD(n, i));
3076 }
3077}
3078
3079static void
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003080com_arglist(c, n)
3081 struct compiling *c;
3082 node *n;
3083{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003084 int nch, i;
3085 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003086 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003087 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003088 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003089 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003090 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003091 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003092 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003093 node *ch = CHILD(n, i);
3094 node *fp;
3095 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00003096 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003097 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003098 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3099 fp = CHILD(ch, 0);
3100 if (TYPE(fp) == NAME)
3101 name = STR(fp);
3102 else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003103 name = nbuf;
3104 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003105 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003106 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003107 com_newlocal(c, name);
3108 c->c_argcount++;
3109 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003110 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003111 ch = CHILD(n, i);
3112 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003113 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003114 else
3115 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003116 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003117 /* Handle *arguments */
3118 if (i < nch) {
3119 node *ch;
3120 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003121 if (TYPE(ch) != DOUBLESTAR) {
3122 REQ(ch, STAR);
3123 ch = CHILD(n, i+1);
3124 if (TYPE(ch) == NAME) {
3125 c->c_flags |= CO_VARARGS;
3126 i += 3;
3127 com_newlocal(c, STR(ch));
3128 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003129 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003130 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003131 /* Handle **keywords */
3132 if (i < nch) {
3133 node *ch;
3134 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003135 if (TYPE(ch) != DOUBLESTAR) {
3136 REQ(ch, STAR);
3137 ch = CHILD(n, i+1);
3138 REQ(ch, STAR);
3139 ch = CHILD(n, i+2);
3140 }
3141 else
3142 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003143 REQ(ch, NAME);
3144 c->c_flags |= CO_VARKEYWORDS;
3145 com_newlocal(c, STR(ch));
3146 }
3147 if (complex) {
3148 /* Generate code for complex arguments only after
3149 having counted the simple arguments */
3150 int ilocal = 0;
3151 for (i = 0; i < nch; i++) {
3152 node *ch = CHILD(n, i);
3153 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003154 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003155 break;
3156 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3157 fp = CHILD(ch, 0);
3158 if (TYPE(fp) != NAME) {
3159 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003160 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003161 com_fpdef(c, ch);
3162 }
3163 ilocal++;
3164 if (++i >= nch)
3165 break;
3166 ch = CHILD(n, i);
3167 if (TYPE(ch) == EQUAL)
3168 i += 2;
3169 else
3170 REQ(ch, COMMA);
3171 }
3172 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003173}
3174
3175static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003176com_file_input(c, n)
3177 struct compiling *c;
3178 node *n;
3179{
3180 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003181 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003182 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003183 doc = get_docstring(n);
3184 if (doc != NULL) {
3185 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003186 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003187 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003188 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003189 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003190 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003191 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003192 for (i = 0; i < NCH(n); i++) {
3193 node *ch = CHILD(n, i);
3194 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3195 com_node(c, ch);
3196 }
3197}
3198
3199/* Top-level compile-node interface */
3200
3201static void
3202compile_funcdef(c, n)
3203 struct compiling *c;
3204 node *n;
3205{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003206 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003207 node *ch;
3208 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003209 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003210 doc = get_docstring(CHILD(n, 4));
3211 if (doc != NULL) {
3212 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003213 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003214 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003215 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003216 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003217 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3218 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003219 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003220 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003221 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003222 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003223 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003224 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003225 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003226 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003227 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003228}
3229
3230static void
Guido van Rossum590baa41993-11-30 13:40:46 +00003231compile_lambdef(c, n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003232 struct compiling *c;
3233 node *n;
3234{
Guido van Rossum590baa41993-11-30 13:40:46 +00003235 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003236 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003237 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003238
3239 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003240 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003241 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003242 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003243 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003244 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003245 else
3246 ch = CHILD(n, 2);
3247 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003248 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003249 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003250}
3251
3252static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003253compile_classdef(c, n)
3254 struct compiling *c;
3255 node *n;
3256{
3257 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003258 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003259 REQ(n, classdef);
3260 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3261 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003262#ifdef PRIVATE_NAME_MANGLING
3263 c->c_private = c->c_name;
3264#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003265 ch = CHILD(n, NCH(n)-1); /* The suite */
3266 doc = get_docstring(ch);
3267 if (doc != NULL) {
3268 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003269 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003270 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003271 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003272 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003273 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003274 }
3275 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003276 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003277 com_node(c, ch);
3278 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003279 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003280 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003281 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003282}
3283
3284static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003285compile_node(c, n)
3286 struct compiling *c;
3287 node *n;
3288{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003289 com_addoparg(c, SET_LINENO, n->n_lineno);
3290
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003291 switch (TYPE(n)) {
3292
Guido van Rossum4c417781991-01-21 16:09:22 +00003293 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003294 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003295 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003296 n = CHILD(n, 0);
3297 if (TYPE(n) != NEWLINE)
3298 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003299 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003300 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003301 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003302 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003303 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003304 break;
3305
Guido van Rossum4c417781991-01-21 16:09:22 +00003306 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003307 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003308 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003309 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003310 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003311 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003312 break;
3313
Guido van Rossum590baa41993-11-30 13:40:46 +00003314 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003315 com_node(c, CHILD(n, 0));
3316 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003317 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003318 break;
3319
Guido van Rossum590baa41993-11-30 13:40:46 +00003320 case lambdef: /* anonymous function definition */
3321 compile_lambdef(c, n);
3322 break;
3323
Guido van Rossum4c417781991-01-21 16:09:22 +00003324 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003325 compile_funcdef(c, n);
3326 break;
3327
Guido van Rossum4c417781991-01-21 16:09:22 +00003328 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003329 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003330 break;
3331
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003332 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003333 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003334 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003335 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003336 }
3337}
3338
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003339/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00003340
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003341 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
3342 instructions that refer to local variables with LOAD_FAST etc.
3343 The latter instructions are much faster because they don't need to
3344 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003345
Guido van Rossum681d79a1995-07-18 14:51:37 +00003346 To find all local variables, we check all STORE_NAME, IMPORT_FROM
3347 and DELETE_NAME instructions. This yields all local variables,
3348 function definitions, class definitions and import statements.
3349 Argument names have already been entered into the list by the
3350 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003351
3352 All remaining LOAD_NAME instructions must refer to non-local (global
3353 or builtin) variables, so are replaced by LOAD_GLOBAL.
3354
3355 There are two problems: 'from foo import *' and 'exec' may introduce
3356 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00003357 case, we can still optimize bona fide locals (since those
3358 statements will be surrounded by fast_2_locals() and
3359 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003360
Guido van Rossum681d79a1995-07-18 14:51:37 +00003361 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00003362
3363static void
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003364optimize(c)
3365 struct compiling *c;
Guido van Rossum282914b1991-04-04 10:42:56 +00003366{
Guido van Rossum0a697f61991-04-16 08:39:12 +00003367 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00003368 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00003369 int oparg = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003370 PyObject *name;
3371 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003372
Guido van Rossum282914b1991-04-04 10:42:56 +00003373#define NEXTOP() (*next_instr++)
3374#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossum79f25d91997-04-29 20:08:16 +00003375#define GETITEM(v, i) (PyList_GetItem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003376#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
3377
Guido van Rossum79f25d91997-04-29 20:08:16 +00003378 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003379
3380 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00003381
Guido van Rossum79f25d91997-04-29 20:08:16 +00003382 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003383 for (;;) {
3384 opcode = NEXTOP();
3385 if (opcode == STOP_CODE)
3386 break;
3387 if (HAS_ARG(opcode))
3388 oparg = NEXTARG();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003389 switch (opcode) {
3390 case STORE_NAME:
3391 case DELETE_NAME:
3392 case IMPORT_FROM:
3393 com_addlocal_o(c, GETNAMEOBJ(oparg));
3394 break;
3395 case EXEC_STMT:
3396 c->c_flags &= ~CO_OPTIMIZED;
3397 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00003398 }
3399 }
3400
Guido van Rossum79f25d91997-04-29 20:08:16 +00003401 if (PyDict_GetItemString(c->c_locals, "*") != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003402 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003403
Guido van Rossum79f25d91997-04-29 20:08:16 +00003404 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003405 for (;;) {
3406 cur_instr = next_instr;
3407 opcode = NEXTOP();
3408 if (opcode == STOP_CODE)
3409 break;
3410 if (HAS_ARG(opcode))
3411 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003412 if (opcode == LOAD_NAME ||
3413 opcode == STORE_NAME ||
3414 opcode == DELETE_NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003415 PyObject *v;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003416 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00003417 name = GETNAMEOBJ(oparg);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003418 v = PyDict_GetItem(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003419 if (v == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003420 if (opcode == LOAD_NAME &&
3421 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003422 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003423 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00003424 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003425 i = PyInt_AsLong(v);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003426 switch (opcode) {
3427 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
3428 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
3429 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
3430 }
3431 cur_instr[1] = i & 0xff;
3432 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00003433 }
3434 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003435
Guido van Rossum681d79a1995-07-18 14:51:37 +00003436 if (c->c_errors == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00003437 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00003438}
3439
Guido van Rossum79f25d91997-04-29 20:08:16 +00003440PyCodeObject *
3441PyNode_Compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003442 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003443 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003444{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003445 return jcompile(n, filename, NULL);
3446}
3447
Guido van Rossum79f25d91997-04-29 20:08:16 +00003448static PyCodeObject *
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003449icompile(n, base)
3450 node *n;
3451 struct compiling *base;
3452{
3453 return jcompile(n, base->c_filename, base);
3454}
3455
Guido van Rossum79f25d91997-04-29 20:08:16 +00003456static PyCodeObject *
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003457jcompile(n, filename, base)
3458 node *n;
3459 char *filename;
3460 struct compiling *base;
3461{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003462 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003463 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003464 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003465 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003466#ifdef PRIVATE_NAME_MANGLING
3467 if (base)
3468 sc.c_private = base->c_private;
3469 else
3470 sc.c_private = NULL;
3471#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003472 compile_node(&sc, n);
3473 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003474 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003475 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003476 sc.c_flags |= CO_NEWLOCALS;
3477 }
3478 else if (TYPE(n) == classdef)
3479 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00003480 co = NULL;
3481 if (sc.c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003482 PyObject *consts, *names, *varnames, *filename, *name;
3483 consts = PyList_AsTuple(sc.c_consts);
3484 names = PyList_AsTuple(sc.c_names);
3485 varnames = PyList_AsTuple(sc.c_varnames);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003486 filename = PyString_InternFromString(sc.c_filename);
3487 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003488 if (!PyErr_Occurred())
3489 co = PyCode_New(sc.c_argcount,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003490 sc.c_nlocals,
Guido van Rossum8b993a91997-01-17 21:04:03 +00003491 sc.c_maxstacklevel,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003492 sc.c_flags,
3493 sc.c_code,
3494 consts,
3495 names,
3496 varnames,
3497 filename,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003498 name,
3499 sc.c_firstlineno,
3500 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003501 Py_XDECREF(consts);
3502 Py_XDECREF(names);
3503 Py_XDECREF(varnames);
3504 Py_XDECREF(filename);
3505 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003506 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003507 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003508 return co;
3509}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003510
3511int
3512PyCode_Addr2Line(co, addrq)
3513 PyCodeObject *co;
3514 int addrq;
3515{
3516 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003517 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003518 int line = co->co_firstlineno;
3519 int addr = 0;
3520 while (--size >= 0) {
3521 addr += *p++;
3522 if (addr > addrq)
3523 break;
3524 line += *p++;
3525 }
3526 return line;
3527}