blob: 72848fae363935e4fe3a53521cc674f37cd34181 [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;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001188 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001189 na = 0;
1190 nk = 0;
1191 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001192 node *ch = CHILD(n, i);
1193 if (ch->n_lineno != lineno) {
1194 lineno = ch->n_lineno;
1195 com_addoparg(c, SET_LINENO, lineno);
1196 }
1197 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001198 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001199 na++;
1200 else
1201 nk++;
1202 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001203 Py_XDECREF(keywords);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001204 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001205 com_error(c, PyExc_SyntaxError,
1206 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001207 }
1208 com_addoparg(c, CALL_FUNCTION, na | (nk << 8));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001209 com_pop(c, na + 2*nk);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001210 }
1211}
1212
1213static void
1214com_select_member(c, n)
1215 struct compiling *c;
1216 node *n;
1217{
1218 com_addopname(c, LOAD_ATTR, n);
1219}
1220
1221static void
Guido van Rossum8861b741996-07-30 16:49:37 +00001222com_sliceobj(c, n)
1223 struct compiling *c;
1224 node *n;
1225{
1226 int i=0;
1227 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001228 node *ch;
1229
1230 /* first argument */
1231 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001232 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001233 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001234 i++;
1235 }
1236 else {
1237 com_node(c, CHILD(n,i));
1238 i++;
1239 REQ(CHILD(n,i),COLON);
1240 i++;
1241 }
1242 /* second argument */
1243 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1244 com_node(c, CHILD(n,i));
1245 i++;
1246 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001247 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001248 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001249 com_push(c, 1);
1250 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001251 /* remaining arguments */
1252 for (; i < NCH(n); i++) {
1253 ns++;
1254 ch=CHILD(n,i);
1255 REQ(ch, sliceop);
1256 if (NCH(ch) == 1) {
1257 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001258 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001259 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001260 }
1261 else
1262 com_node(c, CHILD(ch,1));
1263 }
1264 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001265 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001266}
1267
1268static void
1269com_subscript(c, n)
1270 struct compiling *c;
1271 node *n;
1272{
1273 node *ch;
1274 REQ(n, subscript);
1275 ch = CHILD(n,0);
1276 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001277 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001278 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001279 com_push(c, 1);
1280 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001281 else {
1282 /* check for slice */
1283 if ((TYPE(ch) == COLON || NCH(n) > 1))
1284 com_sliceobj(c, n);
1285 else {
1286 REQ(ch, test);
1287 com_node(c, ch);
1288 }
1289 }
1290}
1291
1292static void
1293com_subscriptlist(c, n, assigning)
1294 struct compiling *c;
1295 node *n;
1296 int assigning;
1297{
1298 int i, op;
1299 REQ(n, subscriptlist);
1300 /* Check to make backward compatible slice behavior for '[i:j]' */
1301 if (NCH(n) == 1) {
1302 node *sub = CHILD(n, 0); /* subscript */
1303 /* Make it is a simple slice.
Guido van Rossum8b993a91997-01-17 21:04:03 +00001304 Should have exactly one colon. */
Guido van Rossum8861b741996-07-30 16:49:37 +00001305 if ((TYPE(CHILD(sub, 0)) == COLON
1306 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
Guido van Rossum8b993a91997-01-17 21:04:03 +00001307 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1308 {
Guido van Rossum8861b741996-07-30 16:49:37 +00001309 if (assigning == OP_APPLY)
1310 op = SLICE;
1311 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001312 op = ((assigning == OP_ASSIGN) ?
1313 STORE_SLICE : DELETE_SLICE);
Guido van Rossum8861b741996-07-30 16:49:37 +00001314 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001315 if (op == STORE_SLICE)
1316 com_pop(c, 2);
1317 else if (op == DELETE_SLICE)
1318 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001319 return;
1320 }
1321 }
1322 /* Else normal subscriptlist. Compile each subscript. */
1323 for (i = 0; i < NCH(n); i += 2)
1324 com_subscript(c, CHILD(n, i));
1325 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001326 if (NCH(n) > 1) {
1327 i = (NCH(n)+1) / 2;
1328 com_addoparg(c, BUILD_TUPLE, i);
1329 com_pop(c, i-1);
1330 }
1331 if (assigning == OP_APPLY) {
Guido van Rossum8861b741996-07-30 16:49:37 +00001332 op = BINARY_SUBSCR;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001333 i = 1;
1334 }
1335 else if (assigning == OP_ASSIGN) {
1336 op = STORE_SUBSCR;
1337 i = 3;
1338 }
1339 else {
1340 op = DELETE_SUBSCR;
1341 i = 2;
1342 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001343 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001344 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001345}
1346
1347static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001348com_apply_trailer(c, n)
1349 struct compiling *c;
1350 node *n;
1351{
1352 REQ(n, trailer);
1353 switch (TYPE(CHILD(n, 0))) {
1354 case LPAR:
1355 com_call_function(c, CHILD(n, 1));
1356 break;
1357 case DOT:
1358 com_select_member(c, CHILD(n, 1));
1359 break;
1360 case LSQB:
Guido van Rossum8861b741996-07-30 16:49:37 +00001361 com_subscriptlist(c, CHILD(n, 1), OP_APPLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001362 break;
1363 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001364 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001365 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001366 }
1367}
1368
1369static void
Guido van Rossum50564e81996-01-12 01:13:16 +00001370com_power(c, n)
1371 struct compiling *c;
1372 node *n;
1373{
1374 int i;
1375 REQ(n, power);
1376 com_atom(c, CHILD(n, 0));
1377 for (i = 1; i < NCH(n); i++) {
1378 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1379 com_factor(c, CHILD(n, i+1));
1380 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001381 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001382 break;
1383 }
1384 else
1385 com_apply_trailer(c, CHILD(n, i));
1386 }
1387}
1388
1389static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001390com_factor(c, n)
1391 struct compiling *c;
1392 node *n;
1393{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001394 REQ(n, factor);
1395 if (TYPE(CHILD(n, 0)) == PLUS) {
1396 com_factor(c, CHILD(n, 1));
1397 com_addbyte(c, UNARY_POSITIVE);
1398 }
1399 else if (TYPE(CHILD(n, 0)) == MINUS) {
1400 com_factor(c, CHILD(n, 1));
1401 com_addbyte(c, UNARY_NEGATIVE);
1402 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001403 else if (TYPE(CHILD(n, 0)) == TILDE) {
1404 com_factor(c, CHILD(n, 1));
1405 com_addbyte(c, UNARY_INVERT);
1406 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001407 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001408 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001409 }
1410}
1411
1412static void
1413com_term(c, n)
1414 struct compiling *c;
1415 node *n;
1416{
1417 int i;
1418 int op;
1419 REQ(n, term);
1420 com_factor(c, CHILD(n, 0));
1421 for (i = 2; i < NCH(n); i += 2) {
1422 com_factor(c, CHILD(n, i));
1423 switch (TYPE(CHILD(n, i-1))) {
1424 case STAR:
1425 op = BINARY_MULTIPLY;
1426 break;
1427 case SLASH:
1428 op = BINARY_DIVIDE;
1429 break;
1430 case PERCENT:
1431 op = BINARY_MODULO;
1432 break;
1433 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001434 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001435 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001436 op = 255;
1437 }
1438 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001439 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001440 }
1441}
1442
1443static void
1444com_arith_expr(c, n)
1445 struct compiling *c;
1446 node *n;
1447{
1448 int i;
1449 int op;
1450 REQ(n, arith_expr);
1451 com_term(c, CHILD(n, 0));
1452 for (i = 2; i < NCH(n); i += 2) {
1453 com_term(c, CHILD(n, i));
1454 switch (TYPE(CHILD(n, i-1))) {
1455 case PLUS:
1456 op = BINARY_ADD;
1457 break;
1458 case MINUS:
1459 op = BINARY_SUBTRACT;
1460 break;
1461 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001462 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001463 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001464 op = 255;
1465 }
1466 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001467 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001468 }
1469}
1470
1471static void
1472com_shift_expr(c, n)
1473 struct compiling *c;
1474 node *n;
1475{
1476 int i;
1477 int op;
1478 REQ(n, shift_expr);
1479 com_arith_expr(c, CHILD(n, 0));
1480 for (i = 2; i < NCH(n); i += 2) {
1481 com_arith_expr(c, CHILD(n, i));
1482 switch (TYPE(CHILD(n, i-1))) {
1483 case LEFTSHIFT:
1484 op = BINARY_LSHIFT;
1485 break;
1486 case RIGHTSHIFT:
1487 op = BINARY_RSHIFT;
1488 break;
1489 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001490 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001491 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001492 op = 255;
1493 }
1494 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001495 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001496 }
1497}
1498
1499static void
1500com_and_expr(c, n)
1501 struct compiling *c;
1502 node *n;
1503{
1504 int i;
1505 int op;
1506 REQ(n, and_expr);
1507 com_shift_expr(c, CHILD(n, 0));
1508 for (i = 2; i < NCH(n); i += 2) {
1509 com_shift_expr(c, CHILD(n, i));
1510 if (TYPE(CHILD(n, i-1)) == AMPER) {
1511 op = BINARY_AND;
1512 }
1513 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001514 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001515 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001516 op = 255;
1517 }
1518 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001519 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001520 }
1521}
1522
1523static void
1524com_xor_expr(c, n)
1525 struct compiling *c;
1526 node *n;
1527{
1528 int i;
1529 int op;
1530 REQ(n, xor_expr);
1531 com_and_expr(c, CHILD(n, 0));
1532 for (i = 2; i < NCH(n); i += 2) {
1533 com_and_expr(c, CHILD(n, i));
1534 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1535 op = BINARY_XOR;
1536 }
1537 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001538 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001539 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001540 op = 255;
1541 }
1542 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001543 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001544 }
1545}
1546
1547static void
1548com_expr(c, n)
1549 struct compiling *c;
1550 node *n;
1551{
1552 int i;
1553 int op;
1554 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001555 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001556 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001557 com_xor_expr(c, CHILD(n, i));
1558 if (TYPE(CHILD(n, i-1)) == VBAR) {
1559 op = BINARY_OR;
1560 }
1561 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001562 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001563 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001564 op = 255;
1565 }
1566 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001567 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001568 }
1569}
1570
1571static enum cmp_op
1572cmp_type(n)
1573 node *n;
1574{
1575 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001576 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001577 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1578 if (NCH(n) == 1) {
1579 n = CHILD(n, 0);
1580 switch (TYPE(n)) {
1581 case LESS: return LT;
1582 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001583 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001584 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001585 case LESSEQUAL: return LE;
1586 case GREATEREQUAL: return GE;
1587 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001588 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1589 if (strcmp(STR(n), "is") == 0) return IS;
1590 }
1591 }
1592 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001593 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001594 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1595 return NOT_IN;
1596 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1597 return IS_NOT;
1598 }
1599 }
1600 return BAD;
1601}
1602
1603static void
1604com_comparison(c, n)
1605 struct compiling *c;
1606 node *n;
1607{
1608 int i;
1609 enum cmp_op op;
1610 int anchor;
1611 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1612 com_expr(c, CHILD(n, 0));
1613 if (NCH(n) == 1)
1614 return;
1615
1616 /****************************************************************
1617 The following code is generated for all but the last
1618 comparison in a chain:
1619
1620 label: on stack: opcode: jump to:
1621
1622 a <code to load b>
1623 a, b DUP_TOP
1624 a, b, b ROT_THREE
1625 b, a, b COMPARE_OP
1626 b, 0-or-1 JUMP_IF_FALSE L1
1627 b, 1 POP_TOP
1628 b
1629
1630 We are now ready to repeat this sequence for the next
1631 comparison in the chain.
1632
1633 For the last we generate:
1634
1635 b <code to load c>
1636 b, c COMPARE_OP
1637 0-or-1
1638
1639 If there were any jumps to L1 (i.e., there was more than one
1640 comparison), we generate:
1641
1642 0-or-1 JUMP_FORWARD L2
1643 L1: b, 0 ROT_TWO
1644 0, b POP_TOP
1645 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00001646 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001647 ****************************************************************/
1648
1649 anchor = 0;
1650
1651 for (i = 2; i < NCH(n); i += 2) {
1652 com_expr(c, CHILD(n, i));
1653 if (i+2 < NCH(n)) {
1654 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001655 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001656 com_addbyte(c, ROT_THREE);
1657 }
1658 op = cmp_type(CHILD(n, i-1));
1659 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001660 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001661 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001662 }
1663 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001664 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001665 if (i+2 < NCH(n)) {
1666 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1667 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001668 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001669 }
1670 }
1671
1672 if (anchor) {
1673 int anchor2 = 0;
1674 com_addfwref(c, JUMP_FORWARD, &anchor2);
1675 com_backpatch(c, anchor);
1676 com_addbyte(c, ROT_TWO);
1677 com_addbyte(c, POP_TOP);
1678 com_backpatch(c, anchor2);
1679 }
1680}
1681
1682static void
1683com_not_test(c, n)
1684 struct compiling *c;
1685 node *n;
1686{
1687 REQ(n, not_test); /* 'not' not_test | comparison */
1688 if (NCH(n) == 1) {
1689 com_comparison(c, CHILD(n, 0));
1690 }
1691 else {
1692 com_not_test(c, CHILD(n, 1));
1693 com_addbyte(c, UNARY_NOT);
1694 }
1695}
1696
1697static void
1698com_and_test(c, n)
1699 struct compiling *c;
1700 node *n;
1701{
1702 int i;
1703 int anchor;
1704 REQ(n, and_test); /* not_test ('and' not_test)* */
1705 anchor = 0;
1706 i = 0;
1707 for (;;) {
1708 com_not_test(c, CHILD(n, i));
1709 if ((i += 2) >= NCH(n))
1710 break;
1711 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1712 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001713 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001714 }
1715 if (anchor)
1716 com_backpatch(c, anchor);
1717}
1718
1719static void
1720com_test(c, n)
1721 struct compiling *c;
1722 node *n;
1723{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001724 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00001725 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001726 PyObject *v;
Guido van Rossum57531fe1993-11-30 14:57:42 +00001727 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001728 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001729 v = (PyObject *) icompile(CHILD(n, 0), c);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001730 if (v == NULL) {
1731 c->c_errors++;
1732 i = 255;
1733 }
1734 else {
1735 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001736 Py_DECREF(v);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001737 }
1738 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001739 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001740 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001741 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001742 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001743 else {
1744 int anchor = 0;
1745 int i = 0;
1746 for (;;) {
1747 com_and_test(c, CHILD(n, i));
1748 if ((i += 2) >= NCH(n))
1749 break;
1750 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1751 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001752 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001753 }
1754 if (anchor)
1755 com_backpatch(c, anchor);
1756 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001757}
1758
1759static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001760com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001761 struct compiling *c;
1762 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001763 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001764{
1765 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001766 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001767 com_node(c, CHILD(n, 0));
1768 }
1769 else {
1770 int i;
1771 int len;
1772 len = (NCH(n) + 1) / 2;
1773 for (i = 0; i < NCH(n); i += 2)
1774 com_node(c, CHILD(n, i));
1775 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001776 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001777 }
1778}
1779
1780
1781/* Begin of assignment compilation */
1782
Guido van Rossum79f25d91997-04-29 20:08:16 +00001783static void com_assign_name Py_PROTO((struct compiling *, node *, int));
1784static void com_assign Py_PROTO((struct compiling *, node *, int));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001785
1786static void
1787com_assign_attr(c, n, assigning)
1788 struct compiling *c;
1789 node *n;
1790 int assigning;
1791{
1792 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001793 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001794}
1795
1796static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001797com_assign_trailer(c, n, assigning)
1798 struct compiling *c;
1799 node *n;
1800 int assigning;
1801{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001802 REQ(n, trailer);
1803 switch (TYPE(CHILD(n, 0))) {
1804 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001805 com_error(c, PyExc_SyntaxError,
1806 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001807 break;
1808 case DOT: /* '.' NAME */
1809 com_assign_attr(c, CHILD(n, 1), assigning);
1810 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001811 case LSQB: /* '[' subscriptlist ']' */
1812 com_subscriptlist(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001813 break;
1814 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001815 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001816 }
1817}
1818
1819static void
1820com_assign_tuple(c, n, assigning)
1821 struct compiling *c;
1822 node *n;
1823 int assigning;
1824{
1825 int i;
1826 if (TYPE(n) != testlist)
1827 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001828 if (assigning) {
1829 i = (NCH(n)+1)/2;
1830 com_addoparg(c, UNPACK_TUPLE, i);
1831 com_push(c, i-1);
1832 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001833 for (i = 0; i < NCH(n); i += 2)
1834 com_assign(c, CHILD(n, i), assigning);
1835}
1836
1837static void
1838com_assign_list(c, n, assigning)
1839 struct compiling *c;
1840 node *n;
1841 int assigning;
1842{
1843 int i;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001844 if (assigning) {
1845 i = (NCH(n)+1)/2;
1846 com_addoparg(c, UNPACK_LIST, i);
1847 com_push(c, i-1);
1848 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001849 for (i = 0; i < NCH(n); i += 2)
1850 com_assign(c, CHILD(n, i), assigning);
1851}
1852
1853static void
1854com_assign_name(c, n, assigning)
1855 struct compiling *c;
1856 node *n;
1857 int assigning;
1858{
1859 REQ(n, NAME);
1860 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001861 if (assigning)
1862 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001863}
1864
1865static void
1866com_assign(c, n, assigning)
1867 struct compiling *c;
1868 node *n;
1869 int assigning;
1870{
1871 /* Loop to avoid trivial recursion */
1872 for (;;) {
1873 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001874
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001875 case exprlist:
1876 case testlist:
1877 if (NCH(n) > 1) {
1878 com_assign_tuple(c, n, assigning);
1879 return;
1880 }
1881 n = CHILD(n, 0);
1882 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001883
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001884 case test:
1885 case and_test:
1886 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001887 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001888 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001889 case xor_expr:
1890 case and_expr:
1891 case shift_expr:
1892 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001893 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00001894 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001895 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001896 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001897 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001898 return;
1899 }
1900 n = CHILD(n, 0);
1901 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001902
Guido van Rossum50564e81996-01-12 01:13:16 +00001903 case power: /* atom trailer* ('**' power)* */
1904/* ('+'|'-'|'~') factor | atom trailer* */
1905 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001906 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001907 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001908 return;
1909 }
Guido van Rossum50564e81996-01-12 01:13:16 +00001910 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001911 int i;
1912 com_node(c, CHILD(n, 0));
1913 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00001914 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001915 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001916 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00001917 return;
1918 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001919 com_apply_trailer(c, CHILD(n, i));
1920 } /* NB i is still alive */
1921 com_assign_trailer(c,
1922 CHILD(n, i), assigning);
1923 return;
1924 }
1925 n = CHILD(n, 0);
1926 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001927
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001928 case atom:
1929 switch (TYPE(CHILD(n, 0))) {
1930 case LPAR:
1931 n = CHILD(n, 1);
1932 if (TYPE(n) == RPAR) {
1933 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001934 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001935 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001936 return;
1937 }
1938 break;
1939 case LSQB:
1940 n = CHILD(n, 1);
1941 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001942 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001943 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001944 return;
1945 }
1946 com_assign_list(c, n, assigning);
1947 return;
1948 case NAME:
1949 com_assign_name(c, CHILD(n, 0), assigning);
1950 return;
1951 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001952 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001953 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001954 return;
1955 }
1956 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001957
1958 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001959 com_error(c, PyExc_SyntaxError,
1960 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001961 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001962
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001963 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001964 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001965 com_error(c, PyExc_SystemError,
1966 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001967 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001968
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001969 }
1970 }
1971}
Guido van Rossum7c531111997-03-11 18:42:21 +00001972
Guido van Rossum79f25d91997-04-29 20:08:16 +00001973/* Forward */ static node *get_rawdocstring Py_PROTO((node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001974
1975static void
1976com_expr_stmt(c, n)
1977 struct compiling *c;
1978 node *n;
1979{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001980 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001981 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001982 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001983 return;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001984 com_node(c, CHILD(n, NCH(n)-1));
1985 if (NCH(n) == 1) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001986 if (c->c_interactive)
1987 com_addbyte(c, PRINT_EXPR);
1988 else
1989 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001990 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001991 }
1992 else {
1993 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001994 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001995 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001996 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001997 com_push(c, 1);
1998 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001999 com_assign(c, CHILD(n, i), OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002000 }
2001 }
2002}
2003
2004static void
Guido van Rossum228d7f31997-04-02 05:24:36 +00002005com_assert_stmt(c, n)
2006 struct compiling *c;
2007 node *n;
2008{
2009 int a = 0, b = 0;
2010 int i;
2011 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2012 /* Generate code like for
2013
2014 if __debug__:
2015 if not <test>:
2016 raise AssertionError [, <message>]
2017
2018 where <message> is the second test, if present.
2019 */
2020 if (Py_OptimizeFlag)
2021 return;
2022 com_addopnamestr(c, LOAD_GLOBAL, "__debug__");
2023 com_push(c, 1);
2024 com_addfwref(c, JUMP_IF_FALSE, &a);
2025 com_addbyte(c, POP_TOP);
2026 com_pop(c, 1);
2027 com_node(c, CHILD(n, 1));
2028 com_addfwref(c, JUMP_IF_TRUE, &b);
2029 com_addbyte(c, POP_TOP);
2030 com_pop(c, 1);
2031 /* Raise that exception! */
2032 com_addopnamestr(c, LOAD_GLOBAL, "AssertionError");
2033 com_push(c, 1);
2034 i = NCH(n)/2; /* Either 2 or 4 */
2035 if (i > 1)
2036 com_node(c, CHILD(n, 3));
2037 com_addoparg(c, RAISE_VARARGS, i);
2038 com_pop(c, i);
2039 /* The interpreter does not fall through */
2040 /* All jumps converge here */
2041 com_backpatch(c, a);
2042 com_backpatch(c, b);
2043 com_addbyte(c, POP_TOP);
2044}
2045
2046static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002047com_print_stmt(c, n)
2048 struct compiling *c;
2049 node *n;
2050{
2051 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002052 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
2053 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002054 com_node(c, CHILD(n, i));
2055 com_addbyte(c, PRINT_ITEM);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002056 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002057 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002058 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002059 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002060 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002061}
2062
2063static void
2064com_return_stmt(c, n)
2065 struct compiling *c;
2066 node *n;
2067{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002068 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002069 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002070 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002071 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002072 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002073 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002074 com_push(c, 1);
2075 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002076 else
2077 com_node(c, CHILD(n, 1));
2078 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002079 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002080}
2081
2082static void
2083com_raise_stmt(c, n)
2084 struct compiling *c;
2085 node *n;
2086{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002087 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002088 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2089 if (NCH(n) > 1) {
2090 com_node(c, CHILD(n, 1));
2091 if (NCH(n) > 3) {
2092 com_node(c, CHILD(n, 3));
2093 if (NCH(n) > 5)
2094 com_node(c, CHILD(n, 5));
2095 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002096 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002097 i = NCH(n)/2;
2098 com_addoparg(c, RAISE_VARARGS, i);
2099 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002100}
2101
2102static void
2103com_import_stmt(c, n)
2104 struct compiling *c;
2105 node *n;
2106{
2107 int i;
2108 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002109 /* 'import' dotted_name (',' dotted_name)* |
2110 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002111 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002112 /* 'from' dotted_name 'import' ... */
2113 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002114 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002115 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002116 for (i = 3; i < NCH(n); i += 2)
2117 com_addopname(c, IMPORT_FROM, CHILD(n, i));
2118 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002119 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002120 }
2121 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002122 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002123 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002124 REQ(CHILD(n, i), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002125 com_addopname(c, IMPORT_NAME, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002126 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002127 com_addopname(c, STORE_NAME, CHILD(CHILD(n, i), 0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002128 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002129 }
2130 }
2131}
2132
2133static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00002134com_global_stmt(c, n)
2135 struct compiling *c;
2136 node *n;
2137{
2138 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002139 REQ(n, global_stmt);
2140 /* 'global' NAME (',' NAME)* */
2141 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002142 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002143#ifdef PRIVATE_NAME_MANGLING
2144 char buffer[256];
2145 if (s != NULL && s[0] == '_' && s[1] == '_' &&
2146 c->c_private != NULL &&
2147 com_mangle(c, s, buffer, (int)sizeof(buffer)))
2148 s = buffer;
2149#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +00002150 if (PyDict_GetItemString(c->c_locals, s) != NULL) {
2151 com_error(c, PyExc_SyntaxError,
2152 "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002153 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002154 else if (PyDict_SetItemString(c->c_globals, s, Py_None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002155 c->c_errors++;
2156 }
2157}
2158
Guido van Rossum681d79a1995-07-18 14:51:37 +00002159static int
2160com_newlocal_o(c, nameval)
2161 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002162 PyObject *nameval;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002163{
2164 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002165 PyObject *ival;
2166 if (PyList_Size(c->c_varnames) != c->c_nlocals) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002167 /* This is usually caused by an error on a previous call */
2168 if (c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002169 com_error(c, PyExc_SystemError,
2170 "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002171 }
2172 return 0;
2173 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002174 ival = PyInt_FromLong(i = c->c_nlocals++);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002175 if (ival == NULL)
2176 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002177 else if (PyDict_SetItem(c->c_locals, nameval, ival) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002178 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002179 else if (PyList_Append(c->c_varnames, nameval) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002180 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002181 Py_XDECREF(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002182 return i;
2183}
2184
2185static int
2186com_addlocal_o(c, nameval)
2187 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002188 PyObject *nameval;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002189{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002190 PyObject *ival = PyDict_GetItem(c->c_locals, nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002191 if (ival != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002192 return PyInt_AsLong(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002193 return com_newlocal_o(c, nameval);
2194}
2195
2196static int
2197com_newlocal(c, name)
2198 struct compiling *c;
2199 char *name;
2200{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002201 PyObject *nameval = PyString_InternFromString(name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002202 int i;
2203 if (nameval == NULL) {
2204 c->c_errors++;
2205 return 0;
2206 }
2207 i = com_newlocal_o(c, nameval);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002208 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002209 return i;
2210}
2211
Guido van Rossumc5e96291991-12-10 13:53:51 +00002212static void
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002213com_exec_stmt(c, n)
2214 struct compiling *c;
2215 node *n;
2216{
2217 REQ(n, exec_stmt);
2218 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2219 com_node(c, CHILD(n, 1));
2220 if (NCH(n) >= 4)
2221 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002222 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002223 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002224 com_push(c, 1);
2225 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002226 if (NCH(n) >= 6)
2227 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002228 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002229 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002230 com_push(c, 1);
2231 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002232 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002233 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002234}
2235
Guido van Rossum7c531111997-03-11 18:42:21 +00002236static int
2237is_constant_false(c, n)
2238 struct compiling *c;
2239 node *n;
2240{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002241 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002242 int i;
2243
2244 /* Label to avoid tail recursion */
2245 next:
2246 switch (TYPE(n)) {
2247
2248 case suite:
2249 if (NCH(n) == 1) {
2250 n = CHILD(n, 0);
2251 goto next;
2252 }
2253 /* Fall through */
2254 case file_input:
2255 for (i = 0; i < NCH(n); i++) {
2256 node *ch = CHILD(n, i);
2257 if (TYPE(ch) == stmt) {
2258 n = ch;
2259 goto next;
2260 }
2261 }
2262 break;
2263
2264 case stmt:
2265 case simple_stmt:
2266 case small_stmt:
2267 n = CHILD(n, 0);
2268 goto next;
2269
2270 case expr_stmt:
2271 case testlist:
2272 case test:
2273 case and_test:
2274 case not_test:
2275 case comparison:
2276 case expr:
2277 case xor_expr:
2278 case and_expr:
2279 case shift_expr:
2280 case arith_expr:
2281 case term:
2282 case factor:
2283 case power:
2284 case atom:
2285 if (NCH(n) == 1) {
2286 n = CHILD(n, 0);
2287 goto next;
2288 }
2289 break;
2290
2291 case NAME:
2292 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2293 return 1;
2294 break;
2295
2296 case NUMBER:
2297 v = parsenumber(c, STR(n));
2298 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002299 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002300 break;
2301 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002302 i = PyObject_IsTrue(v);
2303 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002304 return i == 0;
2305
2306 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002307 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002308 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002309 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002310 break;
2311 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002312 i = PyObject_IsTrue(v);
2313 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002314 return i == 0;
2315
2316 }
2317 return 0;
2318}
2319
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002320static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002321com_if_stmt(c, n)
2322 struct compiling *c;
2323 node *n;
2324{
2325 int i;
2326 int anchor = 0;
2327 REQ(n, if_stmt);
2328 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2329 for (i = 0; i+3 < NCH(n); i+=4) {
2330 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002331 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002332 if (is_constant_false(c, ch))
2333 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002334 if (i > 0)
2335 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002336 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002337 com_addfwref(c, JUMP_IF_FALSE, &a);
2338 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002339 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002340 com_node(c, CHILD(n, i+3));
2341 com_addfwref(c, JUMP_FORWARD, &anchor);
2342 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002343 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002344 com_addbyte(c, POP_TOP);
2345 }
2346 if (i+2 < NCH(n))
2347 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002348 if (anchor)
2349 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002350}
2351
2352static void
2353com_while_stmt(c, n)
2354 struct compiling *c;
2355 node *n;
2356{
2357 int break_anchor = 0;
2358 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002359 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002360 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2361 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002362 block_push(c, SETUP_LOOP);
2363 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002364 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002365 com_node(c, CHILD(n, 1));
2366 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2367 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002368 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002369 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002370 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002371 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002372 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2373 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002374 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002375 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002376 com_addbyte(c, POP_TOP);
2377 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002378 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002379 if (NCH(n) > 4)
2380 com_node(c, CHILD(n, 6));
2381 com_backpatch(c, break_anchor);
2382}
2383
2384static void
2385com_for_stmt(c, n)
2386 struct compiling *c;
2387 node *n;
2388{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002389 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002390 int break_anchor = 0;
2391 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002392 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002393 REQ(n, for_stmt);
2394 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2395 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002396 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002397 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002398 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002399 if (v == NULL)
2400 c->c_errors++;
2401 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002402 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002403 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002404 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002405 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002406 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002407 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002408 com_assign(c, CHILD(n, 1), OP_ASSIGN);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002409 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002410 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002411 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002412 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2413 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002414 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002415 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002416 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002417 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002418 if (NCH(n) > 8)
2419 com_node(c, CHILD(n, 8));
2420 com_backpatch(c, break_anchor);
2421}
2422
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002423/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002424
2425 SETUP_FINALLY L
2426 <code for S>
2427 POP_BLOCK
2428 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002429 L: <code for Sf>
2430 END_FINALLY
2431
2432 The special instructions use the block stack. Each block
2433 stack entry contains the instruction that created it (here
2434 SETUP_FINALLY), the level of the value stack at the time the
2435 block stack entry was created, and a label (here L).
2436
2437 SETUP_FINALLY:
2438 Pushes the current value stack level and the label
2439 onto the block stack.
2440 POP_BLOCK:
2441 Pops en entry from the block stack, and pops the value
2442 stack until its level is the same as indicated on the
2443 block stack. (The label is ignored.)
2444 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002445 Pops a variable number of entries from the *value* stack
2446 and re-raises the exception they specify. The number of
2447 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002448
2449 The block stack is unwound when an exception is raised:
2450 when a SETUP_FINALLY entry is found, the exception is pushed
2451 onto the value stack (and the exception condition is cleared),
2452 and the interpreter jumps to the label gotten from the block
2453 stack.
2454
2455 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002456 (The contents of the value stack is shown in [], with the top
2457 at the right; 'tb' is trace-back info, 'val' the exception's
2458 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002459
2460 Value stack Label Instruction Argument
2461 [] SETUP_EXCEPT L1
2462 [] <code for S>
2463 [] POP_BLOCK
2464 [] JUMP_FORWARD L0
2465
Guido van Rossum3f5da241990-12-20 15:06:42 +00002466 [tb, val, exc] L1: DUP )
2467 [tb, val, exc, exc] <evaluate E1> )
2468 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2469 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2470 [tb, val, exc, 1] POP )
2471 [tb, val, exc] POP
2472 [tb, val] <assign to V1> (or POP if no V1)
2473 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002474 [] <code for S1>
2475 JUMP_FORWARD L0
2476
Guido van Rossum3f5da241990-12-20 15:06:42 +00002477 [tb, val, exc, 0] L2: POP
2478 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002479 .............................etc.......................
2480
Guido van Rossum3f5da241990-12-20 15:06:42 +00002481 [tb, val, exc, 0] Ln+1: POP
2482 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002483
2484 [] L0: <next statement>
2485
2486 Of course, parts are not generated if Vi or Ei is not present.
2487*/
2488
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002489static void
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002490com_try_except(c, n)
2491 struct compiling *c;
2492 node *n;
2493{
2494 int except_anchor = 0;
2495 int end_anchor = 0;
2496 int else_anchor = 0;
2497 int i;
2498 node *ch;
2499
2500 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2501 block_push(c, SETUP_EXCEPT);
2502 com_node(c, CHILD(n, 2));
2503 com_addbyte(c, POP_BLOCK);
2504 block_pop(c, SETUP_EXCEPT);
2505 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2506 com_backpatch(c, except_anchor);
2507 for (i = 3;
2508 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2509 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002510 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002511 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002512 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002513 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002514 break;
2515 }
2516 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002517 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002518 com_addoparg(c, SET_LINENO, ch->n_lineno);
2519 if (NCH(ch) > 1) {
2520 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002521 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002522 com_node(c, CHILD(ch, 1));
2523 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002524 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002525 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2526 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002527 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002528 }
2529 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002530 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002531 if (NCH(ch) > 3)
Guido van Rossum8861b741996-07-30 16:49:37 +00002532 com_assign(c, CHILD(ch, 3), OP_ASSIGN);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002533 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002534 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002535 com_pop(c, 1);
2536 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002537 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002538 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002539 com_node(c, CHILD(n, i+2));
2540 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2541 if (except_anchor) {
2542 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002543 /* We come in with [tb, val, exc, 0] on the
2544 stack; one pop and it's the same as
2545 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002546 com_addbyte(c, POP_TOP);
2547 }
2548 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002549 /* We actually come in here with [tb, val, exc] but the
2550 END_FINALLY will zap those and jump around.
2551 The c_stacklevel does not reflect them so we need not pop
2552 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002553 com_addbyte(c, END_FINALLY);
2554 com_backpatch(c, else_anchor);
2555 if (i < NCH(n))
2556 com_node(c, CHILD(n, i+2));
2557 com_backpatch(c, end_anchor);
2558}
2559
2560static void
2561com_try_finally(c, n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002562 struct compiling *c;
2563 node *n;
2564{
2565 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002566 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002567
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002568 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2569 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002570 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002571 com_addbyte(c, POP_BLOCK);
2572 block_pop(c, SETUP_FINALLY);
2573 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002574 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002575 /* While the generated code pushes only one item,
2576 the try-finally handling can enter here with
2577 up to three items. OK, here are the details:
2578 3 for an exception, 2 for RETURN, 1 for BREAK. */
2579 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002580 com_backpatch(c, finally_anchor);
2581 ch = CHILD(n, NCH(n)-1);
2582 com_addoparg(c, SET_LINENO, ch->n_lineno);
2583 com_node(c, ch);
2584 com_addbyte(c, END_FINALLY);
2585 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002586 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002587}
2588
2589static void
2590com_try_stmt(c, n)
2591 struct compiling *c;
2592 node *n;
2593{
2594 REQ(n, try_stmt);
2595 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2596 | 'try' ':' suite 'finally' ':' suite */
2597 if (TYPE(CHILD(n, 3)) != except_clause)
2598 com_try_finally(c, n);
2599 else
2600 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002601}
2602
Guido van Rossum8b993a91997-01-17 21:04:03 +00002603static node *
2604get_rawdocstring(n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002605 node *n;
2606{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002607 int i;
2608
Guido van Rossum8b993a91997-01-17 21:04:03 +00002609 /* Label to avoid tail recursion */
2610 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002611 switch (TYPE(n)) {
2612
2613 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002614 if (NCH(n) == 1) {
2615 n = CHILD(n, 0);
2616 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002617 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002618 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002619 case file_input:
2620 for (i = 0; i < NCH(n); i++) {
2621 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002622 if (TYPE(ch) == stmt) {
2623 n = ch;
2624 goto next;
2625 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002626 }
2627 break;
2628
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002629 case stmt:
2630 case simple_stmt:
2631 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002632 n = CHILD(n, 0);
2633 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002634
2635 case expr_stmt:
2636 case testlist:
2637 case test:
2638 case and_test:
2639 case not_test:
2640 case comparison:
2641 case expr:
2642 case xor_expr:
2643 case and_expr:
2644 case shift_expr:
2645 case arith_expr:
2646 case term:
2647 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002648 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002649 if (NCH(n) == 1) {
2650 n = CHILD(n, 0);
2651 goto next;
2652 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002653 break;
2654
2655 case atom:
2656 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002657 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002658 break;
2659
2660 }
2661 return NULL;
2662}
2663
Guido van Rossum79f25d91997-04-29 20:08:16 +00002664static PyObject *
Guido van Rossum8b993a91997-01-17 21:04:03 +00002665get_docstring(n)
2666 node *n;
2667{
Guido van Rossum541563e1999-01-28 15:08:09 +00002668 /* Don't generate doc-strings if run with -OO */
2669 if (Py_OptimizeFlag > 1)
2670 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002671 n = get_rawdocstring(n);
2672 if (n == NULL)
2673 return NULL;
2674 return parsestrplus(n);
2675}
2676
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002677static void
2678com_suite(c, n)
2679 struct compiling *c;
2680 node *n;
2681{
2682 REQ(n, suite);
2683 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2684 if (NCH(n) == 1) {
2685 com_node(c, CHILD(n, 0));
2686 }
2687 else {
2688 int i;
2689 for (i = 0; i < NCH(n); i++) {
2690 node *ch = CHILD(n, i);
2691 if (TYPE(ch) == stmt)
2692 com_node(c, ch);
2693 }
2694 }
2695}
2696
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002697/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002698static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002699com_continue_stmt(c, n)
2700 struct compiling *c;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002701 node *n; /* Not used, but passed for consistency */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002702{
2703 int i = c->c_nblocks;
2704 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2705 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2706 }
2707 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002708 com_error(c, PyExc_SyntaxError,
2709 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002710 }
2711 /* XXX Could allow it inside a 'finally' clause
2712 XXX if we could pop the exception still on the stack */
2713}
2714
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002715static int
Guido van Rossum681d79a1995-07-18 14:51:37 +00002716com_argdefs(c, n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002717 struct compiling *c;
2718 node *n;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002719{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002720 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002721 if (TYPE(n) == lambdef) {
2722 /* lambdef: 'lambda' [varargslist] ':' test */
2723 n = CHILD(n, 1);
2724 }
2725 else {
2726 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2727 n = CHILD(n, 2);
2728 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2729 n = CHILD(n, 1);
2730 }
2731 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002732 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002733 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002734 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002735 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2736 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002737 nargs = 0;
2738 ndefs = 0;
2739 for (i = 0; i < nch; i++) {
2740 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002741 if (TYPE(CHILD(n, i)) == STAR ||
2742 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002743 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002744 nargs++;
2745 i++;
2746 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002747 t = RPAR; /* Anything except EQUAL or COMMA */
2748 else
2749 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002750 if (t == EQUAL) {
2751 i++;
2752 ndefs++;
2753 com_node(c, CHILD(n, i));
2754 i++;
2755 if (i >= nch)
2756 break;
2757 t = TYPE(CHILD(n, i));
2758 }
2759 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00002760 /* Treat "(a=1, b)" as an error */
2761 if (ndefs)
2762 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00002763 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002764 }
2765 if (t != COMMA)
2766 break;
2767 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002768 return ndefs;
2769}
2770
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002771static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002772com_funcdef(c, n)
2773 struct compiling *c;
2774 node *n;
2775{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002776 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002777 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002778 v = (PyObject *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002779 if (v == NULL)
2780 c->c_errors++;
2781 else {
2782 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002783 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002784 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002785 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002786 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002787 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002788 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002789 com_pop(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002790 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002791 }
2792}
2793
2794static void
Guido van Rossum25831651993-05-19 14:50:45 +00002795com_bases(c, n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002796 struct compiling *c;
2797 node *n;
2798{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002799 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002800 REQ(n, testlist);
2801 /* testlist: test (',' test)* [','] */
2802 for (i = 0; i < NCH(n); i += 2)
2803 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002804 i = (NCH(n)+1) / 2;
2805 com_addoparg(c, BUILD_TUPLE, i);
2806 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00002807}
2808
2809static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002810com_classdef(c, n)
2811 struct compiling *c;
2812 node *n;
2813{
Guido van Rossum25831651993-05-19 14:50:45 +00002814 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002815 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002816 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002817 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00002818 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00002819 c->c_errors++;
2820 return;
2821 }
2822 /* Push the class name on the stack */
2823 i = com_addconst(c, v);
2824 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002825 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002826 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00002827 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002828 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00002829 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002830 com_push(c, 1);
2831 }
Guido van Rossum25831651993-05-19 14:50:45 +00002832 else
2833 com_bases(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002834 v = (PyObject *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002835 if (v == NULL)
2836 c->c_errors++;
2837 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002838 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002839 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002840 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002841 com_addoparg(c, MAKE_FUNCTION, 0);
2842 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002843 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002844 com_pop(c, 2);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002845 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002846 Py_DECREF(v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002847 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002848}
2849
2850static void
2851com_node(c, n)
2852 struct compiling *c;
2853 node *n;
2854{
2855 switch (TYPE(n)) {
2856
2857 /* Definition nodes */
2858
2859 case funcdef:
2860 com_funcdef(c, n);
2861 break;
2862 case classdef:
2863 com_classdef(c, n);
2864 break;
2865
2866 /* Trivial parse tree nodes */
2867
2868 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002869 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002870 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002871 com_node(c, CHILD(n, 0));
2872 break;
2873
2874 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002875 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2876 com_addoparg(c, SET_LINENO, n->n_lineno);
2877 {
2878 int i;
2879 for (i = 0; i < NCH(n)-1; i += 2)
2880 com_node(c, CHILD(n, i));
2881 }
2882 break;
2883
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002884 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002885 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002886 com_node(c, CHILD(n, 0));
2887 break;
2888
2889 /* Statement nodes */
2890
2891 case expr_stmt:
2892 com_expr_stmt(c, n);
2893 break;
2894 case print_stmt:
2895 com_print_stmt(c, n);
2896 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002897 case del_stmt: /* 'del' exprlist */
Guido van Rossum8861b741996-07-30 16:49:37 +00002898 com_assign(c, CHILD(n, 1), OP_DELETE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002899 break;
2900 case pass_stmt:
2901 break;
2902 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002903 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002904 com_error(c, PyExc_SyntaxError,
2905 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002906 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002907 com_addbyte(c, BREAK_LOOP);
2908 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002909 case continue_stmt:
2910 com_continue_stmt(c, n);
2911 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002912 case return_stmt:
2913 com_return_stmt(c, n);
2914 break;
2915 case raise_stmt:
2916 com_raise_stmt(c, n);
2917 break;
2918 case import_stmt:
2919 com_import_stmt(c, n);
2920 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002921 case global_stmt:
2922 com_global_stmt(c, n);
2923 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002924 case exec_stmt:
2925 com_exec_stmt(c, n);
2926 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002927 case assert_stmt:
2928 com_assert_stmt(c, n);
2929 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002930 case if_stmt:
2931 com_if_stmt(c, n);
2932 break;
2933 case while_stmt:
2934 com_while_stmt(c, n);
2935 break;
2936 case for_stmt:
2937 com_for_stmt(c, n);
2938 break;
2939 case try_stmt:
2940 com_try_stmt(c, n);
2941 break;
2942 case suite:
2943 com_suite(c, n);
2944 break;
2945
2946 /* Expression nodes */
2947
2948 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002949 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002950 break;
2951 case test:
2952 com_test(c, n);
2953 break;
2954 case and_test:
2955 com_and_test(c, n);
2956 break;
2957 case not_test:
2958 com_not_test(c, n);
2959 break;
2960 case comparison:
2961 com_comparison(c, n);
2962 break;
2963 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002964 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002965 break;
2966 case expr:
2967 com_expr(c, n);
2968 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002969 case xor_expr:
2970 com_xor_expr(c, n);
2971 break;
2972 case and_expr:
2973 com_and_expr(c, n);
2974 break;
2975 case shift_expr:
2976 com_shift_expr(c, n);
2977 break;
2978 case arith_expr:
2979 com_arith_expr(c, n);
2980 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002981 case term:
2982 com_term(c, n);
2983 break;
2984 case factor:
2985 com_factor(c, n);
2986 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00002987 case power:
2988 com_power(c, n);
2989 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002990 case atom:
2991 com_atom(c, n);
2992 break;
2993
2994 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002995 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002996 com_error(c, PyExc_SystemError,
2997 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002998 }
2999}
3000
Guido van Rossum79f25d91997-04-29 20:08:16 +00003001static void com_fplist Py_PROTO((struct compiling *, node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003002
3003static void
3004com_fpdef(c, n)
3005 struct compiling *c;
3006 node *n;
3007{
3008 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3009 if (TYPE(CHILD(n, 0)) == LPAR)
3010 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003011 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003012 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003013 com_pop(c, 1);
3014 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003015}
3016
3017static void
3018com_fplist(c, n)
3019 struct compiling *c;
3020 node *n;
3021{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003022 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003023 if (NCH(n) == 1) {
3024 com_fpdef(c, CHILD(n, 0));
3025 }
3026 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003027 int i = (NCH(n)+1)/2;
3028 com_addoparg(c, UNPACK_TUPLE, i);
3029 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003030 for (i = 0; i < NCH(n); i += 2)
3031 com_fpdef(c, CHILD(n, i));
3032 }
3033}
3034
3035static void
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003036com_arglist(c, n)
3037 struct compiling *c;
3038 node *n;
3039{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003040 int nch, i;
3041 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003042 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003043 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003044 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003045 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003046 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003047 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003048 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003049 node *ch = CHILD(n, i);
3050 node *fp;
3051 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00003052 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003053 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003054 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3055 fp = CHILD(ch, 0);
3056 if (TYPE(fp) == NAME)
3057 name = STR(fp);
3058 else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003059 name = nbuf;
3060 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003061 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003062 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003063 com_newlocal(c, name);
3064 c->c_argcount++;
3065 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003066 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003067 ch = CHILD(n, i);
3068 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003069 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003070 else
3071 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003072 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003073 /* Handle *arguments */
3074 if (i < nch) {
3075 node *ch;
3076 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003077 if (TYPE(ch) != DOUBLESTAR) {
3078 REQ(ch, STAR);
3079 ch = CHILD(n, i+1);
3080 if (TYPE(ch) == NAME) {
3081 c->c_flags |= CO_VARARGS;
3082 i += 3;
3083 com_newlocal(c, STR(ch));
3084 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003085 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003086 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003087 /* Handle **keywords */
3088 if (i < nch) {
3089 node *ch;
3090 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003091 if (TYPE(ch) != DOUBLESTAR) {
3092 REQ(ch, STAR);
3093 ch = CHILD(n, i+1);
3094 REQ(ch, STAR);
3095 ch = CHILD(n, i+2);
3096 }
3097 else
3098 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003099 REQ(ch, NAME);
3100 c->c_flags |= CO_VARKEYWORDS;
3101 com_newlocal(c, STR(ch));
3102 }
3103 if (complex) {
3104 /* Generate code for complex arguments only after
3105 having counted the simple arguments */
3106 int ilocal = 0;
3107 for (i = 0; i < nch; i++) {
3108 node *ch = CHILD(n, i);
3109 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003110 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003111 break;
3112 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3113 fp = CHILD(ch, 0);
3114 if (TYPE(fp) != NAME) {
3115 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003116 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003117 com_fpdef(c, ch);
3118 }
3119 ilocal++;
3120 if (++i >= nch)
3121 break;
3122 ch = CHILD(n, i);
3123 if (TYPE(ch) == EQUAL)
3124 i += 2;
3125 else
3126 REQ(ch, COMMA);
3127 }
3128 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003129}
3130
3131static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003132com_file_input(c, n)
3133 struct compiling *c;
3134 node *n;
3135{
3136 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003137 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003138 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003139 doc = get_docstring(n);
3140 if (doc != NULL) {
3141 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003142 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003143 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003144 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003145 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003146 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003147 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003148 for (i = 0; i < NCH(n); i++) {
3149 node *ch = CHILD(n, i);
3150 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3151 com_node(c, ch);
3152 }
3153}
3154
3155/* Top-level compile-node interface */
3156
3157static void
3158compile_funcdef(c, n)
3159 struct compiling *c;
3160 node *n;
3161{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003162 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003163 node *ch;
3164 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003165 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003166 doc = get_docstring(CHILD(n, 4));
3167 if (doc != NULL) {
3168 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003169 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003170 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003171 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003172 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003173 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3174 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003175 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003176 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003177 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003178 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003179 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003180 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003181 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003182 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003183 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003184}
3185
3186static void
Guido van Rossum590baa41993-11-30 13:40:46 +00003187compile_lambdef(c, n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003188 struct compiling *c;
3189 node *n;
3190{
Guido van Rossum590baa41993-11-30 13:40:46 +00003191 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003192 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003193 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003194
3195 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003196 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003197 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003198 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003199 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003200 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003201 else
3202 ch = CHILD(n, 2);
3203 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003204 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003205 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003206}
3207
3208static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003209compile_classdef(c, n)
3210 struct compiling *c;
3211 node *n;
3212{
3213 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003214 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003215 REQ(n, classdef);
3216 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3217 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003218#ifdef PRIVATE_NAME_MANGLING
3219 c->c_private = c->c_name;
3220#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003221 ch = CHILD(n, NCH(n)-1); /* The suite */
3222 doc = get_docstring(ch);
3223 if (doc != NULL) {
3224 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003225 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003226 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003227 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003228 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003229 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003230 }
3231 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003232 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003233 com_node(c, ch);
3234 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003235 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003236 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003237 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003238}
3239
3240static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003241compile_node(c, n)
3242 struct compiling *c;
3243 node *n;
3244{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003245 com_addoparg(c, SET_LINENO, n->n_lineno);
3246
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003247 switch (TYPE(n)) {
3248
Guido van Rossum4c417781991-01-21 16:09:22 +00003249 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003250 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003251 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003252 n = CHILD(n, 0);
3253 if (TYPE(n) != NEWLINE)
3254 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003255 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003256 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003257 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003258 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003259 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003260 break;
3261
Guido van Rossum4c417781991-01-21 16:09:22 +00003262 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003263 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003264 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003265 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003266 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003267 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003268 break;
3269
Guido van Rossum590baa41993-11-30 13:40:46 +00003270 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003271 com_node(c, CHILD(n, 0));
3272 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003273 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003274 break;
3275
Guido van Rossum590baa41993-11-30 13:40:46 +00003276 case lambdef: /* anonymous function definition */
3277 compile_lambdef(c, n);
3278 break;
3279
Guido van Rossum4c417781991-01-21 16:09:22 +00003280 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003281 compile_funcdef(c, n);
3282 break;
3283
Guido van Rossum4c417781991-01-21 16:09:22 +00003284 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003285 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003286 break;
3287
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003288 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003289 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003290 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003291 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003292 }
3293}
3294
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003295/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00003296
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003297 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
3298 instructions that refer to local variables with LOAD_FAST etc.
3299 The latter instructions are much faster because they don't need to
3300 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003301
Guido van Rossum681d79a1995-07-18 14:51:37 +00003302 To find all local variables, we check all STORE_NAME, IMPORT_FROM
3303 and DELETE_NAME instructions. This yields all local variables,
3304 function definitions, class definitions and import statements.
3305 Argument names have already been entered into the list by the
3306 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003307
3308 All remaining LOAD_NAME instructions must refer to non-local (global
3309 or builtin) variables, so are replaced by LOAD_GLOBAL.
3310
3311 There are two problems: 'from foo import *' and 'exec' may introduce
3312 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00003313 case, we can still optimize bona fide locals (since those
3314 statements will be surrounded by fast_2_locals() and
3315 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003316
Guido van Rossum681d79a1995-07-18 14:51:37 +00003317 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00003318
3319static void
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003320optimize(c)
3321 struct compiling *c;
Guido van Rossum282914b1991-04-04 10:42:56 +00003322{
Guido van Rossum0a697f61991-04-16 08:39:12 +00003323 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00003324 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00003325 int oparg = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003326 PyObject *name;
3327 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003328
Guido van Rossum282914b1991-04-04 10:42:56 +00003329#define NEXTOP() (*next_instr++)
3330#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossum79f25d91997-04-29 20:08:16 +00003331#define GETITEM(v, i) (PyList_GetItem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003332#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
3333
Guido van Rossum79f25d91997-04-29 20:08:16 +00003334 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003335
3336 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00003337
Guido van Rossum79f25d91997-04-29 20:08:16 +00003338 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003339 for (;;) {
3340 opcode = NEXTOP();
3341 if (opcode == STOP_CODE)
3342 break;
3343 if (HAS_ARG(opcode))
3344 oparg = NEXTARG();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003345 switch (opcode) {
3346 case STORE_NAME:
3347 case DELETE_NAME:
3348 case IMPORT_FROM:
3349 com_addlocal_o(c, GETNAMEOBJ(oparg));
3350 break;
3351 case EXEC_STMT:
3352 c->c_flags &= ~CO_OPTIMIZED;
3353 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00003354 }
3355 }
3356
Guido van Rossum79f25d91997-04-29 20:08:16 +00003357 if (PyDict_GetItemString(c->c_locals, "*") != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003358 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003359
Guido van Rossum79f25d91997-04-29 20:08:16 +00003360 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003361 for (;;) {
3362 cur_instr = next_instr;
3363 opcode = NEXTOP();
3364 if (opcode == STOP_CODE)
3365 break;
3366 if (HAS_ARG(opcode))
3367 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003368 if (opcode == LOAD_NAME ||
3369 opcode == STORE_NAME ||
3370 opcode == DELETE_NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003371 PyObject *v;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003372 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00003373 name = GETNAMEOBJ(oparg);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003374 v = PyDict_GetItem(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003375 if (v == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003376 if (opcode == LOAD_NAME &&
3377 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003378 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003379 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00003380 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003381 i = PyInt_AsLong(v);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003382 switch (opcode) {
3383 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
3384 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
3385 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
3386 }
3387 cur_instr[1] = i & 0xff;
3388 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00003389 }
3390 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003391
Guido van Rossum681d79a1995-07-18 14:51:37 +00003392 if (c->c_errors == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00003393 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00003394}
3395
Guido van Rossum79f25d91997-04-29 20:08:16 +00003396PyCodeObject *
3397PyNode_Compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003398 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003399 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003400{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003401 return jcompile(n, filename, NULL);
3402}
3403
Guido van Rossum79f25d91997-04-29 20:08:16 +00003404static PyCodeObject *
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003405icompile(n, base)
3406 node *n;
3407 struct compiling *base;
3408{
3409 return jcompile(n, base->c_filename, base);
3410}
3411
Guido van Rossum79f25d91997-04-29 20:08:16 +00003412static PyCodeObject *
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003413jcompile(n, filename, base)
3414 node *n;
3415 char *filename;
3416 struct compiling *base;
3417{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003418 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003419 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003420 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003421 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003422#ifdef PRIVATE_NAME_MANGLING
3423 if (base)
3424 sc.c_private = base->c_private;
3425 else
3426 sc.c_private = NULL;
3427#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003428 compile_node(&sc, n);
3429 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003430 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003431 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003432 sc.c_flags |= CO_NEWLOCALS;
3433 }
3434 else if (TYPE(n) == classdef)
3435 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00003436 co = NULL;
3437 if (sc.c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003438 PyObject *consts, *names, *varnames, *filename, *name;
3439 consts = PyList_AsTuple(sc.c_consts);
3440 names = PyList_AsTuple(sc.c_names);
3441 varnames = PyList_AsTuple(sc.c_varnames);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003442 filename = PyString_InternFromString(sc.c_filename);
3443 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003444 if (!PyErr_Occurred())
3445 co = PyCode_New(sc.c_argcount,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003446 sc.c_nlocals,
Guido van Rossum8b993a91997-01-17 21:04:03 +00003447 sc.c_maxstacklevel,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003448 sc.c_flags,
3449 sc.c_code,
3450 consts,
3451 names,
3452 varnames,
3453 filename,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003454 name,
3455 sc.c_firstlineno,
3456 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003457 Py_XDECREF(consts);
3458 Py_XDECREF(names);
3459 Py_XDECREF(varnames);
3460 Py_XDECREF(filename);
3461 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003462 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003463 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003464 return co;
3465}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003466
3467int
3468PyCode_Addr2Line(co, addrq)
3469 PyCodeObject *co;
3470 int addrq;
3471{
3472 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003473 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003474 int line = co->co_firstlineno;
3475 int addr = 0;
3476 while (--size >= 0) {
3477 addr += *p++;
3478 if (addr > addrq)
3479 break;
3480 line += *p++;
3481 }
3482 return line;
3483}