blob: 5aaf15e15f4d1750573a426dcecfd0a1ebf0a3e2 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum10dc2e81990-11-18 17:27:39 +000032/* Compile an expression node to intermediate code */
33
Guido van Rossum3f5da241990-12-20 15:06:42 +000034/* XXX TO DO:
Guido van Rossum8b993a91997-01-17 21:04:03 +000035 XXX add __doc__ attribute == co_doc to code object attributes?
36 XXX (it's currently the first item of the co_const tuple)
Guido van Rossum3f5da241990-12-20 15:06:42 +000037 XXX Generate simple jump for break/return outside 'try...finally'
Guido van Rossum8b993a91997-01-17 21:04:03 +000038 XXX Allow 'continue' inside try-finally
Guido van Rossum8b993a91997-01-17 21:04:03 +000039 XXX New opcode for loading the initial index for a for loop
Guido van Rossum681d79a1995-07-18 14:51:37 +000040 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000041*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000042
Guido van Rossum8ff077b1996-08-24 06:21:31 +000043#ifndef NO_PRIVATE_NAME_MANGLING
44#define PRIVATE_NAME_MANGLING
45#endif
46
Guido van Rossum79f25d91997-04-29 20:08:16 +000047#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000048
Guido van Rossum10dc2e81990-11-18 17:27:39 +000049#include "node.h"
50#include "token.h"
51#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000052#include "compile.h"
53#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000054#include "structmember.h"
55
56#include <ctype.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000057
Guido van Rossumb05a5c71997-05-07 17:46:13 +000058/* Three symbols from graminit.h are also defined in Python.h, with
59 Py_ prefixes to their names. Python.h can't include graminit.h
60 (which defines too many confusing symbols), but we can check here
61 that they haven't changed (which is very unlikely, but possible). */
62#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000063 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000064#endif
65#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000066 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000067#endif
68#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000069 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000070#endif
71
Guido van Rossum8e793d91997-03-03 19:13:14 +000072int Py_OptimizeFlag = 0;
73
Guido van Rossum8861b741996-07-30 16:49:37 +000074#define OP_DELETE 0
75#define OP_ASSIGN 1
76#define OP_APPLY 2
77
Guido van Rossum79f25d91997-04-29 20:08:16 +000078#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000079
80static struct memberlist code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000081 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
82 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000083 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000084 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000085 {"co_code", T_OBJECT, OFF(co_code), READONLY},
86 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
87 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000088 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000089 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000090 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000091 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
92 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000093 {NULL} /* Sentinel */
94};
95
Guido van Rossum79f25d91997-04-29 20:08:16 +000096static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +000097code_getattr(co, name)
Guido van Rossum79f25d91997-04-29 20:08:16 +000098 PyCodeObject *co;
Guido van Rossum3f5da241990-12-20 15:06:42 +000099 char *name;
100{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000101 return PyMember_Get((char *)co, code_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000102}
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000103
104static void
Guido van Rossum3f5da241990-12-20 15:06:42 +0000105code_dealloc(co)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000106 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000107{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000108 Py_XDECREF(co->co_code);
109 Py_XDECREF(co->co_consts);
110 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000111 Py_XDECREF(co->co_varnames);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000112 Py_XDECREF(co->co_filename);
113 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000114 Py_XDECREF(co->co_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000115 PyMem_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000116}
117
Guido van Rossum79f25d91997-04-29 20:08:16 +0000118static PyObject *
Guido van Rossum2dff9911992-09-03 20:50:59 +0000119code_repr(co)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000120 PyCodeObject *co;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000121{
122 char buf[500];
123 int lineno = -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000124 unsigned char *p;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000125 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000126 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000127
128 _PyCode_GETCODEPTR(co, &p);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000129 if (*p == SET_LINENO)
130 lineno = (p[1] & 0xff) | ((p[2] & 0xff) << 8);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000131 if (co->co_filename && PyString_Check(co->co_filename))
132 filename = PyString_AsString(co->co_filename);
133 if (co->co_name && PyString_Check(co->co_name))
134 name = PyString_AsString(co->co_name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000135 sprintf(buf, "<code object %.100s at %lx, file \"%.300s\", line %d>",
136 name, (long)co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000137 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000138}
139
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000140static int
141code_compare(co, cp)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000142 PyCodeObject *co, *cp;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000143{
144 int cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000145 cmp = co->co_argcount - cp->co_argcount;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000146 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000147 cmp = co->co_nlocals - cp->co_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000148 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000149 cmp = co->co_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000150 if (cmp) return cmp;
Guido van Rossumd076c731998-10-07 19:42:25 +0000151 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000152 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000153 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000154 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000155 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000156 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000157 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000158 return cmp;
159}
160
161static long
162code_hash(co)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000163 PyCodeObject *co;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000164{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000165 long h, h1, h2, h3, h4;
Guido van Rossumd076c731998-10-07 19:42:25 +0000166 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000167 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000168 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000169 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000170 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000171 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000172 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000173 if (h4 == -1) return -1;
174 h = h1 ^ h2 ^ h3 ^ h4 ^
175 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000176 if (h == -1) h = -2;
177 return h;
178}
179
Guido van Rossum79f25d91997-04-29 20:08:16 +0000180PyTypeObject PyCode_Type = {
181 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000182 0,
183 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000184 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000185 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000186 (destructor)code_dealloc, /*tp_dealloc*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000187 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000188 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000189 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000190 (cmpfunc)code_compare, /*tp_compare*/
191 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000192 0, /*tp_as_number*/
193 0, /*tp_as_sequence*/
194 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000195 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000196};
197
Guido van Rossum644a12b1997-04-09 19:24:53 +0000198#define NAME_CHARS \
199 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
200
Guido van Rossum79f25d91997-04-29 20:08:16 +0000201PyCodeObject *
202PyCode_New(argcount, nlocals, stacksize, flags,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000203 code, consts, names, varnames, filename, name,
204 firstlineno, lnotab)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000205 int argcount;
206 int nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000207 int stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000208 int flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000209 PyObject *code;
210 PyObject *consts;
211 PyObject *names;
212 PyObject *varnames;
213 PyObject *filename;
214 PyObject *name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000215 int firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000216 PyObject *lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000217{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000218 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000219 int i;
Guido van Rossumd076c731998-10-07 19:42:25 +0000220 PyBufferProcs *pb;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000221 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000222 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000223 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000224 consts == NULL || !PyTuple_Check(consts) ||
225 names == NULL || !PyTuple_Check(names) ||
226 varnames == NULL || !PyTuple_Check(varnames) ||
227 name == NULL || !PyString_Check(name) ||
228 filename == NULL || !PyString_Check(filename) ||
229 lnotab == NULL || !PyString_Check(lnotab)) {
230 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000231 return NULL;
232 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000233 pb = code->ob_type->tp_as_buffer;
234 if (pb == NULL ||
235 pb->bf_getreadbuffer == NULL ||
236 pb->bf_getsegcount == NULL ||
237 (*pb->bf_getsegcount)(code, NULL) != 1)
238 {
239 PyErr_BadInternalCall();
240 return NULL;
241 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000242 /* Make sure names and varnames are all strings, & intern them */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000243 for (i = PyTuple_Size(names); --i >= 0; ) {
244 PyObject *v = PyTuple_GetItem(names, i);
245 if (v == NULL || !PyString_Check(v)) {
246 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000247 return NULL;
248 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000249 PyString_InternInPlace(&PyTuple_GET_ITEM(names, i));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000250 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000251 for (i = PyTuple_Size(varnames); --i >= 0; ) {
252 PyObject *v = PyTuple_GetItem(varnames, i);
253 if (v == NULL || !PyString_Check(v)) {
254 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000255 return NULL;
256 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000257 PyString_InternInPlace(&PyTuple_GET_ITEM(varnames, i));
258 }
259 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000260 for (i = PyTuple_Size(consts); --i >= 0; ) {
261 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000262 char *p;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000263 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000264 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000265 p = PyString_AsString(v);
Guido van Rossum644a12b1997-04-09 19:24:53 +0000266 if ((int)strspn(p, NAME_CHARS)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000267 != PyString_Size(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000268 continue;
269 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000270 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000271 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000272 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000273 co->co_argcount = argcount;
274 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000275 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000276 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000277 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000278 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000279 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000280 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000281 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000282 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000283 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000284 co->co_varnames = varnames;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000285 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000286 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000287 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000288 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000289 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000290 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000291 co->co_lnotab = lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000292 }
293 return co;
294}
295
296
297/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000298
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000299struct compiling {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000300 PyObject *c_code; /* string */
301 PyObject *c_consts; /* list of objects */
302 PyObject *c_names; /* list of strings (names) */
303 PyObject *c_globals; /* dictionary (value=None) */
304 PyObject *c_locals; /* dictionary (value=localID) */
305 PyObject *c_varnames; /* list (inverse of c_locals) */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000306 int c_nlocals; /* index of next local */
307 int c_argcount; /* number of top-level arguments */
308 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000309 int c_nexti; /* index into c_code */
310 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000311 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000312 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000313 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000314 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000315 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000316 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000317 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000318 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000319 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000320 int c_stacklevel; /* Current stack level */
321 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000322 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000323 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000324 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000325#ifdef PRIVATE_NAME_MANGLING
326 char *c_private; /* for private name mangling */
327#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000328};
329
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000330
Guido van Rossum452a9831996-09-17 14:32:04 +0000331/* Error message including line number */
332
333static void
334com_error(c, exc, msg)
335 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000336 PyObject *exc;
Guido van Rossum452a9831996-09-17 14:32:04 +0000337 char *msg;
338{
339 int n = strlen(msg);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000340 PyObject *v;
Guido van Rossum452a9831996-09-17 14:32:04 +0000341 char buffer[30];
342 char *s;
Guido van Rossum635abd21997-01-06 22:56:52 +0000343 c->c_errors++;
Guido van Rossum452a9831996-09-17 14:32:04 +0000344 if (c->c_lineno <= 1) {
345 /* Unknown line number or single interactive command */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000346 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000347 return;
348 }
349 sprintf(buffer, " (line %d)", c->c_lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000350 v = PyString_FromStringAndSize((char *)NULL, n + strlen(buffer));
Guido van Rossum452a9831996-09-17 14:32:04 +0000351 if (v == NULL)
352 return; /* MemoryError, too bad */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000353 s = PyString_AS_STRING((PyStringObject *)v);
Guido van Rossum452a9831996-09-17 14:32:04 +0000354 strcpy(s, msg);
355 strcat(s, buffer);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000356 PyErr_SetObject(exc, v);
357 Py_DECREF(v);
Guido van Rossum452a9831996-09-17 14:32:04 +0000358}
359
360
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000361/* Interface to the block stack */
362
363static void
364block_push(c, type)
365 struct compiling *c;
366 int type;
367{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000368 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000369 com_error(c, PyExc_SystemError,
370 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000371 }
372 else {
373 c->c_block[c->c_nblocks++] = type;
374 }
375}
376
377static void
378block_pop(c, type)
379 struct compiling *c;
380 int type;
381{
382 if (c->c_nblocks > 0)
383 c->c_nblocks--;
384 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000385 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000386 }
387}
388
389
Guido van Rossum681d79a1995-07-18 14:51:37 +0000390/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000391
Guido van Rossum79f25d91997-04-29 20:08:16 +0000392static int com_init Py_PROTO((struct compiling *, char *));
393static void com_free Py_PROTO((struct compiling *));
394static void com_push Py_PROTO((struct compiling *, int));
395static void com_pop Py_PROTO((struct compiling *, int));
396static void com_done Py_PROTO((struct compiling *));
397static void com_node Py_PROTO((struct compiling *, struct _node *));
398static void com_factor Py_PROTO((struct compiling *, struct _node *));
399static void com_addbyte Py_PROTO((struct compiling *, int));
400static void com_addint Py_PROTO((struct compiling *, int));
401static void com_addoparg Py_PROTO((struct compiling *, int, int));
402static void com_addfwref Py_PROTO((struct compiling *, int, int *));
403static void com_backpatch Py_PROTO((struct compiling *, int));
404static int com_add Py_PROTO((struct compiling *, PyObject *, PyObject *));
405static int com_addconst Py_PROTO((struct compiling *, PyObject *));
406static int com_addname Py_PROTO((struct compiling *, PyObject *));
407static void com_addopname Py_PROTO((struct compiling *, int, node *));
408static void com_list Py_PROTO((struct compiling *, node *, int));
409static int com_argdefs Py_PROTO((struct compiling *, node *));
410static int com_newlocal Py_PROTO((struct compiling *, char *));
411static PyCodeObject *icompile Py_PROTO((struct _node *, struct compiling *));
412static PyCodeObject *jcompile Py_PROTO((struct _node *, char *,
413 struct compiling *));
414static PyObject *parsestrplus Py_PROTO((node *));
415static PyObject *parsestr Py_PROTO((char *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000416
417static int
Guido van Rossum590baa41993-11-30 13:40:46 +0000418com_init(c, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000419 struct compiling *c;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000420 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000421{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000422 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
423 1000)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000424 goto fail_3;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000425 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000426 goto fail_2;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000427 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000428 goto fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000429 if ((c->c_globals = PyDict_New()) == NULL)
Guido van Rossumc5e96291991-12-10 13:53:51 +0000430 goto fail_0;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000431 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000432 goto fail_00;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000433 if ((c->c_varnames = PyList_New(0)) == NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000434 goto fail_000;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000435 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
436 1000)) == NULL)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000437 goto fail_0000;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000438 c->c_nlocals = 0;
439 c->c_argcount = 0;
440 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000441 c->c_nexti = 0;
442 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000443 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000444 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000445 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000446 c->c_begin = 0;
447 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000448 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000449 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000450 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000451 c->c_stacklevel = 0;
452 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000453 c->c_firstlineno = 0;
454 c->c_last_addr = 0;
455 c->c_last_line = 0;
456 c-> c_lnotab_next = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000457 return 1;
458
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000459 fail_0000:
Guido van Rossum72badf51999-12-20 20:40:12 +0000460 Py_DECREF(c->c_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000461 fail_000:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000462 Py_DECREF(c->c_locals);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000463 fail_00:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000464 Py_DECREF(c->c_globals);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000465 fail_0:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000466 Py_DECREF(c->c_names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000467 fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000468 Py_DECREF(c->c_consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000469 fail_2:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000470 Py_DECREF(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000471 fail_3:
472 return 0;
473}
474
475static void
476com_free(c)
477 struct compiling *c;
478{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000479 Py_XDECREF(c->c_code);
480 Py_XDECREF(c->c_consts);
481 Py_XDECREF(c->c_names);
482 Py_XDECREF(c->c_globals);
483 Py_XDECREF(c->c_locals);
484 Py_XDECREF(c->c_varnames);
485 Py_XDECREF(c->c_lnotab);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000486}
487
488static void
Guido van Rossum8b993a91997-01-17 21:04:03 +0000489com_push(c, n)
490 struct compiling *c;
491 int n;
492{
493 c->c_stacklevel += n;
494 if (c->c_stacklevel > c->c_maxstacklevel)
495 c->c_maxstacklevel = c->c_stacklevel;
496}
497
498static void
499com_pop(c, n)
500 struct compiling *c;
501 int n;
502{
503 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000504 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000505 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
506 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000507 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000508 c->c_stacklevel = 0;
509 }
510 else
511 c->c_stacklevel -= n;
512}
513
514static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000515com_done(c)
516 struct compiling *c;
517{
518 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000519 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000520 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000521 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000522}
523
524static void
525com_addbyte(c, byte)
526 struct compiling *c;
527 int byte;
528{
529 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000530 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000531 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000532 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000533 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000534 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000535 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000536 com_error(c, PyExc_SystemError,
537 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000538 }
539 if (c->c_code == NULL)
540 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000541 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000542 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000543 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000544 c->c_errors++;
545 return;
546 }
547 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000548 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000549}
550
551static void
552com_addint(c, x)
553 struct compiling *c;
554 int x;
555{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000556 com_addbyte(c, x & 0xff);
557 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000558}
559
560static void
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000561com_add_lnotab(c, addr, line)
562 struct compiling *c;
563 int addr;
564 int line;
565{
566 int size;
567 char *p;
568 if (c->c_lnotab == NULL)
569 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000570 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000571 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000572 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000573 c->c_errors++;
574 return;
575 }
576 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000577 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000578 *p++ = addr;
579 *p++ = line;
580 c->c_lnotab_next += 2;
581}
582
583static void
584com_set_lineno(c, lineno)
585 struct compiling *c;
586 int lineno;
587{
588 c->c_lineno = lineno;
589 if (c->c_firstlineno == 0) {
590 c->c_firstlineno = c->c_last_line = lineno;
591 }
592 else {
593 int incr_addr = c->c_nexti - c->c_last_addr;
594 int incr_line = lineno - c->c_last_line;
595 while (incr_addr > 0 || incr_line > 0) {
596 int trunc_addr = incr_addr;
597 int trunc_line = incr_line;
598 if (trunc_addr > 255)
599 trunc_addr = 255;
600 if (trunc_line > 255)
601 trunc_line = 255;
602 com_add_lnotab(c, trunc_addr, trunc_line);
603 incr_addr -= trunc_addr;
604 incr_line -= trunc_line;
605 }
606 c->c_last_addr = c->c_nexti;
607 c->c_last_line = lineno;
608 }
609}
610
611static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000612com_addoparg(c, op, arg)
613 struct compiling *c;
614 int op;
615 int arg;
616{
Guido van Rossum8e793d91997-03-03 19:13:14 +0000617 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000618 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000619 if (Py_OptimizeFlag)
620 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000621 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000622 com_addbyte(c, op);
623 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000624}
625
626static void
627com_addfwref(c, op, p_anchor)
628 struct compiling *c;
629 int op;
630 int *p_anchor;
631{
632 /* Compile a forward reference for backpatching */
633 int here;
634 int anchor;
635 com_addbyte(c, op);
636 here = c->c_nexti;
637 anchor = *p_anchor;
638 *p_anchor = here;
639 com_addint(c, anchor == 0 ? 0 : here - anchor);
640}
641
642static void
643com_backpatch(c, anchor)
644 struct compiling *c;
645 int anchor; /* Must be nonzero */
646{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000647 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000648 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000649 int dist;
650 int prev;
651 for (;;) {
652 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000653 prev = code[anchor] + (code[anchor+1] << 8);
654 dist = target - (anchor+2);
655 code[anchor] = dist & 0xff;
656 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000657 if (!prev)
658 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000659 anchor -= prev;
660 }
661}
662
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000663/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000664
665static int
666com_add(c, list, v)
667 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000668 PyObject *list;
669 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000670{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000671 int n = PyList_Size(list);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000672 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +0000673 /* XXX This is quadratic in the number of names per compilation unit.
674 XXX Should use a dictionary. */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000675 for (i = n; --i >= 0; ) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000676 PyObject *w = PyList_GetItem(list, i);
677 if (v->ob_type == w->ob_type && PyObject_Compare(v, w) == 0)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000678 return i;
679 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000680 /* Check for error from PyObject_Compare */
681 if (PyErr_Occurred() || PyList_Append(list, v) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000682 c->c_errors++;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000683 return n;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000684}
685
686static int
687com_addconst(c, v)
688 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000689 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000690{
691 return com_add(c, c->c_consts, v);
692}
693
694static int
695com_addname(c, v)
696 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000697 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000698{
699 return com_add(c, c->c_names, v);
700}
701
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000702#ifdef PRIVATE_NAME_MANGLING
703static int
704com_mangle(c, name, buffer, maxlen)
705 struct compiling *c;
706 char *name;
707 char *buffer;
708 int maxlen;
709{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000710 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000711 This is independent from how the name is used. */
712 char *p;
713 int nlen, plen;
714 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000715 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000716 return 0; /* Don't mangle __extremely_long_names */
717 if (name[nlen-1] == '_' && name[nlen-2] == '_')
718 return 0; /* Don't mangle __whatever__ */
719 p = c->c_private;
720 /* Strip leading underscores from class name */
721 while (*p == '_')
722 p++;
723 if (*p == '\0')
724 return 0; /* Don't mangle if class is just underscores */
725 plen = strlen(p);
726 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000727 plen = maxlen-nlen-2; /* Truncate class name if too long */
728 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000729 buffer[0] = '_';
730 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000731 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000732 /* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
733 return 1;
734}
735#endif
736
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000737static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000738com_addopnamestr(c, op, name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000739 struct compiling *c;
740 int op;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000741 char *name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000742{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000743 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000744 int i;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000745#ifdef PRIVATE_NAME_MANGLING
746 char buffer[256];
747 if (name != NULL && name[0] == '_' && name[1] == '_' &&
748 c->c_private != NULL &&
749 com_mangle(c, name, buffer, (int)sizeof(buffer)))
750 name = buffer;
751#endif
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000752 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000753 c->c_errors++;
754 i = 255;
755 }
756 else {
757 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000758 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000759 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000760 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
761 switch (op) {
762 case LOAD_NAME:
763 case STORE_NAME:
764 case DELETE_NAME:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000765 if (PyDict_GetItemString(c->c_globals, name) != NULL) {
Guido van Rossumc5e96291991-12-10 13:53:51 +0000766 switch (op) {
767 case LOAD_NAME: op = LOAD_GLOBAL; break;
768 case STORE_NAME: op = STORE_GLOBAL; break;
769 case DELETE_NAME: op = DELETE_GLOBAL; break;
770 }
771 }
772 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000773 com_addoparg(c, op, i);
774}
775
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000776static void
777com_addopname(c, op, n)
778 struct compiling *c;
779 int op;
780 node *n;
781{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000782 char *name;
783 char buffer[1000];
784 /* XXX it is possible to write this code without the 1000
785 chars on the total length of dotted names, I just can't be
786 bothered right now */
787 if (TYPE(n) == STAR)
788 name = "*";
789 else if (TYPE(n) == dotted_name) {
790 char *p = buffer;
791 int i;
792 name = buffer;
793 for (i = 0; i < NCH(n); i += 2) {
794 char *s = STR(CHILD(n, i));
795 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000796 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000797 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +0000798 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000799 break;
800 }
801 if (p != buffer)
802 *p++ = '.';
803 strcpy(p, s);
804 p = strchr(p, '\0');
805 }
806 }
807 else {
808 REQ(n, NAME);
809 name = STR(n);
810 }
811 com_addopnamestr(c, op, name);
812}
813
Guido van Rossum79f25d91997-04-29 20:08:16 +0000814static PyObject *
Guido van Rossum452a9831996-09-17 14:32:04 +0000815parsenumber(co, s)
816 struct compiling *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000817 char *s;
818{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000819 extern double atof Py_PROTO((const char *));
Guido van Rossumc5e96291991-12-10 13:53:51 +0000820 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000821 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000822 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +0000823#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +0000824 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +0000825 int imflag;
826#endif
827
Guido van Rossum282914b1991-04-04 10:42:56 +0000828 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000829 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +0000830#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +0000831 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +0000832#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000833 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000834 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000835 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000836 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000837 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000838 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000839 if (*end == '\0') {
840 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000841 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000842 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000843 return NULL;
844 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000845 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000846 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000847 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +0000848#ifndef WITHOUT_COMPLEX
849 if (imflag) {
850 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000851 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +0000852 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000853 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000854 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +0000855 }
Guido van Rossumac1fc951997-10-08 15:23:55 +0000856 else
Guido van Rossum50564e81996-01-12 01:13:16 +0000857#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +0000858 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000859 PyFPE_START_PROTECT("atof", return 0)
860 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000861 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000862 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000863 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000864}
865
Guido van Rossum79f25d91997-04-29 20:08:16 +0000866static PyObject *
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000867parsestr(s)
868 char *s;
869{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000870 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000871 int len;
872 char *buf;
873 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000874 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000875 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +0000876 int first = *s;
877 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000878 int rawmode = 0;
879 int unicode = 0;
880 if (isalpha(quote) || quote == '_') {
881 if (quote == 'u' || quote == 'U') {
882 quote = *++s;
883 unicode = 1;
884 }
885 if (quote == 'r' || quote == 'R') {
886 quote = *++s;
887 rawmode = 1;
888 }
889 }
Guido van Rossum8054fad1993-10-26 15:19:44 +0000890 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000891 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000892 return NULL;
893 }
894 s++;
895 len = strlen(s);
Guido van Rossum8054fad1993-10-26 15:19:44 +0000896 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000897 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000898 return NULL;
899 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000900 if (len >= 4 && s[0] == quote && s[1] == quote) {
901 s += 2;
902 len -= 2;
903 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000904 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000905 return NULL;
906 }
907 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000908 if (unicode) {
909 if (rawmode)
910 return PyUnicode_DecodeRawUnicodeEscape(
911 s, len, NULL);
912 else
913 return PyUnicode_DecodeUnicodeEscape(
914 s, len, NULL);
915 }
916 else if (rawmode || strchr(s, '\\') == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000917 return PyString_FromStringAndSize(s, len);
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000918 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000919 v = PyString_FromStringAndSize((char *)NULL, len);
920 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000921 end = s + len;
922 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000923 if (*s != '\\') {
924 *p++ = *s++;
925 continue;
926 }
927 s++;
928 switch (*s++) {
929 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000930 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000931 case '\\': *p++ = '\\'; break;
932 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000933 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000934 case 'b': *p++ = '\b'; break;
935 case 'f': *p++ = '\014'; break; /* FF */
936 case 't': *p++ = '\t'; break;
937 case 'n': *p++ = '\n'; break;
938 case 'r': *p++ = '\r'; break;
939 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000940 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
941 case '0': case '1': case '2': case '3':
942 case '4': case '5': case '6': case '7':
943 c = s[-1] - '0';
944 if ('0' <= *s && *s <= '7') {
945 c = (c<<3) + *s++ - '0';
946 if ('0' <= *s && *s <= '7')
947 c = (c<<3) + *s++ - '0';
948 }
949 *p++ = c;
950 break;
951 case 'x':
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000952 if (isxdigit(Py_CHARMASK(*s))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000953 unsigned int x = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000954 do {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000955 c = Py_CHARMASK(*s);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000956 s++;
Guido van Rossumed1100f1997-10-20 23:24:07 +0000957 x = (x<<4) & ~0xF;
958 if (isdigit(c))
959 x += c - '0';
960 else if (islower(c))
961 x += 10 + c - 'a';
962 else
963 x += 10 + c - 'A';
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000964 } while (isxdigit(Py_CHARMASK(*s)));
Guido van Rossumed1100f1997-10-20 23:24:07 +0000965 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000966 break;
967 }
968 /* FALLTHROUGH */
969 default: *p++ = '\\'; *p++ = s[-1]; break;
970 }
971 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000972 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000973 return v;
974}
975
Guido van Rossum79f25d91997-04-29 20:08:16 +0000976static PyObject *
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000977parsestrplus(n)
978 node *n;
979{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000980 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000981 int i;
982 REQ(CHILD(n, 0), STRING);
983 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
984 /* String literal concatenation */
985 for (i = 1; i < NCH(n) && v != NULL; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000986 PyString_ConcatAndDel(&v, parsestr(STR(CHILD(n, i))));
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000987 }
988 }
989 return v;
990}
991
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000992static void
993com_list_constructor(c, n)
994 struct compiling *c;
995 node *n;
996{
997 int len;
998 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000999 if (TYPE(n) != testlist)
1000 REQ(n, exprlist);
1001 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
1002 len = (NCH(n) + 1) / 2;
1003 for (i = 0; i < NCH(n); i += 2)
1004 com_node(c, CHILD(n, i));
1005 com_addoparg(c, BUILD_LIST, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001006 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001007}
1008
1009static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001010com_dictmaker(c, n)
1011 struct compiling *c;
1012 node *n;
1013{
1014 int i;
1015 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1016 for (i = 0; i+2 < NCH(n); i += 4) {
1017 /* We must arrange things just right for STORE_SUBSCR.
1018 It wants the stack to look like (value) (dict) (key) */
1019 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001020 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001021 com_node(c, CHILD(n, i+2)); /* value */
1022 com_addbyte(c, ROT_TWO);
1023 com_node(c, CHILD(n, i)); /* key */
1024 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001025 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001026 }
1027}
1028
1029static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001030com_atom(c, n)
1031 struct compiling *c;
1032 node *n;
1033{
1034 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001035 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001036 int i;
1037 REQ(n, atom);
1038 ch = CHILD(n, 0);
1039 switch (TYPE(ch)) {
1040 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001041 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001042 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001043 com_push(c, 1);
1044 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001045 else
1046 com_node(c, CHILD(n, 1));
1047 break;
1048 case LSQB:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001049 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001050 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001051 com_push(c, 1);
1052 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001053 else
1054 com_list_constructor(c, CHILD(n, 1));
1055 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001056 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001057 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001058 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001059 if (TYPE(CHILD(n, 1)) != RBRACE)
1060 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001061 break;
1062 case BACKQUOTE:
1063 com_node(c, CHILD(n, 1));
1064 com_addbyte(c, UNARY_CONVERT);
1065 break;
1066 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001067 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001068 i = 255;
1069 }
1070 else {
1071 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001072 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001073 }
1074 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001075 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001076 break;
1077 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001078 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001079 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001080 c->c_errors++;
1081 i = 255;
1082 }
1083 else {
1084 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001085 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001086 }
1087 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001088 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001089 break;
1090 case NAME:
1091 com_addopname(c, LOAD_NAME, ch);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001092 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001093 break;
1094 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001095 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001096 com_error(c, PyExc_SystemError,
1097 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001098 }
1099}
1100
1101static void
1102com_slice(c, n, op)
1103 struct compiling *c;
1104 node *n;
1105 int op;
1106{
1107 if (NCH(n) == 1) {
1108 com_addbyte(c, op);
1109 }
1110 else if (NCH(n) == 2) {
1111 if (TYPE(CHILD(n, 0)) != COLON) {
1112 com_node(c, CHILD(n, 0));
1113 com_addbyte(c, op+1);
1114 }
1115 else {
1116 com_node(c, CHILD(n, 1));
1117 com_addbyte(c, op+2);
1118 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001119 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001120 }
1121 else {
1122 com_node(c, CHILD(n, 0));
1123 com_node(c, CHILD(n, 2));
1124 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001125 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001126 }
1127}
1128
Guido van Rossum635abd21997-01-06 22:56:52 +00001129static void
1130com_argument(c, n, pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001131 struct compiling *c;
1132 node *n; /* argument */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001133 PyObject **pkeywords;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001134{
1135 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001136 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001137 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001138 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001139 com_error(c, PyExc_SyntaxError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001140 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001141 }
1142 else {
1143 com_node(c, CHILD(n, 0));
1144 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001145 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001146 }
1147 m = n;
1148 do {
1149 m = CHILD(m, 0);
1150 } while (NCH(m) == 1);
1151 if (TYPE(m) != NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001152 com_error(c, PyExc_SyntaxError,
1153 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001154 }
1155 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001156 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001157 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001158 *pkeywords = PyDict_New();
Guido van Rossum635abd21997-01-06 22:56:52 +00001159 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001160 c->c_errors++;
1161 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001162 if (PyDict_GetItem(*pkeywords, v) != NULL)
1163 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001164 "duplicate keyword argument");
1165 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001166 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001167 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001168 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001169 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001170 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001171 }
1172 }
1173 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001174}
1175
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001176static void
1177com_call_function(c, n)
1178 struct compiling *c;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001179 node *n; /* EITHER arglist OR ')' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001180{
1181 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001182 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001183 }
1184 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001185 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001186 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001187 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001188 int star_flag = 0;
1189 int starstar_flag = 0;
1190 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001191 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001192 na = 0;
1193 nk = 0;
1194 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001195 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001196 if (TYPE(ch) == STAR ||
1197 TYPE(ch) == DOUBLESTAR)
1198 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001199 if (ch->n_lineno != lineno) {
1200 lineno = ch->n_lineno;
1201 com_addoparg(c, SET_LINENO, lineno);
1202 }
1203 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001204 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001205 na++;
1206 else
1207 nk++;
1208 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001209 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001210 while (i < NCH(n)) {
1211 node *tok = CHILD(n, i);
1212 node *ch = CHILD(n, i+1);
1213 i += 3;
1214 switch (TYPE(tok)) {
1215 case STAR: star_flag = 1; break;
1216 case DOUBLESTAR: starstar_flag = 1; break;
1217 }
1218 com_node(c, ch);
1219 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001220 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001221 com_error(c, PyExc_SyntaxError,
1222 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001223 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001224 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001225 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001226 star_flag + (starstar_flag << 1);
1227 else
1228 opcode = CALL_FUNCTION;
1229 com_addoparg(c, opcode, na | (nk << 8));
1230 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001231 }
1232}
1233
1234static void
1235com_select_member(c, n)
1236 struct compiling *c;
1237 node *n;
1238{
1239 com_addopname(c, LOAD_ATTR, n);
1240}
1241
1242static void
Guido van Rossum8861b741996-07-30 16:49:37 +00001243com_sliceobj(c, n)
1244 struct compiling *c;
1245 node *n;
1246{
1247 int i=0;
1248 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001249 node *ch;
1250
1251 /* first argument */
1252 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001253 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001254 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001255 i++;
1256 }
1257 else {
1258 com_node(c, CHILD(n,i));
1259 i++;
1260 REQ(CHILD(n,i),COLON);
1261 i++;
1262 }
1263 /* second argument */
1264 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1265 com_node(c, CHILD(n,i));
1266 i++;
1267 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001268 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001269 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001270 com_push(c, 1);
1271 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001272 /* remaining arguments */
1273 for (; i < NCH(n); i++) {
1274 ns++;
1275 ch=CHILD(n,i);
1276 REQ(ch, sliceop);
1277 if (NCH(ch) == 1) {
1278 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001279 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001280 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001281 }
1282 else
1283 com_node(c, CHILD(ch,1));
1284 }
1285 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001286 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001287}
1288
1289static void
1290com_subscript(c, n)
1291 struct compiling *c;
1292 node *n;
1293{
1294 node *ch;
1295 REQ(n, subscript);
1296 ch = CHILD(n,0);
1297 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001298 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001299 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001300 com_push(c, 1);
1301 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001302 else {
1303 /* check for slice */
1304 if ((TYPE(ch) == COLON || NCH(n) > 1))
1305 com_sliceobj(c, n);
1306 else {
1307 REQ(ch, test);
1308 com_node(c, ch);
1309 }
1310 }
1311}
1312
1313static void
1314com_subscriptlist(c, n, assigning)
1315 struct compiling *c;
1316 node *n;
1317 int assigning;
1318{
1319 int i, op;
1320 REQ(n, subscriptlist);
1321 /* Check to make backward compatible slice behavior for '[i:j]' */
1322 if (NCH(n) == 1) {
1323 node *sub = CHILD(n, 0); /* subscript */
1324 /* Make it is a simple slice.
Guido van Rossum8b993a91997-01-17 21:04:03 +00001325 Should have exactly one colon. */
Guido van Rossum8861b741996-07-30 16:49:37 +00001326 if ((TYPE(CHILD(sub, 0)) == COLON
1327 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
Guido van Rossum8b993a91997-01-17 21:04:03 +00001328 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1329 {
Guido van Rossum8861b741996-07-30 16:49:37 +00001330 if (assigning == OP_APPLY)
1331 op = SLICE;
1332 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001333 op = ((assigning == OP_ASSIGN) ?
1334 STORE_SLICE : DELETE_SLICE);
Guido van Rossum8861b741996-07-30 16:49:37 +00001335 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001336 if (op == STORE_SLICE)
1337 com_pop(c, 2);
1338 else if (op == DELETE_SLICE)
1339 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001340 return;
1341 }
1342 }
1343 /* Else normal subscriptlist. Compile each subscript. */
1344 for (i = 0; i < NCH(n); i += 2)
1345 com_subscript(c, CHILD(n, i));
1346 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001347 if (NCH(n) > 1) {
1348 i = (NCH(n)+1) / 2;
1349 com_addoparg(c, BUILD_TUPLE, i);
1350 com_pop(c, i-1);
1351 }
1352 if (assigning == OP_APPLY) {
Guido van Rossum8861b741996-07-30 16:49:37 +00001353 op = BINARY_SUBSCR;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001354 i = 1;
1355 }
1356 else if (assigning == OP_ASSIGN) {
1357 op = STORE_SUBSCR;
1358 i = 3;
1359 }
1360 else {
1361 op = DELETE_SUBSCR;
1362 i = 2;
1363 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001364 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001365 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001366}
1367
1368static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001369com_apply_trailer(c, n)
1370 struct compiling *c;
1371 node *n;
1372{
1373 REQ(n, trailer);
1374 switch (TYPE(CHILD(n, 0))) {
1375 case LPAR:
1376 com_call_function(c, CHILD(n, 1));
1377 break;
1378 case DOT:
1379 com_select_member(c, CHILD(n, 1));
1380 break;
1381 case LSQB:
Guido van Rossum8861b741996-07-30 16:49:37 +00001382 com_subscriptlist(c, CHILD(n, 1), OP_APPLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001383 break;
1384 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001385 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001386 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001387 }
1388}
1389
1390static void
Guido van Rossum50564e81996-01-12 01:13:16 +00001391com_power(c, n)
1392 struct compiling *c;
1393 node *n;
1394{
1395 int i;
1396 REQ(n, power);
1397 com_atom(c, CHILD(n, 0));
1398 for (i = 1; i < NCH(n); i++) {
1399 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1400 com_factor(c, CHILD(n, i+1));
1401 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001402 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001403 break;
1404 }
1405 else
1406 com_apply_trailer(c, CHILD(n, i));
1407 }
1408}
1409
1410static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001411com_factor(c, n)
1412 struct compiling *c;
1413 node *n;
1414{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001415 REQ(n, factor);
1416 if (TYPE(CHILD(n, 0)) == PLUS) {
1417 com_factor(c, CHILD(n, 1));
1418 com_addbyte(c, UNARY_POSITIVE);
1419 }
1420 else if (TYPE(CHILD(n, 0)) == MINUS) {
1421 com_factor(c, CHILD(n, 1));
1422 com_addbyte(c, UNARY_NEGATIVE);
1423 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001424 else if (TYPE(CHILD(n, 0)) == TILDE) {
1425 com_factor(c, CHILD(n, 1));
1426 com_addbyte(c, UNARY_INVERT);
1427 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001428 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001429 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001430 }
1431}
1432
1433static void
1434com_term(c, n)
1435 struct compiling *c;
1436 node *n;
1437{
1438 int i;
1439 int op;
1440 REQ(n, term);
1441 com_factor(c, CHILD(n, 0));
1442 for (i = 2; i < NCH(n); i += 2) {
1443 com_factor(c, CHILD(n, i));
1444 switch (TYPE(CHILD(n, i-1))) {
1445 case STAR:
1446 op = BINARY_MULTIPLY;
1447 break;
1448 case SLASH:
1449 op = BINARY_DIVIDE;
1450 break;
1451 case PERCENT:
1452 op = BINARY_MODULO;
1453 break;
1454 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001455 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001456 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001457 op = 255;
1458 }
1459 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001460 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001461 }
1462}
1463
1464static void
1465com_arith_expr(c, n)
1466 struct compiling *c;
1467 node *n;
1468{
1469 int i;
1470 int op;
1471 REQ(n, arith_expr);
1472 com_term(c, CHILD(n, 0));
1473 for (i = 2; i < NCH(n); i += 2) {
1474 com_term(c, CHILD(n, i));
1475 switch (TYPE(CHILD(n, i-1))) {
1476 case PLUS:
1477 op = BINARY_ADD;
1478 break;
1479 case MINUS:
1480 op = BINARY_SUBTRACT;
1481 break;
1482 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001483 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001484 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001485 op = 255;
1486 }
1487 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001488 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001489 }
1490}
1491
1492static void
1493com_shift_expr(c, n)
1494 struct compiling *c;
1495 node *n;
1496{
1497 int i;
1498 int op;
1499 REQ(n, shift_expr);
1500 com_arith_expr(c, CHILD(n, 0));
1501 for (i = 2; i < NCH(n); i += 2) {
1502 com_arith_expr(c, CHILD(n, i));
1503 switch (TYPE(CHILD(n, i-1))) {
1504 case LEFTSHIFT:
1505 op = BINARY_LSHIFT;
1506 break;
1507 case RIGHTSHIFT:
1508 op = BINARY_RSHIFT;
1509 break;
1510 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001511 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001512 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001513 op = 255;
1514 }
1515 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001516 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001517 }
1518}
1519
1520static void
1521com_and_expr(c, n)
1522 struct compiling *c;
1523 node *n;
1524{
1525 int i;
1526 int op;
1527 REQ(n, and_expr);
1528 com_shift_expr(c, CHILD(n, 0));
1529 for (i = 2; i < NCH(n); i += 2) {
1530 com_shift_expr(c, CHILD(n, i));
1531 if (TYPE(CHILD(n, i-1)) == AMPER) {
1532 op = BINARY_AND;
1533 }
1534 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001535 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001536 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001537 op = 255;
1538 }
1539 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001540 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001541 }
1542}
1543
1544static void
1545com_xor_expr(c, n)
1546 struct compiling *c;
1547 node *n;
1548{
1549 int i;
1550 int op;
1551 REQ(n, xor_expr);
1552 com_and_expr(c, CHILD(n, 0));
1553 for (i = 2; i < NCH(n); i += 2) {
1554 com_and_expr(c, CHILD(n, i));
1555 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1556 op = BINARY_XOR;
1557 }
1558 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001559 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001560 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001561 op = 255;
1562 }
1563 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001564 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001565 }
1566}
1567
1568static void
1569com_expr(c, n)
1570 struct compiling *c;
1571 node *n;
1572{
1573 int i;
1574 int op;
1575 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001576 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001577 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001578 com_xor_expr(c, CHILD(n, i));
1579 if (TYPE(CHILD(n, i-1)) == VBAR) {
1580 op = BINARY_OR;
1581 }
1582 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001583 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001584 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001585 op = 255;
1586 }
1587 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001588 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001589 }
1590}
1591
1592static enum cmp_op
1593cmp_type(n)
1594 node *n;
1595{
1596 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001597 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001598 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1599 if (NCH(n) == 1) {
1600 n = CHILD(n, 0);
1601 switch (TYPE(n)) {
1602 case LESS: return LT;
1603 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001604 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001605 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001606 case LESSEQUAL: return LE;
1607 case GREATEREQUAL: return GE;
1608 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001609 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1610 if (strcmp(STR(n), "is") == 0) return IS;
1611 }
1612 }
1613 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001614 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001615 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1616 return NOT_IN;
1617 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1618 return IS_NOT;
1619 }
1620 }
1621 return BAD;
1622}
1623
1624static void
1625com_comparison(c, n)
1626 struct compiling *c;
1627 node *n;
1628{
1629 int i;
1630 enum cmp_op op;
1631 int anchor;
1632 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1633 com_expr(c, CHILD(n, 0));
1634 if (NCH(n) == 1)
1635 return;
1636
1637 /****************************************************************
1638 The following code is generated for all but the last
1639 comparison in a chain:
1640
1641 label: on stack: opcode: jump to:
1642
1643 a <code to load b>
1644 a, b DUP_TOP
1645 a, b, b ROT_THREE
1646 b, a, b COMPARE_OP
1647 b, 0-or-1 JUMP_IF_FALSE L1
1648 b, 1 POP_TOP
1649 b
1650
1651 We are now ready to repeat this sequence for the next
1652 comparison in the chain.
1653
1654 For the last we generate:
1655
1656 b <code to load c>
1657 b, c COMPARE_OP
1658 0-or-1
1659
1660 If there were any jumps to L1 (i.e., there was more than one
1661 comparison), we generate:
1662
1663 0-or-1 JUMP_FORWARD L2
1664 L1: b, 0 ROT_TWO
1665 0, b POP_TOP
1666 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00001667 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001668 ****************************************************************/
1669
1670 anchor = 0;
1671
1672 for (i = 2; i < NCH(n); i += 2) {
1673 com_expr(c, CHILD(n, i));
1674 if (i+2 < NCH(n)) {
1675 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001676 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001677 com_addbyte(c, ROT_THREE);
1678 }
1679 op = cmp_type(CHILD(n, i-1));
1680 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001681 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001682 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001683 }
1684 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001685 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001686 if (i+2 < NCH(n)) {
1687 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1688 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001689 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001690 }
1691 }
1692
1693 if (anchor) {
1694 int anchor2 = 0;
1695 com_addfwref(c, JUMP_FORWARD, &anchor2);
1696 com_backpatch(c, anchor);
1697 com_addbyte(c, ROT_TWO);
1698 com_addbyte(c, POP_TOP);
1699 com_backpatch(c, anchor2);
1700 }
1701}
1702
1703static void
1704com_not_test(c, n)
1705 struct compiling *c;
1706 node *n;
1707{
1708 REQ(n, not_test); /* 'not' not_test | comparison */
1709 if (NCH(n) == 1) {
1710 com_comparison(c, CHILD(n, 0));
1711 }
1712 else {
1713 com_not_test(c, CHILD(n, 1));
1714 com_addbyte(c, UNARY_NOT);
1715 }
1716}
1717
1718static void
1719com_and_test(c, n)
1720 struct compiling *c;
1721 node *n;
1722{
1723 int i;
1724 int anchor;
1725 REQ(n, and_test); /* not_test ('and' not_test)* */
1726 anchor = 0;
1727 i = 0;
1728 for (;;) {
1729 com_not_test(c, CHILD(n, i));
1730 if ((i += 2) >= NCH(n))
1731 break;
1732 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1733 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001734 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001735 }
1736 if (anchor)
1737 com_backpatch(c, anchor);
1738}
1739
1740static void
1741com_test(c, n)
1742 struct compiling *c;
1743 node *n;
1744{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001745 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00001746 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001747 PyObject *v;
Guido van Rossum57531fe1993-11-30 14:57:42 +00001748 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001749 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001750 v = (PyObject *) icompile(CHILD(n, 0), c);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001751 if (v == NULL) {
1752 c->c_errors++;
1753 i = 255;
1754 }
1755 else {
1756 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001757 Py_DECREF(v);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001758 }
1759 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001760 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001761 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001762 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001763 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001764 else {
1765 int anchor = 0;
1766 int i = 0;
1767 for (;;) {
1768 com_and_test(c, CHILD(n, i));
1769 if ((i += 2) >= NCH(n))
1770 break;
1771 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1772 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001773 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001774 }
1775 if (anchor)
1776 com_backpatch(c, anchor);
1777 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001778}
1779
1780static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001781com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001782 struct compiling *c;
1783 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001784 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001785{
1786 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001787 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001788 com_node(c, CHILD(n, 0));
1789 }
1790 else {
1791 int i;
1792 int len;
1793 len = (NCH(n) + 1) / 2;
1794 for (i = 0; i < NCH(n); i += 2)
1795 com_node(c, CHILD(n, i));
1796 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001797 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001798 }
1799}
1800
1801
1802/* Begin of assignment compilation */
1803
Guido van Rossum79f25d91997-04-29 20:08:16 +00001804static void com_assign_name Py_PROTO((struct compiling *, node *, int));
1805static void com_assign Py_PROTO((struct compiling *, node *, int));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001806
1807static void
1808com_assign_attr(c, n, assigning)
1809 struct compiling *c;
1810 node *n;
1811 int assigning;
1812{
1813 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001814 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001815}
1816
1817static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001818com_assign_trailer(c, n, assigning)
1819 struct compiling *c;
1820 node *n;
1821 int assigning;
1822{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001823 REQ(n, trailer);
1824 switch (TYPE(CHILD(n, 0))) {
1825 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001826 com_error(c, PyExc_SyntaxError,
1827 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001828 break;
1829 case DOT: /* '.' NAME */
1830 com_assign_attr(c, CHILD(n, 1), assigning);
1831 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001832 case LSQB: /* '[' subscriptlist ']' */
1833 com_subscriptlist(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001834 break;
1835 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001836 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001837 }
1838}
1839
1840static void
1841com_assign_tuple(c, n, assigning)
1842 struct compiling *c;
1843 node *n;
1844 int assigning;
1845{
1846 int i;
1847 if (TYPE(n) != testlist)
1848 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001849 if (assigning) {
1850 i = (NCH(n)+1)/2;
1851 com_addoparg(c, UNPACK_TUPLE, i);
1852 com_push(c, i-1);
1853 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001854 for (i = 0; i < NCH(n); i += 2)
1855 com_assign(c, CHILD(n, i), assigning);
1856}
1857
1858static void
1859com_assign_list(c, n, assigning)
1860 struct compiling *c;
1861 node *n;
1862 int assigning;
1863{
1864 int i;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001865 if (assigning) {
1866 i = (NCH(n)+1)/2;
1867 com_addoparg(c, UNPACK_LIST, i);
1868 com_push(c, i-1);
1869 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001870 for (i = 0; i < NCH(n); i += 2)
1871 com_assign(c, CHILD(n, i), assigning);
1872}
1873
1874static void
1875com_assign_name(c, n, assigning)
1876 struct compiling *c;
1877 node *n;
1878 int assigning;
1879{
1880 REQ(n, NAME);
1881 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001882 if (assigning)
1883 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001884}
1885
1886static void
1887com_assign(c, n, assigning)
1888 struct compiling *c;
1889 node *n;
1890 int assigning;
1891{
1892 /* Loop to avoid trivial recursion */
1893 for (;;) {
1894 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001895
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001896 case exprlist:
1897 case testlist:
1898 if (NCH(n) > 1) {
1899 com_assign_tuple(c, n, assigning);
1900 return;
1901 }
1902 n = CHILD(n, 0);
1903 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001904
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001905 case test:
1906 case and_test:
1907 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001908 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001909 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001910 case xor_expr:
1911 case and_expr:
1912 case shift_expr:
1913 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001914 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00001915 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001916 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001917 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001918 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001919 return;
1920 }
1921 n = CHILD(n, 0);
1922 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001923
Guido van Rossum50564e81996-01-12 01:13:16 +00001924 case power: /* atom trailer* ('**' power)* */
1925/* ('+'|'-'|'~') factor | atom trailer* */
1926 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001927 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001928 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001929 return;
1930 }
Guido van Rossum50564e81996-01-12 01:13:16 +00001931 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001932 int i;
1933 com_node(c, CHILD(n, 0));
1934 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00001935 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001936 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001937 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00001938 return;
1939 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001940 com_apply_trailer(c, CHILD(n, i));
1941 } /* NB i is still alive */
1942 com_assign_trailer(c,
1943 CHILD(n, i), assigning);
1944 return;
1945 }
1946 n = CHILD(n, 0);
1947 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001948
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001949 case atom:
1950 switch (TYPE(CHILD(n, 0))) {
1951 case LPAR:
1952 n = CHILD(n, 1);
1953 if (TYPE(n) == RPAR) {
1954 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001955 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001956 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001957 return;
1958 }
1959 break;
1960 case LSQB:
1961 n = CHILD(n, 1);
1962 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001963 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001964 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001965 return;
1966 }
1967 com_assign_list(c, n, assigning);
1968 return;
1969 case NAME:
1970 com_assign_name(c, CHILD(n, 0), assigning);
1971 return;
1972 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001973 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001974 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001975 return;
1976 }
1977 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001978
1979 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001980 com_error(c, PyExc_SyntaxError,
1981 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001982 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001983
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001984 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001985 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001986 com_error(c, PyExc_SystemError,
1987 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001988 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001989
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001990 }
1991 }
1992}
Guido van Rossum7c531111997-03-11 18:42:21 +00001993
Guido van Rossum79f25d91997-04-29 20:08:16 +00001994/* Forward */ static node *get_rawdocstring Py_PROTO((node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001995
1996static void
1997com_expr_stmt(c, n)
1998 struct compiling *c;
1999 node *n;
2000{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002001 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002002 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002003 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002004 return;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002005 com_node(c, CHILD(n, NCH(n)-1));
2006 if (NCH(n) == 1) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002007 if (c->c_interactive)
2008 com_addbyte(c, PRINT_EXPR);
2009 else
2010 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002011 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002012 }
2013 else {
2014 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002015 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002016 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002017 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002018 com_push(c, 1);
2019 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002020 com_assign(c, CHILD(n, i), OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002021 }
2022 }
2023}
2024
2025static void
Guido van Rossum228d7f31997-04-02 05:24:36 +00002026com_assert_stmt(c, n)
2027 struct compiling *c;
2028 node *n;
2029{
2030 int a = 0, b = 0;
2031 int i;
2032 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2033 /* Generate code like for
2034
2035 if __debug__:
2036 if not <test>:
2037 raise AssertionError [, <message>]
2038
2039 where <message> is the second test, if present.
2040 */
2041 if (Py_OptimizeFlag)
2042 return;
2043 com_addopnamestr(c, LOAD_GLOBAL, "__debug__");
2044 com_push(c, 1);
2045 com_addfwref(c, JUMP_IF_FALSE, &a);
2046 com_addbyte(c, POP_TOP);
2047 com_pop(c, 1);
2048 com_node(c, CHILD(n, 1));
2049 com_addfwref(c, JUMP_IF_TRUE, &b);
2050 com_addbyte(c, POP_TOP);
2051 com_pop(c, 1);
2052 /* Raise that exception! */
2053 com_addopnamestr(c, LOAD_GLOBAL, "AssertionError");
2054 com_push(c, 1);
2055 i = NCH(n)/2; /* Either 2 or 4 */
2056 if (i > 1)
2057 com_node(c, CHILD(n, 3));
2058 com_addoparg(c, RAISE_VARARGS, i);
2059 com_pop(c, i);
2060 /* The interpreter does not fall through */
2061 /* All jumps converge here */
2062 com_backpatch(c, a);
2063 com_backpatch(c, b);
2064 com_addbyte(c, POP_TOP);
2065}
2066
2067static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002068com_print_stmt(c, n)
2069 struct compiling *c;
2070 node *n;
2071{
2072 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002073 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
2074 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002075 com_node(c, CHILD(n, i));
2076 com_addbyte(c, PRINT_ITEM);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002077 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002078 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002079 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002080 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002081 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002082}
2083
2084static void
2085com_return_stmt(c, n)
2086 struct compiling *c;
2087 node *n;
2088{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002089 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002090 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002091 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002092 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002093 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002094 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002095 com_push(c, 1);
2096 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002097 else
2098 com_node(c, CHILD(n, 1));
2099 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002100 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002101}
2102
2103static void
2104com_raise_stmt(c, n)
2105 struct compiling *c;
2106 node *n;
2107{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002108 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002109 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2110 if (NCH(n) > 1) {
2111 com_node(c, CHILD(n, 1));
2112 if (NCH(n) > 3) {
2113 com_node(c, CHILD(n, 3));
2114 if (NCH(n) > 5)
2115 com_node(c, CHILD(n, 5));
2116 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002117 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002118 i = NCH(n)/2;
2119 com_addoparg(c, RAISE_VARARGS, i);
2120 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002121}
2122
2123static void
2124com_import_stmt(c, n)
2125 struct compiling *c;
2126 node *n;
2127{
2128 int i;
2129 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002130 /* 'import' dotted_name (',' dotted_name)* |
2131 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002132 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002133 /* 'from' dotted_name 'import' ... */
2134 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002135 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002136 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002137 for (i = 3; i < NCH(n); i += 2)
2138 com_addopname(c, IMPORT_FROM, CHILD(n, i));
2139 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002140 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002141 }
2142 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002143 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002144 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002145 REQ(CHILD(n, i), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002146 com_addopname(c, IMPORT_NAME, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002147 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002148 com_addopname(c, STORE_NAME, CHILD(CHILD(n, i), 0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002149 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002150 }
2151 }
2152}
2153
2154static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00002155com_global_stmt(c, n)
2156 struct compiling *c;
2157 node *n;
2158{
2159 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002160 REQ(n, global_stmt);
2161 /* 'global' NAME (',' NAME)* */
2162 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002163 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002164#ifdef PRIVATE_NAME_MANGLING
2165 char buffer[256];
2166 if (s != NULL && s[0] == '_' && s[1] == '_' &&
2167 c->c_private != NULL &&
2168 com_mangle(c, s, buffer, (int)sizeof(buffer)))
2169 s = buffer;
2170#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +00002171 if (PyDict_GetItemString(c->c_locals, s) != NULL) {
2172 com_error(c, PyExc_SyntaxError,
2173 "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002174 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002175 else if (PyDict_SetItemString(c->c_globals, s, Py_None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002176 c->c_errors++;
2177 }
2178}
2179
Guido van Rossum681d79a1995-07-18 14:51:37 +00002180static int
2181com_newlocal_o(c, nameval)
2182 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002183 PyObject *nameval;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002184{
2185 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002186 PyObject *ival;
2187 if (PyList_Size(c->c_varnames) != c->c_nlocals) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002188 /* This is usually caused by an error on a previous call */
2189 if (c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002190 com_error(c, PyExc_SystemError,
2191 "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002192 }
2193 return 0;
2194 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002195 ival = PyInt_FromLong(i = c->c_nlocals++);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002196 if (ival == NULL)
2197 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002198 else if (PyDict_SetItem(c->c_locals, nameval, ival) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002199 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002200 else if (PyList_Append(c->c_varnames, nameval) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002201 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002202 Py_XDECREF(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002203 return i;
2204}
2205
2206static int
2207com_addlocal_o(c, nameval)
2208 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002209 PyObject *nameval;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002210{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002211 PyObject *ival = PyDict_GetItem(c->c_locals, nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002212 if (ival != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002213 return PyInt_AsLong(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002214 return com_newlocal_o(c, nameval);
2215}
2216
2217static int
2218com_newlocal(c, name)
2219 struct compiling *c;
2220 char *name;
2221{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002222 PyObject *nameval = PyString_InternFromString(name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002223 int i;
2224 if (nameval == NULL) {
2225 c->c_errors++;
2226 return 0;
2227 }
2228 i = com_newlocal_o(c, nameval);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002229 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002230 return i;
2231}
2232
Guido van Rossumc5e96291991-12-10 13:53:51 +00002233static void
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002234com_exec_stmt(c, n)
2235 struct compiling *c;
2236 node *n;
2237{
2238 REQ(n, exec_stmt);
2239 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2240 com_node(c, CHILD(n, 1));
2241 if (NCH(n) >= 4)
2242 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002243 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002244 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002245 com_push(c, 1);
2246 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002247 if (NCH(n) >= 6)
2248 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002249 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002250 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002251 com_push(c, 1);
2252 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002253 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002254 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002255}
2256
Guido van Rossum7c531111997-03-11 18:42:21 +00002257static int
2258is_constant_false(c, n)
2259 struct compiling *c;
2260 node *n;
2261{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002262 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002263 int i;
2264
2265 /* Label to avoid tail recursion */
2266 next:
2267 switch (TYPE(n)) {
2268
2269 case suite:
2270 if (NCH(n) == 1) {
2271 n = CHILD(n, 0);
2272 goto next;
2273 }
2274 /* Fall through */
2275 case file_input:
2276 for (i = 0; i < NCH(n); i++) {
2277 node *ch = CHILD(n, i);
2278 if (TYPE(ch) == stmt) {
2279 n = ch;
2280 goto next;
2281 }
2282 }
2283 break;
2284
2285 case stmt:
2286 case simple_stmt:
2287 case small_stmt:
2288 n = CHILD(n, 0);
2289 goto next;
2290
2291 case expr_stmt:
2292 case testlist:
2293 case test:
2294 case and_test:
2295 case not_test:
2296 case comparison:
2297 case expr:
2298 case xor_expr:
2299 case and_expr:
2300 case shift_expr:
2301 case arith_expr:
2302 case term:
2303 case factor:
2304 case power:
2305 case atom:
2306 if (NCH(n) == 1) {
2307 n = CHILD(n, 0);
2308 goto next;
2309 }
2310 break;
2311
2312 case NAME:
2313 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2314 return 1;
2315 break;
2316
2317 case NUMBER:
2318 v = parsenumber(c, STR(n));
2319 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002320 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002321 break;
2322 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002323 i = PyObject_IsTrue(v);
2324 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002325 return i == 0;
2326
2327 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002328 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002329 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002330 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002331 break;
2332 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002333 i = PyObject_IsTrue(v);
2334 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002335 return i == 0;
2336
2337 }
2338 return 0;
2339}
2340
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002341static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002342com_if_stmt(c, n)
2343 struct compiling *c;
2344 node *n;
2345{
2346 int i;
2347 int anchor = 0;
2348 REQ(n, if_stmt);
2349 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2350 for (i = 0; i+3 < NCH(n); i+=4) {
2351 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002352 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002353 if (is_constant_false(c, ch))
2354 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002355 if (i > 0)
2356 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002357 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002358 com_addfwref(c, JUMP_IF_FALSE, &a);
2359 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002360 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002361 com_node(c, CHILD(n, i+3));
2362 com_addfwref(c, JUMP_FORWARD, &anchor);
2363 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002364 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002365 com_addbyte(c, POP_TOP);
2366 }
2367 if (i+2 < NCH(n))
2368 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002369 if (anchor)
2370 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002371}
2372
2373static void
2374com_while_stmt(c, n)
2375 struct compiling *c;
2376 node *n;
2377{
2378 int break_anchor = 0;
2379 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002380 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002381 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2382 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002383 block_push(c, SETUP_LOOP);
2384 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002385 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002386 com_node(c, CHILD(n, 1));
2387 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2388 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002389 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002390 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002391 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002392 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002393 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2394 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002395 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002396 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002397 com_addbyte(c, POP_TOP);
2398 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002399 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002400 if (NCH(n) > 4)
2401 com_node(c, CHILD(n, 6));
2402 com_backpatch(c, break_anchor);
2403}
2404
2405static void
2406com_for_stmt(c, n)
2407 struct compiling *c;
2408 node *n;
2409{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002410 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002411 int break_anchor = 0;
2412 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002413 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002414 REQ(n, for_stmt);
2415 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2416 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002417 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002418 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002419 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002420 if (v == NULL)
2421 c->c_errors++;
2422 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002423 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002424 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002425 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002426 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002427 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002428 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002429 com_assign(c, CHILD(n, 1), OP_ASSIGN);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002430 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002431 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002432 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002433 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2434 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002435 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002436 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002437 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002438 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002439 if (NCH(n) > 8)
2440 com_node(c, CHILD(n, 8));
2441 com_backpatch(c, break_anchor);
2442}
2443
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002444/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002445
2446 SETUP_FINALLY L
2447 <code for S>
2448 POP_BLOCK
2449 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002450 L: <code for Sf>
2451 END_FINALLY
2452
2453 The special instructions use the block stack. Each block
2454 stack entry contains the instruction that created it (here
2455 SETUP_FINALLY), the level of the value stack at the time the
2456 block stack entry was created, and a label (here L).
2457
2458 SETUP_FINALLY:
2459 Pushes the current value stack level and the label
2460 onto the block stack.
2461 POP_BLOCK:
2462 Pops en entry from the block stack, and pops the value
2463 stack until its level is the same as indicated on the
2464 block stack. (The label is ignored.)
2465 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002466 Pops a variable number of entries from the *value* stack
2467 and re-raises the exception they specify. The number of
2468 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002469
2470 The block stack is unwound when an exception is raised:
2471 when a SETUP_FINALLY entry is found, the exception is pushed
2472 onto the value stack (and the exception condition is cleared),
2473 and the interpreter jumps to the label gotten from the block
2474 stack.
2475
2476 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002477 (The contents of the value stack is shown in [], with the top
2478 at the right; 'tb' is trace-back info, 'val' the exception's
2479 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002480
2481 Value stack Label Instruction Argument
2482 [] SETUP_EXCEPT L1
2483 [] <code for S>
2484 [] POP_BLOCK
2485 [] JUMP_FORWARD L0
2486
Guido van Rossum3f5da241990-12-20 15:06:42 +00002487 [tb, val, exc] L1: DUP )
2488 [tb, val, exc, exc] <evaluate E1> )
2489 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2490 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2491 [tb, val, exc, 1] POP )
2492 [tb, val, exc] POP
2493 [tb, val] <assign to V1> (or POP if no V1)
2494 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002495 [] <code for S1>
2496 JUMP_FORWARD L0
2497
Guido van Rossum3f5da241990-12-20 15:06:42 +00002498 [tb, val, exc, 0] L2: POP
2499 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002500 .............................etc.......................
2501
Guido van Rossum3f5da241990-12-20 15:06:42 +00002502 [tb, val, exc, 0] Ln+1: POP
2503 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002504
2505 [] L0: <next statement>
2506
2507 Of course, parts are not generated if Vi or Ei is not present.
2508*/
2509
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002510static void
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002511com_try_except(c, n)
2512 struct compiling *c;
2513 node *n;
2514{
2515 int except_anchor = 0;
2516 int end_anchor = 0;
2517 int else_anchor = 0;
2518 int i;
2519 node *ch;
2520
2521 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2522 block_push(c, SETUP_EXCEPT);
2523 com_node(c, CHILD(n, 2));
2524 com_addbyte(c, POP_BLOCK);
2525 block_pop(c, SETUP_EXCEPT);
2526 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2527 com_backpatch(c, except_anchor);
2528 for (i = 3;
2529 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2530 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002531 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002532 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002533 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002534 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002535 break;
2536 }
2537 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002538 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002539 com_addoparg(c, SET_LINENO, ch->n_lineno);
2540 if (NCH(ch) > 1) {
2541 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002542 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002543 com_node(c, CHILD(ch, 1));
2544 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002545 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002546 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2547 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002548 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002549 }
2550 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002551 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002552 if (NCH(ch) > 3)
Guido van Rossum8861b741996-07-30 16:49:37 +00002553 com_assign(c, CHILD(ch, 3), OP_ASSIGN);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002554 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002555 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002556 com_pop(c, 1);
2557 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002558 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002559 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002560 com_node(c, CHILD(n, i+2));
2561 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2562 if (except_anchor) {
2563 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002564 /* We come in with [tb, val, exc, 0] on the
2565 stack; one pop and it's the same as
2566 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002567 com_addbyte(c, POP_TOP);
2568 }
2569 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002570 /* We actually come in here with [tb, val, exc] but the
2571 END_FINALLY will zap those and jump around.
2572 The c_stacklevel does not reflect them so we need not pop
2573 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002574 com_addbyte(c, END_FINALLY);
2575 com_backpatch(c, else_anchor);
2576 if (i < NCH(n))
2577 com_node(c, CHILD(n, i+2));
2578 com_backpatch(c, end_anchor);
2579}
2580
2581static void
2582com_try_finally(c, n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002583 struct compiling *c;
2584 node *n;
2585{
2586 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002587 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002588
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002589 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2590 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002591 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002592 com_addbyte(c, POP_BLOCK);
2593 block_pop(c, SETUP_FINALLY);
2594 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002595 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002596 /* While the generated code pushes only one item,
2597 the try-finally handling can enter here with
2598 up to three items. OK, here are the details:
2599 3 for an exception, 2 for RETURN, 1 for BREAK. */
2600 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002601 com_backpatch(c, finally_anchor);
2602 ch = CHILD(n, NCH(n)-1);
2603 com_addoparg(c, SET_LINENO, ch->n_lineno);
2604 com_node(c, ch);
2605 com_addbyte(c, END_FINALLY);
2606 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002607 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002608}
2609
2610static void
2611com_try_stmt(c, n)
2612 struct compiling *c;
2613 node *n;
2614{
2615 REQ(n, try_stmt);
2616 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2617 | 'try' ':' suite 'finally' ':' suite */
2618 if (TYPE(CHILD(n, 3)) != except_clause)
2619 com_try_finally(c, n);
2620 else
2621 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002622}
2623
Guido van Rossum8b993a91997-01-17 21:04:03 +00002624static node *
2625get_rawdocstring(n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002626 node *n;
2627{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002628 int i;
2629
Guido van Rossum8b993a91997-01-17 21:04:03 +00002630 /* Label to avoid tail recursion */
2631 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002632 switch (TYPE(n)) {
2633
2634 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002635 if (NCH(n) == 1) {
2636 n = CHILD(n, 0);
2637 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002638 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002639 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002640 case file_input:
2641 for (i = 0; i < NCH(n); i++) {
2642 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002643 if (TYPE(ch) == stmt) {
2644 n = ch;
2645 goto next;
2646 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002647 }
2648 break;
2649
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002650 case stmt:
2651 case simple_stmt:
2652 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002653 n = CHILD(n, 0);
2654 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002655
2656 case expr_stmt:
2657 case testlist:
2658 case test:
2659 case and_test:
2660 case not_test:
2661 case comparison:
2662 case expr:
2663 case xor_expr:
2664 case and_expr:
2665 case shift_expr:
2666 case arith_expr:
2667 case term:
2668 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002669 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002670 if (NCH(n) == 1) {
2671 n = CHILD(n, 0);
2672 goto next;
2673 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002674 break;
2675
2676 case atom:
2677 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002678 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002679 break;
2680
2681 }
2682 return NULL;
2683}
2684
Guido van Rossum79f25d91997-04-29 20:08:16 +00002685static PyObject *
Guido van Rossum8b993a91997-01-17 21:04:03 +00002686get_docstring(n)
2687 node *n;
2688{
Guido van Rossum541563e1999-01-28 15:08:09 +00002689 /* Don't generate doc-strings if run with -OO */
2690 if (Py_OptimizeFlag > 1)
2691 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002692 n = get_rawdocstring(n);
2693 if (n == NULL)
2694 return NULL;
2695 return parsestrplus(n);
2696}
2697
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002698static void
2699com_suite(c, n)
2700 struct compiling *c;
2701 node *n;
2702{
2703 REQ(n, suite);
2704 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2705 if (NCH(n) == 1) {
2706 com_node(c, CHILD(n, 0));
2707 }
2708 else {
2709 int i;
2710 for (i = 0; i < NCH(n); i++) {
2711 node *ch = CHILD(n, i);
2712 if (TYPE(ch) == stmt)
2713 com_node(c, ch);
2714 }
2715 }
2716}
2717
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002718/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002719static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002720com_continue_stmt(c, n)
2721 struct compiling *c;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002722 node *n; /* Not used, but passed for consistency */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002723{
2724 int i = c->c_nblocks;
2725 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2726 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2727 }
2728 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002729 com_error(c, PyExc_SyntaxError,
2730 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002731 }
2732 /* XXX Could allow it inside a 'finally' clause
2733 XXX if we could pop the exception still on the stack */
2734}
2735
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002736static int
Guido van Rossum681d79a1995-07-18 14:51:37 +00002737com_argdefs(c, n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002738 struct compiling *c;
2739 node *n;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002740{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002741 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002742 if (TYPE(n) == lambdef) {
2743 /* lambdef: 'lambda' [varargslist] ':' test */
2744 n = CHILD(n, 1);
2745 }
2746 else {
2747 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2748 n = CHILD(n, 2);
2749 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2750 n = CHILD(n, 1);
2751 }
2752 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002753 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002754 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002755 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002756 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2757 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002758 nargs = 0;
2759 ndefs = 0;
2760 for (i = 0; i < nch; i++) {
2761 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002762 if (TYPE(CHILD(n, i)) == STAR ||
2763 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002764 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002765 nargs++;
2766 i++;
2767 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002768 t = RPAR; /* Anything except EQUAL or COMMA */
2769 else
2770 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002771 if (t == EQUAL) {
2772 i++;
2773 ndefs++;
2774 com_node(c, CHILD(n, i));
2775 i++;
2776 if (i >= nch)
2777 break;
2778 t = TYPE(CHILD(n, i));
2779 }
2780 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00002781 /* Treat "(a=1, b)" as an error */
2782 if (ndefs)
2783 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00002784 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002785 }
2786 if (t != COMMA)
2787 break;
2788 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002789 return ndefs;
2790}
2791
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002792static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002793com_funcdef(c, n)
2794 struct compiling *c;
2795 node *n;
2796{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002797 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002798 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002799 v = (PyObject *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002800 if (v == NULL)
2801 c->c_errors++;
2802 else {
2803 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002804 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002805 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002806 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002807 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002808 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002809 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002810 com_pop(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002811 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002812 }
2813}
2814
2815static void
Guido van Rossum25831651993-05-19 14:50:45 +00002816com_bases(c, n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002817 struct compiling *c;
2818 node *n;
2819{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002820 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002821 REQ(n, testlist);
2822 /* testlist: test (',' test)* [','] */
2823 for (i = 0; i < NCH(n); i += 2)
2824 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002825 i = (NCH(n)+1) / 2;
2826 com_addoparg(c, BUILD_TUPLE, i);
2827 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00002828}
2829
2830static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002831com_classdef(c, n)
2832 struct compiling *c;
2833 node *n;
2834{
Guido van Rossum25831651993-05-19 14:50:45 +00002835 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002836 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002837 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002838 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00002839 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00002840 c->c_errors++;
2841 return;
2842 }
2843 /* Push the class name on the stack */
2844 i = com_addconst(c, v);
2845 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002846 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002847 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00002848 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002849 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00002850 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002851 com_push(c, 1);
2852 }
Guido van Rossum25831651993-05-19 14:50:45 +00002853 else
2854 com_bases(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002855 v = (PyObject *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002856 if (v == NULL)
2857 c->c_errors++;
2858 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002859 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002860 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002861 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002862 com_addoparg(c, MAKE_FUNCTION, 0);
2863 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002864 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002865 com_pop(c, 2);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002866 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002867 Py_DECREF(v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002868 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002869}
2870
2871static void
2872com_node(c, n)
2873 struct compiling *c;
2874 node *n;
2875{
2876 switch (TYPE(n)) {
2877
2878 /* Definition nodes */
2879
2880 case funcdef:
2881 com_funcdef(c, n);
2882 break;
2883 case classdef:
2884 com_classdef(c, n);
2885 break;
2886
2887 /* Trivial parse tree nodes */
2888
2889 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002890 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002891 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002892 com_node(c, CHILD(n, 0));
2893 break;
2894
2895 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002896 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2897 com_addoparg(c, SET_LINENO, n->n_lineno);
2898 {
2899 int i;
2900 for (i = 0; i < NCH(n)-1; i += 2)
2901 com_node(c, CHILD(n, i));
2902 }
2903 break;
2904
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002905 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002906 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002907 com_node(c, CHILD(n, 0));
2908 break;
2909
2910 /* Statement nodes */
2911
2912 case expr_stmt:
2913 com_expr_stmt(c, n);
2914 break;
2915 case print_stmt:
2916 com_print_stmt(c, n);
2917 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002918 case del_stmt: /* 'del' exprlist */
Guido van Rossum8861b741996-07-30 16:49:37 +00002919 com_assign(c, CHILD(n, 1), OP_DELETE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002920 break;
2921 case pass_stmt:
2922 break;
2923 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002924 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002925 com_error(c, PyExc_SyntaxError,
2926 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002927 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002928 com_addbyte(c, BREAK_LOOP);
2929 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002930 case continue_stmt:
2931 com_continue_stmt(c, n);
2932 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002933 case return_stmt:
2934 com_return_stmt(c, n);
2935 break;
2936 case raise_stmt:
2937 com_raise_stmt(c, n);
2938 break;
2939 case import_stmt:
2940 com_import_stmt(c, n);
2941 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002942 case global_stmt:
2943 com_global_stmt(c, n);
2944 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002945 case exec_stmt:
2946 com_exec_stmt(c, n);
2947 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002948 case assert_stmt:
2949 com_assert_stmt(c, n);
2950 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002951 case if_stmt:
2952 com_if_stmt(c, n);
2953 break;
2954 case while_stmt:
2955 com_while_stmt(c, n);
2956 break;
2957 case for_stmt:
2958 com_for_stmt(c, n);
2959 break;
2960 case try_stmt:
2961 com_try_stmt(c, n);
2962 break;
2963 case suite:
2964 com_suite(c, n);
2965 break;
2966
2967 /* Expression nodes */
2968
2969 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002970 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002971 break;
2972 case test:
2973 com_test(c, n);
2974 break;
2975 case and_test:
2976 com_and_test(c, n);
2977 break;
2978 case not_test:
2979 com_not_test(c, n);
2980 break;
2981 case comparison:
2982 com_comparison(c, n);
2983 break;
2984 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002985 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002986 break;
2987 case expr:
2988 com_expr(c, n);
2989 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002990 case xor_expr:
2991 com_xor_expr(c, n);
2992 break;
2993 case and_expr:
2994 com_and_expr(c, n);
2995 break;
2996 case shift_expr:
2997 com_shift_expr(c, n);
2998 break;
2999 case arith_expr:
3000 com_arith_expr(c, n);
3001 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003002 case term:
3003 com_term(c, n);
3004 break;
3005 case factor:
3006 com_factor(c, n);
3007 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003008 case power:
3009 com_power(c, n);
3010 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003011 case atom:
3012 com_atom(c, n);
3013 break;
3014
3015 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003016 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003017 com_error(c, PyExc_SystemError,
3018 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003019 }
3020}
3021
Guido van Rossum79f25d91997-04-29 20:08:16 +00003022static void com_fplist Py_PROTO((struct compiling *, node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003023
3024static void
3025com_fpdef(c, n)
3026 struct compiling *c;
3027 node *n;
3028{
3029 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3030 if (TYPE(CHILD(n, 0)) == LPAR)
3031 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003032 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003033 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003034 com_pop(c, 1);
3035 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003036}
3037
3038static void
3039com_fplist(c, n)
3040 struct compiling *c;
3041 node *n;
3042{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003043 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003044 if (NCH(n) == 1) {
3045 com_fpdef(c, CHILD(n, 0));
3046 }
3047 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003048 int i = (NCH(n)+1)/2;
3049 com_addoparg(c, UNPACK_TUPLE, i);
3050 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003051 for (i = 0; i < NCH(n); i += 2)
3052 com_fpdef(c, CHILD(n, i));
3053 }
3054}
3055
3056static void
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003057com_arglist(c, n)
3058 struct compiling *c;
3059 node *n;
3060{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003061 int nch, i;
3062 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003063 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003064 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003065 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003066 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003067 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003068 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003069 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003070 node *ch = CHILD(n, i);
3071 node *fp;
3072 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00003073 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003074 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003075 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3076 fp = CHILD(ch, 0);
3077 if (TYPE(fp) == NAME)
3078 name = STR(fp);
3079 else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003080 name = nbuf;
3081 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003082 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003083 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003084 com_newlocal(c, name);
3085 c->c_argcount++;
3086 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003087 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003088 ch = CHILD(n, i);
3089 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003090 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003091 else
3092 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003093 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003094 /* Handle *arguments */
3095 if (i < nch) {
3096 node *ch;
3097 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003098 if (TYPE(ch) != DOUBLESTAR) {
3099 REQ(ch, STAR);
3100 ch = CHILD(n, i+1);
3101 if (TYPE(ch) == NAME) {
3102 c->c_flags |= CO_VARARGS;
3103 i += 3;
3104 com_newlocal(c, STR(ch));
3105 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003106 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003107 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003108 /* Handle **keywords */
3109 if (i < nch) {
3110 node *ch;
3111 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003112 if (TYPE(ch) != DOUBLESTAR) {
3113 REQ(ch, STAR);
3114 ch = CHILD(n, i+1);
3115 REQ(ch, STAR);
3116 ch = CHILD(n, i+2);
3117 }
3118 else
3119 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003120 REQ(ch, NAME);
3121 c->c_flags |= CO_VARKEYWORDS;
3122 com_newlocal(c, STR(ch));
3123 }
3124 if (complex) {
3125 /* Generate code for complex arguments only after
3126 having counted the simple arguments */
3127 int ilocal = 0;
3128 for (i = 0; i < nch; i++) {
3129 node *ch = CHILD(n, i);
3130 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003131 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003132 break;
3133 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3134 fp = CHILD(ch, 0);
3135 if (TYPE(fp) != NAME) {
3136 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003137 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003138 com_fpdef(c, ch);
3139 }
3140 ilocal++;
3141 if (++i >= nch)
3142 break;
3143 ch = CHILD(n, i);
3144 if (TYPE(ch) == EQUAL)
3145 i += 2;
3146 else
3147 REQ(ch, COMMA);
3148 }
3149 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003150}
3151
3152static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003153com_file_input(c, n)
3154 struct compiling *c;
3155 node *n;
3156{
3157 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003158 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003159 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003160 doc = get_docstring(n);
3161 if (doc != NULL) {
3162 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003163 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003164 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003165 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003166 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003167 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003168 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003169 for (i = 0; i < NCH(n); i++) {
3170 node *ch = CHILD(n, i);
3171 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3172 com_node(c, ch);
3173 }
3174}
3175
3176/* Top-level compile-node interface */
3177
3178static void
3179compile_funcdef(c, n)
3180 struct compiling *c;
3181 node *n;
3182{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003183 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003184 node *ch;
3185 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003186 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003187 doc = get_docstring(CHILD(n, 4));
3188 if (doc != NULL) {
3189 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003190 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003191 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003192 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003193 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003194 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3195 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003196 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003197 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003198 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003199 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003200 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003201 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003202 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003203 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003204 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003205}
3206
3207static void
Guido van Rossum590baa41993-11-30 13:40:46 +00003208compile_lambdef(c, n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003209 struct compiling *c;
3210 node *n;
3211{
Guido van Rossum590baa41993-11-30 13:40:46 +00003212 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003213 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003214 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003215
3216 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003217 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003218 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003219 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003220 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003221 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003222 else
3223 ch = CHILD(n, 2);
3224 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003225 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003226 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003227}
3228
3229static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003230compile_classdef(c, n)
3231 struct compiling *c;
3232 node *n;
3233{
3234 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003235 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003236 REQ(n, classdef);
3237 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3238 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003239#ifdef PRIVATE_NAME_MANGLING
3240 c->c_private = c->c_name;
3241#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003242 ch = CHILD(n, NCH(n)-1); /* The suite */
3243 doc = get_docstring(ch);
3244 if (doc != NULL) {
3245 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003246 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003247 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003248 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003249 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003250 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003251 }
3252 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003253 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003254 com_node(c, ch);
3255 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003256 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003257 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003258 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003259}
3260
3261static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003262compile_node(c, n)
3263 struct compiling *c;
3264 node *n;
3265{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003266 com_addoparg(c, SET_LINENO, n->n_lineno);
3267
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003268 switch (TYPE(n)) {
3269
Guido van Rossum4c417781991-01-21 16:09:22 +00003270 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003271 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003272 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003273 n = CHILD(n, 0);
3274 if (TYPE(n) != NEWLINE)
3275 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003276 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003277 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003278 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003279 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003280 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003281 break;
3282
Guido van Rossum4c417781991-01-21 16:09:22 +00003283 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003284 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003285 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003286 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003287 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003288 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003289 break;
3290
Guido van Rossum590baa41993-11-30 13:40:46 +00003291 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003292 com_node(c, CHILD(n, 0));
3293 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003294 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003295 break;
3296
Guido van Rossum590baa41993-11-30 13:40:46 +00003297 case lambdef: /* anonymous function definition */
3298 compile_lambdef(c, n);
3299 break;
3300
Guido van Rossum4c417781991-01-21 16:09:22 +00003301 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003302 compile_funcdef(c, n);
3303 break;
3304
Guido van Rossum4c417781991-01-21 16:09:22 +00003305 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003306 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003307 break;
3308
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003309 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003310 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003311 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003312 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003313 }
3314}
3315
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003316/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00003317
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003318 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
3319 instructions that refer to local variables with LOAD_FAST etc.
3320 The latter instructions are much faster because they don't need to
3321 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003322
Guido van Rossum681d79a1995-07-18 14:51:37 +00003323 To find all local variables, we check all STORE_NAME, IMPORT_FROM
3324 and DELETE_NAME instructions. This yields all local variables,
3325 function definitions, class definitions and import statements.
3326 Argument names have already been entered into the list by the
3327 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003328
3329 All remaining LOAD_NAME instructions must refer to non-local (global
3330 or builtin) variables, so are replaced by LOAD_GLOBAL.
3331
3332 There are two problems: 'from foo import *' and 'exec' may introduce
3333 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00003334 case, we can still optimize bona fide locals (since those
3335 statements will be surrounded by fast_2_locals() and
3336 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003337
Guido van Rossum681d79a1995-07-18 14:51:37 +00003338 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00003339
3340static void
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003341optimize(c)
3342 struct compiling *c;
Guido van Rossum282914b1991-04-04 10:42:56 +00003343{
Guido van Rossum0a697f61991-04-16 08:39:12 +00003344 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00003345 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00003346 int oparg = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003347 PyObject *name;
3348 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003349
Guido van Rossum282914b1991-04-04 10:42:56 +00003350#define NEXTOP() (*next_instr++)
3351#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossum79f25d91997-04-29 20:08:16 +00003352#define GETITEM(v, i) (PyList_GetItem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003353#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
3354
Guido van Rossum79f25d91997-04-29 20:08:16 +00003355 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003356
3357 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00003358
Guido van Rossum79f25d91997-04-29 20:08:16 +00003359 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003360 for (;;) {
3361 opcode = NEXTOP();
3362 if (opcode == STOP_CODE)
3363 break;
3364 if (HAS_ARG(opcode))
3365 oparg = NEXTARG();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003366 switch (opcode) {
3367 case STORE_NAME:
3368 case DELETE_NAME:
3369 case IMPORT_FROM:
3370 com_addlocal_o(c, GETNAMEOBJ(oparg));
3371 break;
3372 case EXEC_STMT:
3373 c->c_flags &= ~CO_OPTIMIZED;
3374 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00003375 }
3376 }
3377
Guido van Rossum79f25d91997-04-29 20:08:16 +00003378 if (PyDict_GetItemString(c->c_locals, "*") != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003379 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003380
Guido van Rossum79f25d91997-04-29 20:08:16 +00003381 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003382 for (;;) {
3383 cur_instr = next_instr;
3384 opcode = NEXTOP();
3385 if (opcode == STOP_CODE)
3386 break;
3387 if (HAS_ARG(opcode))
3388 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003389 if (opcode == LOAD_NAME ||
3390 opcode == STORE_NAME ||
3391 opcode == DELETE_NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003392 PyObject *v;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003393 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00003394 name = GETNAMEOBJ(oparg);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003395 v = PyDict_GetItem(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003396 if (v == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003397 if (opcode == LOAD_NAME &&
3398 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003399 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003400 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00003401 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003402 i = PyInt_AsLong(v);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003403 switch (opcode) {
3404 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
3405 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
3406 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
3407 }
3408 cur_instr[1] = i & 0xff;
3409 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00003410 }
3411 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003412
Guido van Rossum681d79a1995-07-18 14:51:37 +00003413 if (c->c_errors == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00003414 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00003415}
3416
Guido van Rossum79f25d91997-04-29 20:08:16 +00003417PyCodeObject *
3418PyNode_Compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003419 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003420 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003421{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003422 return jcompile(n, filename, NULL);
3423}
3424
Guido van Rossum79f25d91997-04-29 20:08:16 +00003425static PyCodeObject *
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003426icompile(n, base)
3427 node *n;
3428 struct compiling *base;
3429{
3430 return jcompile(n, base->c_filename, base);
3431}
3432
Guido van Rossum79f25d91997-04-29 20:08:16 +00003433static PyCodeObject *
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003434jcompile(n, filename, base)
3435 node *n;
3436 char *filename;
3437 struct compiling *base;
3438{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003439 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003440 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003441 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003442 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003443#ifdef PRIVATE_NAME_MANGLING
3444 if (base)
3445 sc.c_private = base->c_private;
3446 else
3447 sc.c_private = NULL;
3448#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003449 compile_node(&sc, n);
3450 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003451 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003452 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003453 sc.c_flags |= CO_NEWLOCALS;
3454 }
3455 else if (TYPE(n) == classdef)
3456 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00003457 co = NULL;
3458 if (sc.c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003459 PyObject *consts, *names, *varnames, *filename, *name;
3460 consts = PyList_AsTuple(sc.c_consts);
3461 names = PyList_AsTuple(sc.c_names);
3462 varnames = PyList_AsTuple(sc.c_varnames);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003463 filename = PyString_InternFromString(sc.c_filename);
3464 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003465 if (!PyErr_Occurred())
3466 co = PyCode_New(sc.c_argcount,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003467 sc.c_nlocals,
Guido van Rossum8b993a91997-01-17 21:04:03 +00003468 sc.c_maxstacklevel,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003469 sc.c_flags,
3470 sc.c_code,
3471 consts,
3472 names,
3473 varnames,
3474 filename,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003475 name,
3476 sc.c_firstlineno,
3477 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003478 Py_XDECREF(consts);
3479 Py_XDECREF(names);
3480 Py_XDECREF(varnames);
3481 Py_XDECREF(filename);
3482 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003483 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003484 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003485 return co;
3486}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003487
3488int
3489PyCode_Addr2Line(co, addrq)
3490 PyCodeObject *co;
3491 int addrq;
3492{
3493 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003494 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003495 int line = co->co_firstlineno;
3496 int addr = 0;
3497 while (--size >= 0) {
3498 addr += *p++;
3499 if (addr > addrq)
3500 break;
3501 line += *p++;
3502 }
3503 return line;
3504}