blob: 19f18e692dba41352e3744054c70c8e9d0a7c842 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum10dc2e81990-11-18 17:27:39 +000032/* Compile an expression node to intermediate code */
33
Guido van Rossum3f5da241990-12-20 15:06:42 +000034/* XXX TO DO:
Guido van Rossum8b993a91997-01-17 21:04:03 +000035 XXX add __doc__ attribute == co_doc to code object attributes?
36 XXX (it's currently the first item of the co_const tuple)
Guido van Rossum3f5da241990-12-20 15:06:42 +000037 XXX Generate simple jump for break/return outside 'try...finally'
Guido van Rossum8b993a91997-01-17 21:04:03 +000038 XXX Allow 'continue' inside try-finally
Guido van Rossum8b993a91997-01-17 21:04:03 +000039 XXX New opcode for loading the initial index for a for loop
Guido van Rossum681d79a1995-07-18 14:51:37 +000040 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000041*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000042
Guido van Rossum8ff077b1996-08-24 06:21:31 +000043#ifndef NO_PRIVATE_NAME_MANGLING
44#define PRIVATE_NAME_MANGLING
45#endif
46
Guido van Rossum79f25d91997-04-29 20:08:16 +000047#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000048
Guido van Rossum10dc2e81990-11-18 17:27:39 +000049#include "node.h"
50#include "token.h"
51#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000052#include "compile.h"
53#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000054#include "structmember.h"
55
56#include <ctype.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000057
Guido van Rossumb05a5c71997-05-07 17:46:13 +000058/* Three symbols from graminit.h are also defined in Python.h, with
59 Py_ prefixes to their names. Python.h can't include graminit.h
60 (which defines too many confusing symbols), but we can check here
61 that they haven't changed (which is very unlikely, but possible). */
62#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000063 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000064#endif
65#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000066 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000067#endif
68#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000069 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000070#endif
71
Guido van Rossum8e793d91997-03-03 19:13:14 +000072int Py_OptimizeFlag = 0;
73
Guido van Rossum8861b741996-07-30 16:49:37 +000074#define OP_DELETE 0
75#define OP_ASSIGN 1
76#define OP_APPLY 2
77
Guido van Rossum79f25d91997-04-29 20:08:16 +000078#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000079
80static struct memberlist code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000081 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
82 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000083 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000084 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000085 {"co_code", T_OBJECT, OFF(co_code), READONLY},
86 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
87 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000088 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000089 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000090 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000091 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
92 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000093 {NULL} /* Sentinel */
94};
95
Guido van Rossum79f25d91997-04-29 20:08:16 +000096static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +000097code_getattr(co, name)
Guido van Rossum79f25d91997-04-29 20:08:16 +000098 PyCodeObject *co;
Guido van Rossum3f5da241990-12-20 15:06:42 +000099 char *name;
100{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000101 return PyMember_Get((char *)co, code_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000102}
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000103
104static void
Guido van Rossum3f5da241990-12-20 15:06:42 +0000105code_dealloc(co)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000106 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000107{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000108 Py_XDECREF(co->co_code);
109 Py_XDECREF(co->co_consts);
110 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000111 Py_XDECREF(co->co_varnames);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000112 Py_XDECREF(co->co_filename);
113 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000114 Py_XDECREF(co->co_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000115 PyMem_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000116}
117
Guido van Rossum79f25d91997-04-29 20:08:16 +0000118static PyObject *
Guido van Rossum2dff9911992-09-03 20:50:59 +0000119code_repr(co)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000120 PyCodeObject *co;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000121{
122 char buf[500];
123 int lineno = -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000124 unsigned char *p;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000125 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000126 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000127
128 _PyCode_GETCODEPTR(co, &p);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000129 if (*p == SET_LINENO)
130 lineno = (p[1] & 0xff) | ((p[2] & 0xff) << 8);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000131 if (co->co_filename && PyString_Check(co->co_filename))
132 filename = PyString_AsString(co->co_filename);
133 if (co->co_name && PyString_Check(co->co_name))
134 name = PyString_AsString(co->co_name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000135 sprintf(buf, "<code object %.100s at %lx, file \"%.300s\", line %d>",
136 name, (long)co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000137 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000138}
139
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000140static int
141code_compare(co, cp)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000142 PyCodeObject *co, *cp;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000143{
144 int cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000145 cmp = co->co_argcount - cp->co_argcount;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000146 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000147 cmp = co->co_nlocals - cp->co_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000148 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000149 cmp = co->co_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000150 if (cmp) return cmp;
Guido van Rossumd076c731998-10-07 19:42:25 +0000151 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000152 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000153 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000154 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000155 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000156 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000157 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000158 return cmp;
159}
160
161static long
162code_hash(co)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000163 PyCodeObject *co;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000164{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000165 long h, h1, h2, h3, h4;
Guido van Rossumd076c731998-10-07 19:42:25 +0000166 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000167 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000168 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000169 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000170 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000171 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000172 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000173 if (h4 == -1) return -1;
174 h = h1 ^ h2 ^ h3 ^ h4 ^
175 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000176 if (h == -1) h = -2;
177 return h;
178}
179
Guido van Rossum79f25d91997-04-29 20:08:16 +0000180PyTypeObject PyCode_Type = {
181 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000182 0,
183 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000184 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000185 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000186 (destructor)code_dealloc, /*tp_dealloc*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000187 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000188 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000189 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000190 (cmpfunc)code_compare, /*tp_compare*/
191 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000192 0, /*tp_as_number*/
193 0, /*tp_as_sequence*/
194 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000195 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000196};
197
Guido van Rossum644a12b1997-04-09 19:24:53 +0000198#define NAME_CHARS \
199 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
200
Guido van Rossum79f25d91997-04-29 20:08:16 +0000201PyCodeObject *
202PyCode_New(argcount, nlocals, stacksize, flags,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000203 code, consts, names, varnames, filename, name,
204 firstlineno, lnotab)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000205 int argcount;
206 int nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000207 int stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000208 int flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000209 PyObject *code;
210 PyObject *consts;
211 PyObject *names;
212 PyObject *varnames;
213 PyObject *filename;
214 PyObject *name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000215 int firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000216 PyObject *lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000217{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000218 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000219 int i;
Guido van Rossumd076c731998-10-07 19:42:25 +0000220 PyBufferProcs *pb;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000221 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000222 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000223 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000224 consts == NULL || !PyTuple_Check(consts) ||
225 names == NULL || !PyTuple_Check(names) ||
226 varnames == NULL || !PyTuple_Check(varnames) ||
227 name == NULL || !PyString_Check(name) ||
228 filename == NULL || !PyString_Check(filename) ||
229 lnotab == NULL || !PyString_Check(lnotab)) {
230 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000231 return NULL;
232 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000233 pb = code->ob_type->tp_as_buffer;
234 if (pb == NULL ||
235 pb->bf_getreadbuffer == NULL ||
236 pb->bf_getsegcount == NULL ||
237 (*pb->bf_getsegcount)(code, NULL) != 1)
238 {
239 PyErr_BadInternalCall();
240 return NULL;
241 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000242 /* Make sure names and varnames are all strings, & intern them */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000243 for (i = PyTuple_Size(names); --i >= 0; ) {
244 PyObject *v = PyTuple_GetItem(names, i);
245 if (v == NULL || !PyString_Check(v)) {
246 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000247 return NULL;
248 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000249 PyString_InternInPlace(&PyTuple_GET_ITEM(names, i));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000250 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000251 for (i = PyTuple_Size(varnames); --i >= 0; ) {
252 PyObject *v = PyTuple_GetItem(varnames, i);
253 if (v == NULL || !PyString_Check(v)) {
254 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000255 return NULL;
256 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000257 PyString_InternInPlace(&PyTuple_GET_ITEM(varnames, i));
258 }
259 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000260 for (i = PyTuple_Size(consts); --i >= 0; ) {
261 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000262 char *p;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000263 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000264 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000265 p = PyString_AsString(v);
Guido van Rossum644a12b1997-04-09 19:24:53 +0000266 if ((int)strspn(p, NAME_CHARS)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000267 != PyString_Size(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000268 continue;
269 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000270 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000271 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000272 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000273 co->co_argcount = argcount;
274 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000275 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000276 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000277 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000278 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000279 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000280 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000281 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000282 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000283 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000284 co->co_varnames = varnames;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000285 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000286 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000287 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000288 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000289 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000290 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000291 co->co_lnotab = lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000292 }
293 return co;
294}
295
296
297/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000298
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000299struct compiling {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000300 PyObject *c_code; /* string */
301 PyObject *c_consts; /* list of objects */
302 PyObject *c_names; /* list of strings (names) */
303 PyObject *c_globals; /* dictionary (value=None) */
304 PyObject *c_locals; /* dictionary (value=localID) */
305 PyObject *c_varnames; /* list (inverse of c_locals) */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000306 int c_nlocals; /* index of next local */
307 int c_argcount; /* number of top-level arguments */
308 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000309 int c_nexti; /* index into c_code */
310 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000311 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000312 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000313 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000314 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000315 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000316 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000317 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000318 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000319 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000320 int c_stacklevel; /* Current stack level */
321 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000322 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000323 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000324 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000325#ifdef PRIVATE_NAME_MANGLING
326 char *c_private; /* for private name mangling */
327#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000328};
329
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000330
Guido van Rossum452a9831996-09-17 14:32:04 +0000331/* Error message including line number */
332
333static void
334com_error(c, exc, msg)
335 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000336 PyObject *exc;
Guido van Rossum452a9831996-09-17 14:32:04 +0000337 char *msg;
338{
339 int n = strlen(msg);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000340 PyObject *v;
Guido van Rossum452a9831996-09-17 14:32:04 +0000341 char buffer[30];
342 char *s;
Guido van Rossum635abd21997-01-06 22:56:52 +0000343 c->c_errors++;
Guido van Rossum452a9831996-09-17 14:32:04 +0000344 if (c->c_lineno <= 1) {
345 /* Unknown line number or single interactive command */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000346 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000347 return;
348 }
349 sprintf(buffer, " (line %d)", c->c_lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000350 v = PyString_FromStringAndSize((char *)NULL, n + strlen(buffer));
Guido van Rossum452a9831996-09-17 14:32:04 +0000351 if (v == NULL)
352 return; /* MemoryError, too bad */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000353 s = PyString_AS_STRING((PyStringObject *)v);
Guido van Rossum452a9831996-09-17 14:32:04 +0000354 strcpy(s, msg);
355 strcat(s, buffer);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000356 PyErr_SetObject(exc, v);
357 Py_DECREF(v);
Guido van Rossum452a9831996-09-17 14:32:04 +0000358}
359
360
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000361/* Interface to the block stack */
362
363static void
364block_push(c, type)
365 struct compiling *c;
366 int type;
367{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000368 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000369 com_error(c, PyExc_SystemError,
370 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000371 }
372 else {
373 c->c_block[c->c_nblocks++] = type;
374 }
375}
376
377static void
378block_pop(c, type)
379 struct compiling *c;
380 int type;
381{
382 if (c->c_nblocks > 0)
383 c->c_nblocks--;
384 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000385 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000386 }
387}
388
389
Guido van Rossum681d79a1995-07-18 14:51:37 +0000390/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000391
Guido van Rossum79f25d91997-04-29 20:08:16 +0000392static int com_init Py_PROTO((struct compiling *, char *));
393static void com_free Py_PROTO((struct compiling *));
394static void com_push Py_PROTO((struct compiling *, int));
395static void com_pop Py_PROTO((struct compiling *, int));
396static void com_done Py_PROTO((struct compiling *));
397static void com_node Py_PROTO((struct compiling *, struct _node *));
398static void com_factor Py_PROTO((struct compiling *, struct _node *));
399static void com_addbyte Py_PROTO((struct compiling *, int));
400static void com_addint Py_PROTO((struct compiling *, int));
401static void com_addoparg Py_PROTO((struct compiling *, int, int));
402static void com_addfwref Py_PROTO((struct compiling *, int, int *));
403static void com_backpatch Py_PROTO((struct compiling *, int));
404static int com_add Py_PROTO((struct compiling *, PyObject *, PyObject *));
405static int com_addconst Py_PROTO((struct compiling *, PyObject *));
406static int com_addname Py_PROTO((struct compiling *, PyObject *));
407static void com_addopname Py_PROTO((struct compiling *, int, node *));
408static void com_list Py_PROTO((struct compiling *, node *, int));
409static int com_argdefs Py_PROTO((struct compiling *, node *));
410static int com_newlocal Py_PROTO((struct compiling *, char *));
411static PyCodeObject *icompile Py_PROTO((struct _node *, struct compiling *));
412static PyCodeObject *jcompile Py_PROTO((struct _node *, char *,
413 struct compiling *));
414static PyObject *parsestrplus Py_PROTO((node *));
415static PyObject *parsestr Py_PROTO((char *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000416
417static int
Guido van Rossum590baa41993-11-30 13:40:46 +0000418com_init(c, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000419 struct compiling *c;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000420 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000421{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000422 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
423 1000)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000424 goto fail_3;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000425 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000426 goto fail_2;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000427 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000428 goto fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000429 if ((c->c_globals = PyDict_New()) == NULL)
Guido van Rossumc5e96291991-12-10 13:53:51 +0000430 goto fail_0;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000431 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000432 goto fail_00;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000433 if ((c->c_varnames = PyList_New(0)) == NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000434 goto fail_000;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000435 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
436 1000)) == NULL)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000437 goto fail_0000;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000438 c->c_nlocals = 0;
439 c->c_argcount = 0;
440 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000441 c->c_nexti = 0;
442 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000443 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000444 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000445 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000446 c->c_begin = 0;
447 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000448 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000449 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000450 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000451 c->c_stacklevel = 0;
452 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000453 c->c_firstlineno = 0;
454 c->c_last_addr = 0;
455 c->c_last_line = 0;
456 c-> c_lnotab_next = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000457 return 1;
458
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000459 fail_0000:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000460 Py_DECREF(c->c_lnotab);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000461 fail_000:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000462 Py_DECREF(c->c_locals);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000463 fail_00:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000464 Py_DECREF(c->c_globals);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000465 fail_0:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000466 Py_DECREF(c->c_names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000467 fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000468 Py_DECREF(c->c_consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000469 fail_2:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000470 Py_DECREF(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000471 fail_3:
472 return 0;
473}
474
475static void
476com_free(c)
477 struct compiling *c;
478{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000479 Py_XDECREF(c->c_code);
480 Py_XDECREF(c->c_consts);
481 Py_XDECREF(c->c_names);
482 Py_XDECREF(c->c_globals);
483 Py_XDECREF(c->c_locals);
484 Py_XDECREF(c->c_varnames);
485 Py_XDECREF(c->c_lnotab);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000486}
487
488static void
Guido van Rossum8b993a91997-01-17 21:04:03 +0000489com_push(c, n)
490 struct compiling *c;
491 int n;
492{
493 c->c_stacklevel += n;
494 if (c->c_stacklevel > c->c_maxstacklevel)
495 c->c_maxstacklevel = c->c_stacklevel;
496}
497
498static void
499com_pop(c, n)
500 struct compiling *c;
501 int n;
502{
503 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000504 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000505 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
506 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000507 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000508 c->c_stacklevel = 0;
509 }
510 else
511 c->c_stacklevel -= n;
512}
513
514static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000515com_done(c)
516 struct compiling *c;
517{
518 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000519 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000520 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000521 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000522}
523
524static void
525com_addbyte(c, byte)
526 struct compiling *c;
527 int byte;
528{
529 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000530 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000531 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000532 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000533 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000534 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000535 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000536 com_error(c, PyExc_SystemError,
537 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000538 }
539 if (c->c_code == NULL)
540 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000541 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000542 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000543 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000544 c->c_errors++;
545 return;
546 }
547 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000548 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000549}
550
551static void
552com_addint(c, x)
553 struct compiling *c;
554 int x;
555{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000556 com_addbyte(c, x & 0xff);
557 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000558}
559
560static void
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000561com_add_lnotab(c, addr, line)
562 struct compiling *c;
563 int addr;
564 int line;
565{
566 int size;
567 char *p;
568 if (c->c_lnotab == NULL)
569 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000570 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000571 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000572 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000573 c->c_errors++;
574 return;
575 }
576 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000577 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000578 *p++ = addr;
579 *p++ = line;
580 c->c_lnotab_next += 2;
581}
582
583static void
584com_set_lineno(c, lineno)
585 struct compiling *c;
586 int lineno;
587{
588 c->c_lineno = lineno;
589 if (c->c_firstlineno == 0) {
590 c->c_firstlineno = c->c_last_line = lineno;
591 }
592 else {
593 int incr_addr = c->c_nexti - c->c_last_addr;
594 int incr_line = lineno - c->c_last_line;
595 while (incr_addr > 0 || incr_line > 0) {
596 int trunc_addr = incr_addr;
597 int trunc_line = incr_line;
598 if (trunc_addr > 255)
599 trunc_addr = 255;
600 if (trunc_line > 255)
601 trunc_line = 255;
602 com_add_lnotab(c, trunc_addr, trunc_line);
603 incr_addr -= trunc_addr;
604 incr_line -= trunc_line;
605 }
606 c->c_last_addr = c->c_nexti;
607 c->c_last_line = lineno;
608 }
609}
610
611static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000612com_addoparg(c, op, arg)
613 struct compiling *c;
614 int op;
615 int arg;
616{
Guido van Rossum8e793d91997-03-03 19:13:14 +0000617 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000618 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000619 if (Py_OptimizeFlag)
620 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000621 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000622 com_addbyte(c, op);
623 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000624}
625
626static void
627com_addfwref(c, op, p_anchor)
628 struct compiling *c;
629 int op;
630 int *p_anchor;
631{
632 /* Compile a forward reference for backpatching */
633 int here;
634 int anchor;
635 com_addbyte(c, op);
636 here = c->c_nexti;
637 anchor = *p_anchor;
638 *p_anchor = here;
639 com_addint(c, anchor == 0 ? 0 : here - anchor);
640}
641
642static void
643com_backpatch(c, anchor)
644 struct compiling *c;
645 int anchor; /* Must be nonzero */
646{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000647 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000648 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000649 int dist;
650 int prev;
651 for (;;) {
652 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000653 prev = code[anchor] + (code[anchor+1] << 8);
654 dist = target - (anchor+2);
655 code[anchor] = dist & 0xff;
656 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000657 if (!prev)
658 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000659 anchor -= prev;
660 }
661}
662
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000663/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000664
665static int
666com_add(c, list, v)
667 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000668 PyObject *list;
669 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000670{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000671 int n = PyList_Size(list);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000672 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +0000673 /* XXX This is quadratic in the number of names per compilation unit.
674 XXX Should use a dictionary. */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000675 for (i = n; --i >= 0; ) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000676 PyObject *w = PyList_GetItem(list, i);
677 if (v->ob_type == w->ob_type && PyObject_Compare(v, w) == 0)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000678 return i;
679 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000680 /* Check for error from PyObject_Compare */
681 if (PyErr_Occurred() || PyList_Append(list, v) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000682 c->c_errors++;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000683 return n;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000684}
685
686static int
687com_addconst(c, v)
688 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000689 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000690{
691 return com_add(c, c->c_consts, v);
692}
693
694static int
695com_addname(c, v)
696 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000697 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000698{
699 return com_add(c, c->c_names, v);
700}
701
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000702#ifdef PRIVATE_NAME_MANGLING
703static int
704com_mangle(c, name, buffer, maxlen)
705 struct compiling *c;
706 char *name;
707 char *buffer;
708 int maxlen;
709{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000710 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000711 This is independent from how the name is used. */
712 char *p;
713 int nlen, plen;
714 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000715 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000716 return 0; /* Don't mangle __extremely_long_names */
717 if (name[nlen-1] == '_' && name[nlen-2] == '_')
718 return 0; /* Don't mangle __whatever__ */
719 p = c->c_private;
720 /* Strip leading underscores from class name */
721 while (*p == '_')
722 p++;
723 if (*p == '\0')
724 return 0; /* Don't mangle if class is just underscores */
725 plen = strlen(p);
726 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000727 plen = maxlen-nlen-2; /* Truncate class name if too long */
728 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000729 buffer[0] = '_';
730 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000731 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000732 /* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
733 return 1;
734}
735#endif
736
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000737static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000738com_addopnamestr(c, op, name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000739 struct compiling *c;
740 int op;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000741 char *name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000742{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000743 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000744 int i;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000745#ifdef PRIVATE_NAME_MANGLING
746 char buffer[256];
747 if (name != NULL && name[0] == '_' && name[1] == '_' &&
748 c->c_private != NULL &&
749 com_mangle(c, name, buffer, (int)sizeof(buffer)))
750 name = buffer;
751#endif
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000752 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000753 c->c_errors++;
754 i = 255;
755 }
756 else {
757 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000758 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000759 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000760 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
761 switch (op) {
762 case LOAD_NAME:
763 case STORE_NAME:
764 case DELETE_NAME:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000765 if (PyDict_GetItemString(c->c_globals, name) != NULL) {
Guido van Rossumc5e96291991-12-10 13:53:51 +0000766 switch (op) {
767 case LOAD_NAME: op = LOAD_GLOBAL; break;
768 case STORE_NAME: op = STORE_GLOBAL; break;
769 case DELETE_NAME: op = DELETE_GLOBAL; break;
770 }
771 }
772 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000773 com_addoparg(c, op, i);
774}
775
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000776static void
777com_addopname(c, op, n)
778 struct compiling *c;
779 int op;
780 node *n;
781{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000782 char *name;
783 char buffer[1000];
784 /* XXX it is possible to write this code without the 1000
785 chars on the total length of dotted names, I just can't be
786 bothered right now */
787 if (TYPE(n) == STAR)
788 name = "*";
789 else if (TYPE(n) == dotted_name) {
790 char *p = buffer;
791 int i;
792 name = buffer;
793 for (i = 0; i < NCH(n); i += 2) {
794 char *s = STR(CHILD(n, i));
795 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000796 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000797 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +0000798 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000799 break;
800 }
801 if (p != buffer)
802 *p++ = '.';
803 strcpy(p, s);
804 p = strchr(p, '\0');
805 }
806 }
807 else {
808 REQ(n, NAME);
809 name = STR(n);
810 }
811 com_addopnamestr(c, op, name);
812}
813
Guido van Rossum79f25d91997-04-29 20:08:16 +0000814static PyObject *
Guido van Rossum452a9831996-09-17 14:32:04 +0000815parsenumber(co, s)
816 struct compiling *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000817 char *s;
818{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000819 extern long PyOS_strtol Py_PROTO((const char *, char **, int));
820 extern unsigned long PyOS_strtoul Py_PROTO((const char *,
821 char **, int));
822 extern double atof Py_PROTO((const char *));
Guido van Rossumc5e96291991-12-10 13:53:51 +0000823 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000824 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000825 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +0000826#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +0000827 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +0000828 int imflag;
829#endif
830
Guido van Rossum282914b1991-04-04 10:42:56 +0000831 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000832 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +0000833#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +0000834 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +0000835#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000836 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000837 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000838 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000839 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000840 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000841 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000842 if (*end == '\0') {
843 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000844 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000845 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000846 return NULL;
847 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000848 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000849 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000850 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +0000851#ifndef WITHOUT_COMPLEX
852 if (imflag) {
853 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000854 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +0000855 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000856 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000857 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +0000858 }
Guido van Rossumac1fc951997-10-08 15:23:55 +0000859 else
Guido van Rossum50564e81996-01-12 01:13:16 +0000860#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +0000861 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000862 PyFPE_START_PROTECT("atof", return 0)
863 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000864 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000865 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000866 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000867}
868
Guido van Rossum79f25d91997-04-29 20:08:16 +0000869static PyObject *
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000870parsestr(s)
871 char *s;
872{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000873 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000874 int len;
875 char *buf;
876 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000877 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000878 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +0000879 int first = *s;
880 int quote = first;
881 if (isalpha(quote) || quote == '_')
882 quote = *++s;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000883 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000884 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000885 return NULL;
886 }
887 s++;
888 len = strlen(s);
Guido van Rossum8054fad1993-10-26 15:19:44 +0000889 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000890 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000891 return NULL;
892 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000893 if (len >= 4 && s[0] == quote && s[1] == quote) {
894 s += 2;
895 len -= 2;
896 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000897 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000898 return NULL;
899 }
900 }
Guido van Rossum5f5e8171997-04-06 03:41:40 +0000901 if (first != quote || strchr(s, '\\') == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000902 return PyString_FromStringAndSize(s, len);
903 v = PyString_FromStringAndSize((char *)NULL, len);
904 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000905 end = s + len;
906 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000907 if (*s != '\\') {
908 *p++ = *s++;
909 continue;
910 }
911 s++;
912 switch (*s++) {
913 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000914 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000915 case '\\': *p++ = '\\'; break;
916 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000917 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000918 case 'b': *p++ = '\b'; break;
919 case 'f': *p++ = '\014'; break; /* FF */
920 case 't': *p++ = '\t'; break;
921 case 'n': *p++ = '\n'; break;
922 case 'r': *p++ = '\r'; break;
923 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000924 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
925 case '0': case '1': case '2': case '3':
926 case '4': case '5': case '6': case '7':
927 c = s[-1] - '0';
928 if ('0' <= *s && *s <= '7') {
929 c = (c<<3) + *s++ - '0';
930 if ('0' <= *s && *s <= '7')
931 c = (c<<3) + *s++ - '0';
932 }
933 *p++ = c;
934 break;
935 case 'x':
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000936 if (isxdigit(Py_CHARMASK(*s))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000937 unsigned int x = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000938 do {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000939 c = Py_CHARMASK(*s);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000940 s++;
Guido van Rossumed1100f1997-10-20 23:24:07 +0000941 x = (x<<4) & ~0xF;
942 if (isdigit(c))
943 x += c - '0';
944 else if (islower(c))
945 x += 10 + c - 'a';
946 else
947 x += 10 + c - 'A';
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000948 } while (isxdigit(Py_CHARMASK(*s)));
Guido van Rossumed1100f1997-10-20 23:24:07 +0000949 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000950 break;
951 }
952 /* FALLTHROUGH */
953 default: *p++ = '\\'; *p++ = s[-1]; break;
954 }
955 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000956 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000957 return v;
958}
959
Guido van Rossum79f25d91997-04-29 20:08:16 +0000960static PyObject *
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000961parsestrplus(n)
962 node *n;
963{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000964 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000965 int i;
966 REQ(CHILD(n, 0), STRING);
967 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
968 /* String literal concatenation */
969 for (i = 1; i < NCH(n) && v != NULL; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000970 PyString_ConcatAndDel(&v, parsestr(STR(CHILD(n, i))));
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000971 }
972 }
973 return v;
974}
975
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000976static void
977com_list_constructor(c, n)
978 struct compiling *c;
979 node *n;
980{
981 int len;
982 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000983 if (TYPE(n) != testlist)
984 REQ(n, exprlist);
985 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
986 len = (NCH(n) + 1) / 2;
987 for (i = 0; i < NCH(n); i += 2)
988 com_node(c, CHILD(n, i));
989 com_addoparg(c, BUILD_LIST, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000990 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000991}
992
993static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000994com_dictmaker(c, n)
995 struct compiling *c;
996 node *n;
997{
998 int i;
999 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1000 for (i = 0; i+2 < NCH(n); i += 4) {
1001 /* We must arrange things just right for STORE_SUBSCR.
1002 It wants the stack to look like (value) (dict) (key) */
1003 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001004 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001005 com_node(c, CHILD(n, i+2)); /* value */
1006 com_addbyte(c, ROT_TWO);
1007 com_node(c, CHILD(n, i)); /* key */
1008 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001009 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001010 }
1011}
1012
1013static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001014com_atom(c, n)
1015 struct compiling *c;
1016 node *n;
1017{
1018 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001019 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001020 int i;
1021 REQ(n, atom);
1022 ch = CHILD(n, 0);
1023 switch (TYPE(ch)) {
1024 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001025 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001026 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001027 com_push(c, 1);
1028 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001029 else
1030 com_node(c, CHILD(n, 1));
1031 break;
1032 case LSQB:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001033 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001034 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001035 com_push(c, 1);
1036 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001037 else
1038 com_list_constructor(c, CHILD(n, 1));
1039 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001040 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001041 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001042 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001043 if (TYPE(CHILD(n, 1)) != RBRACE)
1044 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001045 break;
1046 case BACKQUOTE:
1047 com_node(c, CHILD(n, 1));
1048 com_addbyte(c, UNARY_CONVERT);
1049 break;
1050 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001051 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001052 i = 255;
1053 }
1054 else {
1055 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001056 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001057 }
1058 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001059 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001060 break;
1061 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001062 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001063 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001064 c->c_errors++;
1065 i = 255;
1066 }
1067 else {
1068 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001069 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001070 }
1071 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001072 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001073 break;
1074 case NAME:
1075 com_addopname(c, LOAD_NAME, ch);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001076 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001077 break;
1078 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001079 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001080 com_error(c, PyExc_SystemError,
1081 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001082 }
1083}
1084
1085static void
1086com_slice(c, n, op)
1087 struct compiling *c;
1088 node *n;
1089 int op;
1090{
1091 if (NCH(n) == 1) {
1092 com_addbyte(c, op);
1093 }
1094 else if (NCH(n) == 2) {
1095 if (TYPE(CHILD(n, 0)) != COLON) {
1096 com_node(c, CHILD(n, 0));
1097 com_addbyte(c, op+1);
1098 }
1099 else {
1100 com_node(c, CHILD(n, 1));
1101 com_addbyte(c, op+2);
1102 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001103 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001104 }
1105 else {
1106 com_node(c, CHILD(n, 0));
1107 com_node(c, CHILD(n, 2));
1108 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001109 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001110 }
1111}
1112
Guido van Rossum635abd21997-01-06 22:56:52 +00001113static void
1114com_argument(c, n, pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001115 struct compiling *c;
1116 node *n; /* argument */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001117 PyObject **pkeywords;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001118{
1119 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001120 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001121 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001122 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001123 com_error(c, PyExc_SyntaxError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001124 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001125 }
1126 else {
1127 com_node(c, CHILD(n, 0));
1128 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001129 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001130 }
1131 m = n;
1132 do {
1133 m = CHILD(m, 0);
1134 } while (NCH(m) == 1);
1135 if (TYPE(m) != NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001136 com_error(c, PyExc_SyntaxError,
1137 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001138 }
1139 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001140 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001141 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001142 *pkeywords = PyDict_New();
Guido van Rossum635abd21997-01-06 22:56:52 +00001143 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001144 c->c_errors++;
1145 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001146 if (PyDict_GetItem(*pkeywords, v) != NULL)
1147 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001148 "duplicate keyword argument");
1149 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001150 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001151 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001152 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001153 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001154 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001155 }
1156 }
1157 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001158}
1159
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001160static void
1161com_call_function(c, n)
1162 struct compiling *c;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001163 node *n; /* EITHER arglist OR ')' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001164{
1165 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001166 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001167 }
1168 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001169 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001170 int i, na, nk;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001171 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001172 na = 0;
1173 nk = 0;
1174 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001175 com_argument(c, CHILD(n, i), &keywords);
1176 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001177 na++;
1178 else
1179 nk++;
1180 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001181 Py_XDECREF(keywords);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001182 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001183 com_error(c, PyExc_SyntaxError,
1184 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001185 }
1186 com_addoparg(c, CALL_FUNCTION, na | (nk << 8));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001187 com_pop(c, na + 2*nk);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001188 }
1189}
1190
1191static void
1192com_select_member(c, n)
1193 struct compiling *c;
1194 node *n;
1195{
1196 com_addopname(c, LOAD_ATTR, n);
1197}
1198
1199static void
Guido van Rossum8861b741996-07-30 16:49:37 +00001200com_sliceobj(c, n)
1201 struct compiling *c;
1202 node *n;
1203{
1204 int i=0;
1205 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001206 node *ch;
1207
1208 /* first argument */
1209 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001210 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001211 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001212 i++;
1213 }
1214 else {
1215 com_node(c, CHILD(n,i));
1216 i++;
1217 REQ(CHILD(n,i),COLON);
1218 i++;
1219 }
1220 /* second argument */
1221 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1222 com_node(c, CHILD(n,i));
1223 i++;
1224 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001225 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001226 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001227 com_push(c, 1);
1228 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001229 /* remaining arguments */
1230 for (; i < NCH(n); i++) {
1231 ns++;
1232 ch=CHILD(n,i);
1233 REQ(ch, sliceop);
1234 if (NCH(ch) == 1) {
1235 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001236 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001237 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001238 }
1239 else
1240 com_node(c, CHILD(ch,1));
1241 }
1242 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001243 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001244}
1245
1246static void
1247com_subscript(c, n)
1248 struct compiling *c;
1249 node *n;
1250{
1251 node *ch;
1252 REQ(n, subscript);
1253 ch = CHILD(n,0);
1254 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001255 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001256 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001257 com_push(c, 1);
1258 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001259 else {
1260 /* check for slice */
1261 if ((TYPE(ch) == COLON || NCH(n) > 1))
1262 com_sliceobj(c, n);
1263 else {
1264 REQ(ch, test);
1265 com_node(c, ch);
1266 }
1267 }
1268}
1269
1270static void
1271com_subscriptlist(c, n, assigning)
1272 struct compiling *c;
1273 node *n;
1274 int assigning;
1275{
1276 int i, op;
1277 REQ(n, subscriptlist);
1278 /* Check to make backward compatible slice behavior for '[i:j]' */
1279 if (NCH(n) == 1) {
1280 node *sub = CHILD(n, 0); /* subscript */
1281 /* Make it is a simple slice.
Guido van Rossum8b993a91997-01-17 21:04:03 +00001282 Should have exactly one colon. */
Guido van Rossum8861b741996-07-30 16:49:37 +00001283 if ((TYPE(CHILD(sub, 0)) == COLON
1284 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
Guido van Rossum8b993a91997-01-17 21:04:03 +00001285 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1286 {
Guido van Rossum8861b741996-07-30 16:49:37 +00001287 if (assigning == OP_APPLY)
1288 op = SLICE;
1289 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001290 op = ((assigning == OP_ASSIGN) ?
1291 STORE_SLICE : DELETE_SLICE);
Guido van Rossum8861b741996-07-30 16:49:37 +00001292 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001293 if (op == STORE_SLICE)
1294 com_pop(c, 2);
1295 else if (op == DELETE_SLICE)
1296 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001297 return;
1298 }
1299 }
1300 /* Else normal subscriptlist. Compile each subscript. */
1301 for (i = 0; i < NCH(n); i += 2)
1302 com_subscript(c, CHILD(n, i));
1303 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001304 if (NCH(n) > 1) {
1305 i = (NCH(n)+1) / 2;
1306 com_addoparg(c, BUILD_TUPLE, i);
1307 com_pop(c, i-1);
1308 }
1309 if (assigning == OP_APPLY) {
Guido van Rossum8861b741996-07-30 16:49:37 +00001310 op = BINARY_SUBSCR;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001311 i = 1;
1312 }
1313 else if (assigning == OP_ASSIGN) {
1314 op = STORE_SUBSCR;
1315 i = 3;
1316 }
1317 else {
1318 op = DELETE_SUBSCR;
1319 i = 2;
1320 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001321 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001322 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001323}
1324
1325static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001326com_apply_trailer(c, n)
1327 struct compiling *c;
1328 node *n;
1329{
1330 REQ(n, trailer);
1331 switch (TYPE(CHILD(n, 0))) {
1332 case LPAR:
1333 com_call_function(c, CHILD(n, 1));
1334 break;
1335 case DOT:
1336 com_select_member(c, CHILD(n, 1));
1337 break;
1338 case LSQB:
Guido van Rossum8861b741996-07-30 16:49:37 +00001339 com_subscriptlist(c, CHILD(n, 1), OP_APPLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001340 break;
1341 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001342 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001343 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001344 }
1345}
1346
1347static void
Guido van Rossum50564e81996-01-12 01:13:16 +00001348com_power(c, n)
1349 struct compiling *c;
1350 node *n;
1351{
1352 int i;
1353 REQ(n, power);
1354 com_atom(c, CHILD(n, 0));
1355 for (i = 1; i < NCH(n); i++) {
1356 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1357 com_factor(c, CHILD(n, i+1));
1358 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001359 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001360 break;
1361 }
1362 else
1363 com_apply_trailer(c, CHILD(n, i));
1364 }
1365}
1366
1367static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001368com_factor(c, n)
1369 struct compiling *c;
1370 node *n;
1371{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001372 REQ(n, factor);
1373 if (TYPE(CHILD(n, 0)) == PLUS) {
1374 com_factor(c, CHILD(n, 1));
1375 com_addbyte(c, UNARY_POSITIVE);
1376 }
1377 else if (TYPE(CHILD(n, 0)) == MINUS) {
1378 com_factor(c, CHILD(n, 1));
1379 com_addbyte(c, UNARY_NEGATIVE);
1380 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001381 else if (TYPE(CHILD(n, 0)) == TILDE) {
1382 com_factor(c, CHILD(n, 1));
1383 com_addbyte(c, UNARY_INVERT);
1384 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001385 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001386 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001387 }
1388}
1389
1390static void
1391com_term(c, n)
1392 struct compiling *c;
1393 node *n;
1394{
1395 int i;
1396 int op;
1397 REQ(n, term);
1398 com_factor(c, CHILD(n, 0));
1399 for (i = 2; i < NCH(n); i += 2) {
1400 com_factor(c, CHILD(n, i));
1401 switch (TYPE(CHILD(n, i-1))) {
1402 case STAR:
1403 op = BINARY_MULTIPLY;
1404 break;
1405 case SLASH:
1406 op = BINARY_DIVIDE;
1407 break;
1408 case PERCENT:
1409 op = BINARY_MODULO;
1410 break;
1411 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001412 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001413 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001414 op = 255;
1415 }
1416 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001417 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001418 }
1419}
1420
1421static void
1422com_arith_expr(c, n)
1423 struct compiling *c;
1424 node *n;
1425{
1426 int i;
1427 int op;
1428 REQ(n, arith_expr);
1429 com_term(c, CHILD(n, 0));
1430 for (i = 2; i < NCH(n); i += 2) {
1431 com_term(c, CHILD(n, i));
1432 switch (TYPE(CHILD(n, i-1))) {
1433 case PLUS:
1434 op = BINARY_ADD;
1435 break;
1436 case MINUS:
1437 op = BINARY_SUBTRACT;
1438 break;
1439 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001440 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001441 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001442 op = 255;
1443 }
1444 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001445 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001446 }
1447}
1448
1449static void
1450com_shift_expr(c, n)
1451 struct compiling *c;
1452 node *n;
1453{
1454 int i;
1455 int op;
1456 REQ(n, shift_expr);
1457 com_arith_expr(c, CHILD(n, 0));
1458 for (i = 2; i < NCH(n); i += 2) {
1459 com_arith_expr(c, CHILD(n, i));
1460 switch (TYPE(CHILD(n, i-1))) {
1461 case LEFTSHIFT:
1462 op = BINARY_LSHIFT;
1463 break;
1464 case RIGHTSHIFT:
1465 op = BINARY_RSHIFT;
1466 break;
1467 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001468 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001469 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001470 op = 255;
1471 }
1472 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001473 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001474 }
1475}
1476
1477static void
1478com_and_expr(c, n)
1479 struct compiling *c;
1480 node *n;
1481{
1482 int i;
1483 int op;
1484 REQ(n, and_expr);
1485 com_shift_expr(c, CHILD(n, 0));
1486 for (i = 2; i < NCH(n); i += 2) {
1487 com_shift_expr(c, CHILD(n, i));
1488 if (TYPE(CHILD(n, i-1)) == AMPER) {
1489 op = BINARY_AND;
1490 }
1491 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001492 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001493 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001494 op = 255;
1495 }
1496 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001497 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001498 }
1499}
1500
1501static void
1502com_xor_expr(c, n)
1503 struct compiling *c;
1504 node *n;
1505{
1506 int i;
1507 int op;
1508 REQ(n, xor_expr);
1509 com_and_expr(c, CHILD(n, 0));
1510 for (i = 2; i < NCH(n); i += 2) {
1511 com_and_expr(c, CHILD(n, i));
1512 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1513 op = BINARY_XOR;
1514 }
1515 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001516 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001517 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001518 op = 255;
1519 }
1520 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001521 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001522 }
1523}
1524
1525static void
1526com_expr(c, n)
1527 struct compiling *c;
1528 node *n;
1529{
1530 int i;
1531 int op;
1532 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001533 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001534 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001535 com_xor_expr(c, CHILD(n, i));
1536 if (TYPE(CHILD(n, i-1)) == VBAR) {
1537 op = BINARY_OR;
1538 }
1539 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001540 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001541 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001542 op = 255;
1543 }
1544 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001545 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001546 }
1547}
1548
1549static enum cmp_op
1550cmp_type(n)
1551 node *n;
1552{
1553 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001554 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001555 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1556 if (NCH(n) == 1) {
1557 n = CHILD(n, 0);
1558 switch (TYPE(n)) {
1559 case LESS: return LT;
1560 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001561 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001562 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001563 case LESSEQUAL: return LE;
1564 case GREATEREQUAL: return GE;
1565 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001566 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1567 if (strcmp(STR(n), "is") == 0) return IS;
1568 }
1569 }
1570 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001571 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001572 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1573 return NOT_IN;
1574 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1575 return IS_NOT;
1576 }
1577 }
1578 return BAD;
1579}
1580
1581static void
1582com_comparison(c, n)
1583 struct compiling *c;
1584 node *n;
1585{
1586 int i;
1587 enum cmp_op op;
1588 int anchor;
1589 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1590 com_expr(c, CHILD(n, 0));
1591 if (NCH(n) == 1)
1592 return;
1593
1594 /****************************************************************
1595 The following code is generated for all but the last
1596 comparison in a chain:
1597
1598 label: on stack: opcode: jump to:
1599
1600 a <code to load b>
1601 a, b DUP_TOP
1602 a, b, b ROT_THREE
1603 b, a, b COMPARE_OP
1604 b, 0-or-1 JUMP_IF_FALSE L1
1605 b, 1 POP_TOP
1606 b
1607
1608 We are now ready to repeat this sequence for the next
1609 comparison in the chain.
1610
1611 For the last we generate:
1612
1613 b <code to load c>
1614 b, c COMPARE_OP
1615 0-or-1
1616
1617 If there were any jumps to L1 (i.e., there was more than one
1618 comparison), we generate:
1619
1620 0-or-1 JUMP_FORWARD L2
1621 L1: b, 0 ROT_TWO
1622 0, b POP_TOP
1623 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00001624 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001625 ****************************************************************/
1626
1627 anchor = 0;
1628
1629 for (i = 2; i < NCH(n); i += 2) {
1630 com_expr(c, CHILD(n, i));
1631 if (i+2 < NCH(n)) {
1632 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001633 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001634 com_addbyte(c, ROT_THREE);
1635 }
1636 op = cmp_type(CHILD(n, i-1));
1637 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001638 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001639 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001640 }
1641 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001642 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001643 if (i+2 < NCH(n)) {
1644 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1645 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001646 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001647 }
1648 }
1649
1650 if (anchor) {
1651 int anchor2 = 0;
1652 com_addfwref(c, JUMP_FORWARD, &anchor2);
1653 com_backpatch(c, anchor);
1654 com_addbyte(c, ROT_TWO);
1655 com_addbyte(c, POP_TOP);
1656 com_backpatch(c, anchor2);
1657 }
1658}
1659
1660static void
1661com_not_test(c, n)
1662 struct compiling *c;
1663 node *n;
1664{
1665 REQ(n, not_test); /* 'not' not_test | comparison */
1666 if (NCH(n) == 1) {
1667 com_comparison(c, CHILD(n, 0));
1668 }
1669 else {
1670 com_not_test(c, CHILD(n, 1));
1671 com_addbyte(c, UNARY_NOT);
1672 }
1673}
1674
1675static void
1676com_and_test(c, n)
1677 struct compiling *c;
1678 node *n;
1679{
1680 int i;
1681 int anchor;
1682 REQ(n, and_test); /* not_test ('and' not_test)* */
1683 anchor = 0;
1684 i = 0;
1685 for (;;) {
1686 com_not_test(c, CHILD(n, i));
1687 if ((i += 2) >= NCH(n))
1688 break;
1689 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1690 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001691 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001692 }
1693 if (anchor)
1694 com_backpatch(c, anchor);
1695}
1696
1697static void
1698com_test(c, n)
1699 struct compiling *c;
1700 node *n;
1701{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001702 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00001703 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001704 PyObject *v;
Guido van Rossum57531fe1993-11-30 14:57:42 +00001705 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001706 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001707 v = (PyObject *) icompile(CHILD(n, 0), c);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001708 if (v == NULL) {
1709 c->c_errors++;
1710 i = 255;
1711 }
1712 else {
1713 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001714 Py_DECREF(v);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001715 }
1716 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001717 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001718 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001719 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001720 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001721 else {
1722 int anchor = 0;
1723 int i = 0;
1724 for (;;) {
1725 com_and_test(c, CHILD(n, i));
1726 if ((i += 2) >= NCH(n))
1727 break;
1728 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1729 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001730 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001731 }
1732 if (anchor)
1733 com_backpatch(c, anchor);
1734 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001735}
1736
1737static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001738com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001739 struct compiling *c;
1740 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001741 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001742{
1743 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001744 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001745 com_node(c, CHILD(n, 0));
1746 }
1747 else {
1748 int i;
1749 int len;
1750 len = (NCH(n) + 1) / 2;
1751 for (i = 0; i < NCH(n); i += 2)
1752 com_node(c, CHILD(n, i));
1753 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001754 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001755 }
1756}
1757
1758
1759/* Begin of assignment compilation */
1760
Guido van Rossum79f25d91997-04-29 20:08:16 +00001761static void com_assign_name Py_PROTO((struct compiling *, node *, int));
1762static void com_assign Py_PROTO((struct compiling *, node *, int));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001763
1764static void
1765com_assign_attr(c, n, assigning)
1766 struct compiling *c;
1767 node *n;
1768 int assigning;
1769{
1770 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001771 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001772}
1773
1774static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001775com_assign_trailer(c, n, assigning)
1776 struct compiling *c;
1777 node *n;
1778 int assigning;
1779{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001780 REQ(n, trailer);
1781 switch (TYPE(CHILD(n, 0))) {
1782 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001783 com_error(c, PyExc_SyntaxError,
1784 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001785 break;
1786 case DOT: /* '.' NAME */
1787 com_assign_attr(c, CHILD(n, 1), assigning);
1788 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001789 case LSQB: /* '[' subscriptlist ']' */
1790 com_subscriptlist(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001791 break;
1792 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001793 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001794 }
1795}
1796
1797static void
1798com_assign_tuple(c, n, assigning)
1799 struct compiling *c;
1800 node *n;
1801 int assigning;
1802{
1803 int i;
1804 if (TYPE(n) != testlist)
1805 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001806 if (assigning) {
1807 i = (NCH(n)+1)/2;
1808 com_addoparg(c, UNPACK_TUPLE, i);
1809 com_push(c, i-1);
1810 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001811 for (i = 0; i < NCH(n); i += 2)
1812 com_assign(c, CHILD(n, i), assigning);
1813}
1814
1815static void
1816com_assign_list(c, n, assigning)
1817 struct compiling *c;
1818 node *n;
1819 int assigning;
1820{
1821 int i;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001822 if (assigning) {
1823 i = (NCH(n)+1)/2;
1824 com_addoparg(c, UNPACK_LIST, i);
1825 com_push(c, i-1);
1826 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001827 for (i = 0; i < NCH(n); i += 2)
1828 com_assign(c, CHILD(n, i), assigning);
1829}
1830
1831static void
1832com_assign_name(c, n, assigning)
1833 struct compiling *c;
1834 node *n;
1835 int assigning;
1836{
1837 REQ(n, NAME);
1838 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001839 if (assigning)
1840 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001841}
1842
1843static void
1844com_assign(c, n, assigning)
1845 struct compiling *c;
1846 node *n;
1847 int assigning;
1848{
1849 /* Loop to avoid trivial recursion */
1850 for (;;) {
1851 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001852
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001853 case exprlist:
1854 case testlist:
1855 if (NCH(n) > 1) {
1856 com_assign_tuple(c, n, assigning);
1857 return;
1858 }
1859 n = CHILD(n, 0);
1860 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001861
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001862 case test:
1863 case and_test:
1864 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001865 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001866 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001867 case xor_expr:
1868 case and_expr:
1869 case shift_expr:
1870 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001871 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00001872 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001873 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001874 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001875 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001876 return;
1877 }
1878 n = CHILD(n, 0);
1879 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001880
Guido van Rossum50564e81996-01-12 01:13:16 +00001881 case power: /* atom trailer* ('**' power)* */
1882/* ('+'|'-'|'~') factor | atom trailer* */
1883 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001884 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001885 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001886 return;
1887 }
Guido van Rossum50564e81996-01-12 01:13:16 +00001888 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001889 int i;
1890 com_node(c, CHILD(n, 0));
1891 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00001892 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001893 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001894 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00001895 return;
1896 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001897 com_apply_trailer(c, CHILD(n, i));
1898 } /* NB i is still alive */
1899 com_assign_trailer(c,
1900 CHILD(n, i), assigning);
1901 return;
1902 }
1903 n = CHILD(n, 0);
1904 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001905
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001906 case atom:
1907 switch (TYPE(CHILD(n, 0))) {
1908 case LPAR:
1909 n = CHILD(n, 1);
1910 if (TYPE(n) == RPAR) {
1911 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001912 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001913 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001914 return;
1915 }
1916 break;
1917 case LSQB:
1918 n = CHILD(n, 1);
1919 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001920 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001921 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001922 return;
1923 }
1924 com_assign_list(c, n, assigning);
1925 return;
1926 case NAME:
1927 com_assign_name(c, CHILD(n, 0), assigning);
1928 return;
1929 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001930 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001931 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001932 return;
1933 }
1934 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001935
1936 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001937 com_error(c, PyExc_SyntaxError,
1938 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001939 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001940
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001941 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001942 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001943 com_error(c, PyExc_SystemError,
1944 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001945 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001946
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001947 }
1948 }
1949}
Guido van Rossum7c531111997-03-11 18:42:21 +00001950
Guido van Rossum79f25d91997-04-29 20:08:16 +00001951/* Forward */ static node *get_rawdocstring Py_PROTO((node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001952
1953static void
1954com_expr_stmt(c, n)
1955 struct compiling *c;
1956 node *n;
1957{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001958 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001959 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001960 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001961 return;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001962 com_node(c, CHILD(n, NCH(n)-1));
1963 if (NCH(n) == 1) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001964 if (c->c_interactive)
1965 com_addbyte(c, PRINT_EXPR);
1966 else
1967 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001968 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001969 }
1970 else {
1971 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001972 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001973 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001974 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001975 com_push(c, 1);
1976 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001977 com_assign(c, CHILD(n, i), OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001978 }
1979 }
1980}
1981
1982static void
Guido van Rossum228d7f31997-04-02 05:24:36 +00001983com_assert_stmt(c, n)
1984 struct compiling *c;
1985 node *n;
1986{
1987 int a = 0, b = 0;
1988 int i;
1989 REQ(n, assert_stmt); /* 'assert' test [',' test] */
1990 /* Generate code like for
1991
1992 if __debug__:
1993 if not <test>:
1994 raise AssertionError [, <message>]
1995
1996 where <message> is the second test, if present.
1997 */
1998 if (Py_OptimizeFlag)
1999 return;
2000 com_addopnamestr(c, LOAD_GLOBAL, "__debug__");
2001 com_push(c, 1);
2002 com_addfwref(c, JUMP_IF_FALSE, &a);
2003 com_addbyte(c, POP_TOP);
2004 com_pop(c, 1);
2005 com_node(c, CHILD(n, 1));
2006 com_addfwref(c, JUMP_IF_TRUE, &b);
2007 com_addbyte(c, POP_TOP);
2008 com_pop(c, 1);
2009 /* Raise that exception! */
2010 com_addopnamestr(c, LOAD_GLOBAL, "AssertionError");
2011 com_push(c, 1);
2012 i = NCH(n)/2; /* Either 2 or 4 */
2013 if (i > 1)
2014 com_node(c, CHILD(n, 3));
2015 com_addoparg(c, RAISE_VARARGS, i);
2016 com_pop(c, i);
2017 /* The interpreter does not fall through */
2018 /* All jumps converge here */
2019 com_backpatch(c, a);
2020 com_backpatch(c, b);
2021 com_addbyte(c, POP_TOP);
2022}
2023
2024static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002025com_print_stmt(c, n)
2026 struct compiling *c;
2027 node *n;
2028{
2029 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002030 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
2031 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002032 com_node(c, CHILD(n, i));
2033 com_addbyte(c, PRINT_ITEM);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002034 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002035 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002036 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002037 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002038 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002039}
2040
2041static void
2042com_return_stmt(c, n)
2043 struct compiling *c;
2044 node *n;
2045{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002046 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002047 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002048 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002049 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002050 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002051 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002052 com_push(c, 1);
2053 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002054 else
2055 com_node(c, CHILD(n, 1));
2056 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002057 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002058}
2059
2060static void
2061com_raise_stmt(c, n)
2062 struct compiling *c;
2063 node *n;
2064{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002065 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002066 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2067 if (NCH(n) > 1) {
2068 com_node(c, CHILD(n, 1));
2069 if (NCH(n) > 3) {
2070 com_node(c, CHILD(n, 3));
2071 if (NCH(n) > 5)
2072 com_node(c, CHILD(n, 5));
2073 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002074 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002075 i = NCH(n)/2;
2076 com_addoparg(c, RAISE_VARARGS, i);
2077 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002078}
2079
2080static void
2081com_import_stmt(c, n)
2082 struct compiling *c;
2083 node *n;
2084{
2085 int i;
2086 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002087 /* 'import' dotted_name (',' dotted_name)* |
2088 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002089 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002090 /* 'from' dotted_name 'import' ... */
2091 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002092 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002093 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002094 for (i = 3; i < NCH(n); i += 2)
2095 com_addopname(c, IMPORT_FROM, CHILD(n, i));
2096 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002097 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002098 }
2099 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002100 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002101 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002102 REQ(CHILD(n, i), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002103 com_addopname(c, IMPORT_NAME, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002104 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002105 com_addopname(c, STORE_NAME, CHILD(CHILD(n, i), 0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002106 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002107 }
2108 }
2109}
2110
2111static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00002112com_global_stmt(c, n)
2113 struct compiling *c;
2114 node *n;
2115{
2116 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002117 REQ(n, global_stmt);
2118 /* 'global' NAME (',' NAME)* */
2119 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002120 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002121#ifdef PRIVATE_NAME_MANGLING
2122 char buffer[256];
2123 if (s != NULL && s[0] == '_' && s[1] == '_' &&
2124 c->c_private != NULL &&
2125 com_mangle(c, s, buffer, (int)sizeof(buffer)))
2126 s = buffer;
2127#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +00002128 if (PyDict_GetItemString(c->c_locals, s) != NULL) {
2129 com_error(c, PyExc_SyntaxError,
2130 "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002131 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002132 else if (PyDict_SetItemString(c->c_globals, s, Py_None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002133 c->c_errors++;
2134 }
2135}
2136
Guido van Rossum681d79a1995-07-18 14:51:37 +00002137static int
2138com_newlocal_o(c, nameval)
2139 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002140 PyObject *nameval;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002141{
2142 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002143 PyObject *ival;
2144 if (PyList_Size(c->c_varnames) != c->c_nlocals) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002145 /* This is usually caused by an error on a previous call */
2146 if (c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002147 com_error(c, PyExc_SystemError,
2148 "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002149 }
2150 return 0;
2151 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002152 ival = PyInt_FromLong(i = c->c_nlocals++);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002153 if (ival == NULL)
2154 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002155 else if (PyDict_SetItem(c->c_locals, nameval, ival) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002156 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002157 else if (PyList_Append(c->c_varnames, nameval) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002158 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002159 Py_XDECREF(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002160 return i;
2161}
2162
2163static int
2164com_addlocal_o(c, nameval)
2165 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002166 PyObject *nameval;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002167{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002168 PyObject *ival = PyDict_GetItem(c->c_locals, nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002169 if (ival != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002170 return PyInt_AsLong(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002171 return com_newlocal_o(c, nameval);
2172}
2173
2174static int
2175com_newlocal(c, name)
2176 struct compiling *c;
2177 char *name;
2178{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002179 PyObject *nameval = PyString_InternFromString(name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002180 int i;
2181 if (nameval == NULL) {
2182 c->c_errors++;
2183 return 0;
2184 }
2185 i = com_newlocal_o(c, nameval);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002186 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002187 return i;
2188}
2189
Guido van Rossumc5e96291991-12-10 13:53:51 +00002190static void
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002191com_exec_stmt(c, n)
2192 struct compiling *c;
2193 node *n;
2194{
2195 REQ(n, exec_stmt);
2196 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2197 com_node(c, CHILD(n, 1));
2198 if (NCH(n) >= 4)
2199 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002200 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002201 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002202 com_push(c, 1);
2203 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002204 if (NCH(n) >= 6)
2205 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002206 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002207 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002208 com_push(c, 1);
2209 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002210 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002211 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002212}
2213
Guido van Rossum7c531111997-03-11 18:42:21 +00002214static int
2215is_constant_false(c, n)
2216 struct compiling *c;
2217 node *n;
2218{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002219 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002220 int i;
2221
2222 /* Label to avoid tail recursion */
2223 next:
2224 switch (TYPE(n)) {
2225
2226 case suite:
2227 if (NCH(n) == 1) {
2228 n = CHILD(n, 0);
2229 goto next;
2230 }
2231 /* Fall through */
2232 case file_input:
2233 for (i = 0; i < NCH(n); i++) {
2234 node *ch = CHILD(n, i);
2235 if (TYPE(ch) == stmt) {
2236 n = ch;
2237 goto next;
2238 }
2239 }
2240 break;
2241
2242 case stmt:
2243 case simple_stmt:
2244 case small_stmt:
2245 n = CHILD(n, 0);
2246 goto next;
2247
2248 case expr_stmt:
2249 case testlist:
2250 case test:
2251 case and_test:
2252 case not_test:
2253 case comparison:
2254 case expr:
2255 case xor_expr:
2256 case and_expr:
2257 case shift_expr:
2258 case arith_expr:
2259 case term:
2260 case factor:
2261 case power:
2262 case atom:
2263 if (NCH(n) == 1) {
2264 n = CHILD(n, 0);
2265 goto next;
2266 }
2267 break;
2268
2269 case NAME:
2270 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2271 return 1;
2272 break;
2273
2274 case NUMBER:
2275 v = parsenumber(c, STR(n));
2276 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002277 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002278 break;
2279 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002280 i = PyObject_IsTrue(v);
2281 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002282 return i == 0;
2283
2284 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002285 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002286 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002287 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002288 break;
2289 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002290 i = PyObject_IsTrue(v);
2291 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002292 return i == 0;
2293
2294 }
2295 return 0;
2296}
2297
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002298static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002299com_if_stmt(c, n)
2300 struct compiling *c;
2301 node *n;
2302{
2303 int i;
2304 int anchor = 0;
2305 REQ(n, if_stmt);
2306 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2307 for (i = 0; i+3 < NCH(n); i+=4) {
2308 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002309 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002310 if (is_constant_false(c, ch))
2311 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002312 if (i > 0)
2313 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002314 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002315 com_addfwref(c, JUMP_IF_FALSE, &a);
2316 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002317 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002318 com_node(c, CHILD(n, i+3));
2319 com_addfwref(c, JUMP_FORWARD, &anchor);
2320 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002321 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002322 com_addbyte(c, POP_TOP);
2323 }
2324 if (i+2 < NCH(n))
2325 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002326 if (anchor)
2327 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002328}
2329
2330static void
2331com_while_stmt(c, n)
2332 struct compiling *c;
2333 node *n;
2334{
2335 int break_anchor = 0;
2336 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002337 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002338 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2339 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002340 block_push(c, SETUP_LOOP);
2341 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002342 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002343 com_node(c, CHILD(n, 1));
2344 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2345 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002346 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002347 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002348 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002349 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002350 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2351 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002352 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002353 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002354 com_addbyte(c, POP_TOP);
2355 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002356 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002357 if (NCH(n) > 4)
2358 com_node(c, CHILD(n, 6));
2359 com_backpatch(c, break_anchor);
2360}
2361
2362static void
2363com_for_stmt(c, n)
2364 struct compiling *c;
2365 node *n;
2366{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002367 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002368 int break_anchor = 0;
2369 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002370 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002371 REQ(n, for_stmt);
2372 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2373 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002374 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002375 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002376 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002377 if (v == NULL)
2378 c->c_errors++;
2379 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002380 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002381 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002382 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002383 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002384 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002385 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002386 com_assign(c, CHILD(n, 1), OP_ASSIGN);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002387 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002388 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002389 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002390 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2391 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002392 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002393 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002394 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002395 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002396 if (NCH(n) > 8)
2397 com_node(c, CHILD(n, 8));
2398 com_backpatch(c, break_anchor);
2399}
2400
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002401/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002402
2403 SETUP_FINALLY L
2404 <code for S>
2405 POP_BLOCK
2406 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002407 L: <code for Sf>
2408 END_FINALLY
2409
2410 The special instructions use the block stack. Each block
2411 stack entry contains the instruction that created it (here
2412 SETUP_FINALLY), the level of the value stack at the time the
2413 block stack entry was created, and a label (here L).
2414
2415 SETUP_FINALLY:
2416 Pushes the current value stack level and the label
2417 onto the block stack.
2418 POP_BLOCK:
2419 Pops en entry from the block stack, and pops the value
2420 stack until its level is the same as indicated on the
2421 block stack. (The label is ignored.)
2422 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002423 Pops a variable number of entries from the *value* stack
2424 and re-raises the exception they specify. The number of
2425 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002426
2427 The block stack is unwound when an exception is raised:
2428 when a SETUP_FINALLY entry is found, the exception is pushed
2429 onto the value stack (and the exception condition is cleared),
2430 and the interpreter jumps to the label gotten from the block
2431 stack.
2432
2433 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002434 (The contents of the value stack is shown in [], with the top
2435 at the right; 'tb' is trace-back info, 'val' the exception's
2436 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002437
2438 Value stack Label Instruction Argument
2439 [] SETUP_EXCEPT L1
2440 [] <code for S>
2441 [] POP_BLOCK
2442 [] JUMP_FORWARD L0
2443
Guido van Rossum3f5da241990-12-20 15:06:42 +00002444 [tb, val, exc] L1: DUP )
2445 [tb, val, exc, exc] <evaluate E1> )
2446 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2447 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2448 [tb, val, exc, 1] POP )
2449 [tb, val, exc] POP
2450 [tb, val] <assign to V1> (or POP if no V1)
2451 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002452 [] <code for S1>
2453 JUMP_FORWARD L0
2454
Guido van Rossum3f5da241990-12-20 15:06:42 +00002455 [tb, val, exc, 0] L2: POP
2456 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002457 .............................etc.......................
2458
Guido van Rossum3f5da241990-12-20 15:06:42 +00002459 [tb, val, exc, 0] Ln+1: POP
2460 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002461
2462 [] L0: <next statement>
2463
2464 Of course, parts are not generated if Vi or Ei is not present.
2465*/
2466
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002467static void
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002468com_try_except(c, n)
2469 struct compiling *c;
2470 node *n;
2471{
2472 int except_anchor = 0;
2473 int end_anchor = 0;
2474 int else_anchor = 0;
2475 int i;
2476 node *ch;
2477
2478 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2479 block_push(c, SETUP_EXCEPT);
2480 com_node(c, CHILD(n, 2));
2481 com_addbyte(c, POP_BLOCK);
2482 block_pop(c, SETUP_EXCEPT);
2483 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2484 com_backpatch(c, except_anchor);
2485 for (i = 3;
2486 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2487 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002488 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002489 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002490 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002491 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002492 break;
2493 }
2494 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002495 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002496 com_addoparg(c, SET_LINENO, ch->n_lineno);
2497 if (NCH(ch) > 1) {
2498 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002499 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002500 com_node(c, CHILD(ch, 1));
2501 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002502 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002503 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2504 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002505 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002506 }
2507 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002508 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002509 if (NCH(ch) > 3)
Guido van Rossum8861b741996-07-30 16:49:37 +00002510 com_assign(c, CHILD(ch, 3), OP_ASSIGN);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002511 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002512 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002513 com_pop(c, 1);
2514 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002515 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002516 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002517 com_node(c, CHILD(n, i+2));
2518 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2519 if (except_anchor) {
2520 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002521 /* We come in with [tb, val, exc, 0] on the
2522 stack; one pop and it's the same as
2523 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002524 com_addbyte(c, POP_TOP);
2525 }
2526 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002527 /* We actually come in here with [tb, val, exc] but the
2528 END_FINALLY will zap those and jump around.
2529 The c_stacklevel does not reflect them so we need not pop
2530 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002531 com_addbyte(c, END_FINALLY);
2532 com_backpatch(c, else_anchor);
2533 if (i < NCH(n))
2534 com_node(c, CHILD(n, i+2));
2535 com_backpatch(c, end_anchor);
2536}
2537
2538static void
2539com_try_finally(c, n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002540 struct compiling *c;
2541 node *n;
2542{
2543 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002544 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002545
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002546 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2547 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002548 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002549 com_addbyte(c, POP_BLOCK);
2550 block_pop(c, SETUP_FINALLY);
2551 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002552 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002553 /* While the generated code pushes only one item,
2554 the try-finally handling can enter here with
2555 up to three items. OK, here are the details:
2556 3 for an exception, 2 for RETURN, 1 for BREAK. */
2557 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002558 com_backpatch(c, finally_anchor);
2559 ch = CHILD(n, NCH(n)-1);
2560 com_addoparg(c, SET_LINENO, ch->n_lineno);
2561 com_node(c, ch);
2562 com_addbyte(c, END_FINALLY);
2563 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002564 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002565}
2566
2567static void
2568com_try_stmt(c, n)
2569 struct compiling *c;
2570 node *n;
2571{
2572 REQ(n, try_stmt);
2573 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2574 | 'try' ':' suite 'finally' ':' suite */
2575 if (TYPE(CHILD(n, 3)) != except_clause)
2576 com_try_finally(c, n);
2577 else
2578 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002579}
2580
Guido van Rossum8b993a91997-01-17 21:04:03 +00002581static node *
2582get_rawdocstring(n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002583 node *n;
2584{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002585 int i;
2586
Guido van Rossum8b993a91997-01-17 21:04:03 +00002587 /* Label to avoid tail recursion */
2588 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002589 switch (TYPE(n)) {
2590
2591 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002592 if (NCH(n) == 1) {
2593 n = CHILD(n, 0);
2594 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002595 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002596 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002597 case file_input:
2598 for (i = 0; i < NCH(n); i++) {
2599 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002600 if (TYPE(ch) == stmt) {
2601 n = ch;
2602 goto next;
2603 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002604 }
2605 break;
2606
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002607 case stmt:
2608 case simple_stmt:
2609 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002610 n = CHILD(n, 0);
2611 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002612
2613 case expr_stmt:
2614 case testlist:
2615 case test:
2616 case and_test:
2617 case not_test:
2618 case comparison:
2619 case expr:
2620 case xor_expr:
2621 case and_expr:
2622 case shift_expr:
2623 case arith_expr:
2624 case term:
2625 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002626 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002627 if (NCH(n) == 1) {
2628 n = CHILD(n, 0);
2629 goto next;
2630 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002631 break;
2632
2633 case atom:
2634 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002635 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002636 break;
2637
2638 }
2639 return NULL;
2640}
2641
Guido van Rossum79f25d91997-04-29 20:08:16 +00002642static PyObject *
Guido van Rossum8b993a91997-01-17 21:04:03 +00002643get_docstring(n)
2644 node *n;
2645{
2646 n = get_rawdocstring(n);
2647 if (n == NULL)
2648 return NULL;
2649 return parsestrplus(n);
2650}
2651
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002652static void
2653com_suite(c, n)
2654 struct compiling *c;
2655 node *n;
2656{
2657 REQ(n, suite);
2658 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2659 if (NCH(n) == 1) {
2660 com_node(c, CHILD(n, 0));
2661 }
2662 else {
2663 int i;
2664 for (i = 0; i < NCH(n); i++) {
2665 node *ch = CHILD(n, i);
2666 if (TYPE(ch) == stmt)
2667 com_node(c, ch);
2668 }
2669 }
2670}
2671
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002672/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002673static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002674com_continue_stmt(c, n)
2675 struct compiling *c;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002676 node *n; /* Not used, but passed for consistency */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002677{
2678 int i = c->c_nblocks;
2679 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2680 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2681 }
2682 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002683 com_error(c, PyExc_SyntaxError,
2684 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002685 }
2686 /* XXX Could allow it inside a 'finally' clause
2687 XXX if we could pop the exception still on the stack */
2688}
2689
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002690static int
Guido van Rossum681d79a1995-07-18 14:51:37 +00002691com_argdefs(c, n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002692 struct compiling *c;
2693 node *n;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002694{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002695 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002696 if (TYPE(n) == lambdef) {
2697 /* lambdef: 'lambda' [varargslist] ':' test */
2698 n = CHILD(n, 1);
2699 }
2700 else {
2701 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2702 n = CHILD(n, 2);
2703 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2704 n = CHILD(n, 1);
2705 }
2706 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002707 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002708 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002709 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002710 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2711 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002712 nargs = 0;
2713 ndefs = 0;
2714 for (i = 0; i < nch; i++) {
2715 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002716 if (TYPE(CHILD(n, i)) == STAR ||
2717 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002718 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002719 nargs++;
2720 i++;
2721 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002722 t = RPAR; /* Anything except EQUAL or COMMA */
2723 else
2724 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002725 if (t == EQUAL) {
2726 i++;
2727 ndefs++;
2728 com_node(c, CHILD(n, i));
2729 i++;
2730 if (i >= nch)
2731 break;
2732 t = TYPE(CHILD(n, i));
2733 }
2734 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00002735 /* Treat "(a=1, b)" as an error */
2736 if (ndefs)
2737 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00002738 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002739 }
2740 if (t != COMMA)
2741 break;
2742 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002743 return ndefs;
2744}
2745
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002746static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002747com_funcdef(c, n)
2748 struct compiling *c;
2749 node *n;
2750{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002751 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002752 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002753 v = (PyObject *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002754 if (v == NULL)
2755 c->c_errors++;
2756 else {
2757 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002758 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002759 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002760 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002761 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002762 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002763 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002764 com_pop(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002765 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002766 }
2767}
2768
2769static void
Guido van Rossum25831651993-05-19 14:50:45 +00002770com_bases(c, n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002771 struct compiling *c;
2772 node *n;
2773{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002774 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002775 REQ(n, testlist);
2776 /* testlist: test (',' test)* [','] */
2777 for (i = 0; i < NCH(n); i += 2)
2778 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002779 i = (NCH(n)+1) / 2;
2780 com_addoparg(c, BUILD_TUPLE, i);
2781 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00002782}
2783
2784static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002785com_classdef(c, n)
2786 struct compiling *c;
2787 node *n;
2788{
Guido van Rossum25831651993-05-19 14:50:45 +00002789 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002790 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002791 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002792 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00002793 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00002794 c->c_errors++;
2795 return;
2796 }
2797 /* Push the class name on the stack */
2798 i = com_addconst(c, v);
2799 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002800 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002801 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00002802 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002803 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00002804 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002805 com_push(c, 1);
2806 }
Guido van Rossum25831651993-05-19 14:50:45 +00002807 else
2808 com_bases(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002809 v = (PyObject *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002810 if (v == NULL)
2811 c->c_errors++;
2812 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002813 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002814 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002815 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002816 com_addoparg(c, MAKE_FUNCTION, 0);
2817 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002818 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002819 com_pop(c, 2);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002820 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002821 Py_DECREF(v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002822 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002823}
2824
2825static void
2826com_node(c, n)
2827 struct compiling *c;
2828 node *n;
2829{
2830 switch (TYPE(n)) {
2831
2832 /* Definition nodes */
2833
2834 case funcdef:
2835 com_funcdef(c, n);
2836 break;
2837 case classdef:
2838 com_classdef(c, n);
2839 break;
2840
2841 /* Trivial parse tree nodes */
2842
2843 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002844 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002845 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002846 com_node(c, CHILD(n, 0));
2847 break;
2848
2849 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002850 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2851 com_addoparg(c, SET_LINENO, n->n_lineno);
2852 {
2853 int i;
2854 for (i = 0; i < NCH(n)-1; i += 2)
2855 com_node(c, CHILD(n, i));
2856 }
2857 break;
2858
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002859 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002860 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002861 com_node(c, CHILD(n, 0));
2862 break;
2863
2864 /* Statement nodes */
2865
2866 case expr_stmt:
2867 com_expr_stmt(c, n);
2868 break;
2869 case print_stmt:
2870 com_print_stmt(c, n);
2871 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002872 case del_stmt: /* 'del' exprlist */
Guido van Rossum8861b741996-07-30 16:49:37 +00002873 com_assign(c, CHILD(n, 1), OP_DELETE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002874 break;
2875 case pass_stmt:
2876 break;
2877 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002878 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002879 com_error(c, PyExc_SyntaxError,
2880 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002881 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002882 com_addbyte(c, BREAK_LOOP);
2883 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002884 case continue_stmt:
2885 com_continue_stmt(c, n);
2886 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002887 case return_stmt:
2888 com_return_stmt(c, n);
2889 break;
2890 case raise_stmt:
2891 com_raise_stmt(c, n);
2892 break;
2893 case import_stmt:
2894 com_import_stmt(c, n);
2895 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002896 case global_stmt:
2897 com_global_stmt(c, n);
2898 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002899 case exec_stmt:
2900 com_exec_stmt(c, n);
2901 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002902 case assert_stmt:
2903 com_assert_stmt(c, n);
2904 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002905 case if_stmt:
2906 com_if_stmt(c, n);
2907 break;
2908 case while_stmt:
2909 com_while_stmt(c, n);
2910 break;
2911 case for_stmt:
2912 com_for_stmt(c, n);
2913 break;
2914 case try_stmt:
2915 com_try_stmt(c, n);
2916 break;
2917 case suite:
2918 com_suite(c, n);
2919 break;
2920
2921 /* Expression nodes */
2922
2923 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002924 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002925 break;
2926 case test:
2927 com_test(c, n);
2928 break;
2929 case and_test:
2930 com_and_test(c, n);
2931 break;
2932 case not_test:
2933 com_not_test(c, n);
2934 break;
2935 case comparison:
2936 com_comparison(c, n);
2937 break;
2938 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002939 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002940 break;
2941 case expr:
2942 com_expr(c, n);
2943 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002944 case xor_expr:
2945 com_xor_expr(c, n);
2946 break;
2947 case and_expr:
2948 com_and_expr(c, n);
2949 break;
2950 case shift_expr:
2951 com_shift_expr(c, n);
2952 break;
2953 case arith_expr:
2954 com_arith_expr(c, n);
2955 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002956 case term:
2957 com_term(c, n);
2958 break;
2959 case factor:
2960 com_factor(c, n);
2961 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00002962 case power:
2963 com_power(c, n);
2964 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002965 case atom:
2966 com_atom(c, n);
2967 break;
2968
2969 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002970 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002971 com_error(c, PyExc_SystemError,
2972 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002973 }
2974}
2975
Guido van Rossum79f25d91997-04-29 20:08:16 +00002976static void com_fplist Py_PROTO((struct compiling *, node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002977
2978static void
2979com_fpdef(c, n)
2980 struct compiling *c;
2981 node *n;
2982{
2983 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
2984 if (TYPE(CHILD(n, 0)) == LPAR)
2985 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002986 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002987 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002988 com_pop(c, 1);
2989 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002990}
2991
2992static void
2993com_fplist(c, n)
2994 struct compiling *c;
2995 node *n;
2996{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00002997 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002998 if (NCH(n) == 1) {
2999 com_fpdef(c, CHILD(n, 0));
3000 }
3001 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003002 int i = (NCH(n)+1)/2;
3003 com_addoparg(c, UNPACK_TUPLE, i);
3004 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003005 for (i = 0; i < NCH(n); i += 2)
3006 com_fpdef(c, CHILD(n, i));
3007 }
3008}
3009
3010static void
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003011com_arglist(c, n)
3012 struct compiling *c;
3013 node *n;
3014{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003015 int nch, i;
3016 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003017 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003018 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003019 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003020 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003021 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003022 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003023 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003024 node *ch = CHILD(n, i);
3025 node *fp;
3026 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00003027 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003028 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003029 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3030 fp = CHILD(ch, 0);
3031 if (TYPE(fp) == NAME)
3032 name = STR(fp);
3033 else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003034 name = nbuf;
3035 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003036 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003037 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003038 com_newlocal(c, name);
3039 c->c_argcount++;
3040 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003041 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003042 ch = CHILD(n, i);
3043 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003044 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003045 else
3046 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003047 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003048 /* Handle *arguments */
3049 if (i < nch) {
3050 node *ch;
3051 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003052 if (TYPE(ch) != DOUBLESTAR) {
3053 REQ(ch, STAR);
3054 ch = CHILD(n, i+1);
3055 if (TYPE(ch) == NAME) {
3056 c->c_flags |= CO_VARARGS;
3057 i += 3;
3058 com_newlocal(c, STR(ch));
3059 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003060 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003061 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003062 /* Handle **keywords */
3063 if (i < nch) {
3064 node *ch;
3065 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003066 if (TYPE(ch) != DOUBLESTAR) {
3067 REQ(ch, STAR);
3068 ch = CHILD(n, i+1);
3069 REQ(ch, STAR);
3070 ch = CHILD(n, i+2);
3071 }
3072 else
3073 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003074 REQ(ch, NAME);
3075 c->c_flags |= CO_VARKEYWORDS;
3076 com_newlocal(c, STR(ch));
3077 }
3078 if (complex) {
3079 /* Generate code for complex arguments only after
3080 having counted the simple arguments */
3081 int ilocal = 0;
3082 for (i = 0; i < nch; i++) {
3083 node *ch = CHILD(n, i);
3084 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003085 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003086 break;
3087 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3088 fp = CHILD(ch, 0);
3089 if (TYPE(fp) != NAME) {
3090 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003091 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003092 com_fpdef(c, ch);
3093 }
3094 ilocal++;
3095 if (++i >= nch)
3096 break;
3097 ch = CHILD(n, i);
3098 if (TYPE(ch) == EQUAL)
3099 i += 2;
3100 else
3101 REQ(ch, COMMA);
3102 }
3103 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003104}
3105
3106static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003107com_file_input(c, n)
3108 struct compiling *c;
3109 node *n;
3110{
3111 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003112 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003113 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003114 doc = get_docstring(n);
3115 if (doc != NULL) {
3116 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003117 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003118 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003119 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003120 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003121 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003122 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003123 for (i = 0; i < NCH(n); i++) {
3124 node *ch = CHILD(n, i);
3125 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3126 com_node(c, ch);
3127 }
3128}
3129
3130/* Top-level compile-node interface */
3131
3132static void
3133compile_funcdef(c, n)
3134 struct compiling *c;
3135 node *n;
3136{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003137 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003138 node *ch;
3139 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003140 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003141 doc = get_docstring(CHILD(n, 4));
3142 if (doc != NULL) {
3143 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003144 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003145 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003146 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003147 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003148 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3149 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003150 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003151 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003152 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003153 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003154 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003155 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003156 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003157 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003158 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003159}
3160
3161static void
Guido van Rossum590baa41993-11-30 13:40:46 +00003162compile_lambdef(c, n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003163 struct compiling *c;
3164 node *n;
3165{
Guido van Rossum590baa41993-11-30 13:40:46 +00003166 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003167 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003168 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003169
3170 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003171 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003172 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003173 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003174 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003175 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003176 else
3177 ch = CHILD(n, 2);
3178 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003179 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003180 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003181}
3182
3183static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003184compile_classdef(c, n)
3185 struct compiling *c;
3186 node *n;
3187{
3188 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003189 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003190 REQ(n, classdef);
3191 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3192 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003193#ifdef PRIVATE_NAME_MANGLING
3194 c->c_private = c->c_name;
3195#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003196 ch = CHILD(n, NCH(n)-1); /* The suite */
3197 doc = get_docstring(ch);
3198 if (doc != NULL) {
3199 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003200 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003201 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003202 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003203 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003204 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003205 }
3206 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003207 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003208 com_node(c, ch);
3209 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003210 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003211 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003212 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003213}
3214
3215static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003216compile_node(c, n)
3217 struct compiling *c;
3218 node *n;
3219{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003220 com_addoparg(c, SET_LINENO, n->n_lineno);
3221
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003222 switch (TYPE(n)) {
3223
Guido van Rossum4c417781991-01-21 16:09:22 +00003224 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003225 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003226 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003227 n = CHILD(n, 0);
3228 if (TYPE(n) != NEWLINE)
3229 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003230 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003231 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003232 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003233 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003234 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003235 break;
3236
Guido van Rossum4c417781991-01-21 16:09:22 +00003237 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003238 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003239 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003240 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003241 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003242 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003243 break;
3244
Guido van Rossum590baa41993-11-30 13:40:46 +00003245 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003246 com_node(c, CHILD(n, 0));
3247 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003248 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003249 break;
3250
Guido van Rossum590baa41993-11-30 13:40:46 +00003251 case lambdef: /* anonymous function definition */
3252 compile_lambdef(c, n);
3253 break;
3254
Guido van Rossum4c417781991-01-21 16:09:22 +00003255 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003256 compile_funcdef(c, n);
3257 break;
3258
Guido van Rossum4c417781991-01-21 16:09:22 +00003259 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003260 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003261 break;
3262
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003263 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003264 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003265 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003266 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003267 }
3268}
3269
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003270/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00003271
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003272 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
3273 instructions that refer to local variables with LOAD_FAST etc.
3274 The latter instructions are much faster because they don't need to
3275 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003276
Guido van Rossum681d79a1995-07-18 14:51:37 +00003277 To find all local variables, we check all STORE_NAME, IMPORT_FROM
3278 and DELETE_NAME instructions. This yields all local variables,
3279 function definitions, class definitions and import statements.
3280 Argument names have already been entered into the list by the
3281 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003282
3283 All remaining LOAD_NAME instructions must refer to non-local (global
3284 or builtin) variables, so are replaced by LOAD_GLOBAL.
3285
3286 There are two problems: 'from foo import *' and 'exec' may introduce
3287 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00003288 case, we can still optimize bona fide locals (since those
3289 statements will be surrounded by fast_2_locals() and
3290 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003291
Guido van Rossum681d79a1995-07-18 14:51:37 +00003292 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00003293
3294static void
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003295optimize(c)
3296 struct compiling *c;
Guido van Rossum282914b1991-04-04 10:42:56 +00003297{
Guido van Rossum0a697f61991-04-16 08:39:12 +00003298 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00003299 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00003300 int oparg = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003301 PyObject *name;
3302 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003303
Guido van Rossum282914b1991-04-04 10:42:56 +00003304#define NEXTOP() (*next_instr++)
3305#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossum79f25d91997-04-29 20:08:16 +00003306#define GETITEM(v, i) (PyList_GetItem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003307#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
3308
Guido van Rossum79f25d91997-04-29 20:08:16 +00003309 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003310
3311 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00003312
Guido van Rossum79f25d91997-04-29 20:08:16 +00003313 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003314 for (;;) {
3315 opcode = NEXTOP();
3316 if (opcode == STOP_CODE)
3317 break;
3318 if (HAS_ARG(opcode))
3319 oparg = NEXTARG();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003320 switch (opcode) {
3321 case STORE_NAME:
3322 case DELETE_NAME:
3323 case IMPORT_FROM:
3324 com_addlocal_o(c, GETNAMEOBJ(oparg));
3325 break;
3326 case EXEC_STMT:
3327 c->c_flags &= ~CO_OPTIMIZED;
3328 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00003329 }
3330 }
3331
Guido van Rossum79f25d91997-04-29 20:08:16 +00003332 if (PyDict_GetItemString(c->c_locals, "*") != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003333 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003334
Guido van Rossum79f25d91997-04-29 20:08:16 +00003335 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003336 for (;;) {
3337 cur_instr = next_instr;
3338 opcode = NEXTOP();
3339 if (opcode == STOP_CODE)
3340 break;
3341 if (HAS_ARG(opcode))
3342 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003343 if (opcode == LOAD_NAME ||
3344 opcode == STORE_NAME ||
3345 opcode == DELETE_NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003346 PyObject *v;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003347 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00003348 name = GETNAMEOBJ(oparg);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003349 v = PyDict_GetItem(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003350 if (v == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003351 if (opcode == LOAD_NAME &&
3352 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003353 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003354 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00003355 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003356 i = PyInt_AsLong(v);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003357 switch (opcode) {
3358 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
3359 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
3360 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
3361 }
3362 cur_instr[1] = i & 0xff;
3363 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00003364 }
3365 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003366
Guido van Rossum681d79a1995-07-18 14:51:37 +00003367 if (c->c_errors == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00003368 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00003369}
3370
Guido van Rossum79f25d91997-04-29 20:08:16 +00003371PyCodeObject *
3372PyNode_Compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003373 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003374 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003375{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003376 return jcompile(n, filename, NULL);
3377}
3378
Guido van Rossum79f25d91997-04-29 20:08:16 +00003379static PyCodeObject *
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003380icompile(n, base)
3381 node *n;
3382 struct compiling *base;
3383{
3384 return jcompile(n, base->c_filename, base);
3385}
3386
Guido van Rossum79f25d91997-04-29 20:08:16 +00003387static PyCodeObject *
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003388jcompile(n, filename, base)
3389 node *n;
3390 char *filename;
3391 struct compiling *base;
3392{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003393 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003394 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003395 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003396 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003397#ifdef PRIVATE_NAME_MANGLING
3398 if (base)
3399 sc.c_private = base->c_private;
3400 else
3401 sc.c_private = NULL;
3402#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003403 compile_node(&sc, n);
3404 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003405 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003406 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003407 sc.c_flags |= CO_NEWLOCALS;
3408 }
3409 else if (TYPE(n) == classdef)
3410 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00003411 co = NULL;
3412 if (sc.c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003413 PyObject *consts, *names, *varnames, *filename, *name;
3414 consts = PyList_AsTuple(sc.c_consts);
3415 names = PyList_AsTuple(sc.c_names);
3416 varnames = PyList_AsTuple(sc.c_varnames);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003417 filename = PyString_InternFromString(sc.c_filename);
3418 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003419 if (!PyErr_Occurred())
3420 co = PyCode_New(sc.c_argcount,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003421 sc.c_nlocals,
Guido van Rossum8b993a91997-01-17 21:04:03 +00003422 sc.c_maxstacklevel,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003423 sc.c_flags,
3424 sc.c_code,
3425 consts,
3426 names,
3427 varnames,
3428 filename,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003429 name,
3430 sc.c_firstlineno,
3431 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003432 Py_XDECREF(consts);
3433 Py_XDECREF(names);
3434 Py_XDECREF(varnames);
3435 Py_XDECREF(filename);
3436 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003437 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003438 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003439 return co;
3440}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003441
3442int
3443PyCode_Addr2Line(co, addrq)
3444 PyCodeObject *co;
3445 int addrq;
3446{
3447 int size = PyString_Size(co->co_lnotab) / 2;
3448 char *p = PyString_AsString(co->co_lnotab);
3449 int line = co->co_firstlineno;
3450 int addr = 0;
3451 while (--size >= 0) {
3452 addr += *p++;
3453 if (addr > addrq)
3454 break;
3455 line += *p++;
3456 }
3457 return line;
3458}