blob: b4658e4fc9eaddb85752f50b023a8d206e0e006b [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 Rossum79f25d91997-04-29 20:08:16 +0000124 char *p = PyString_AS_STRING(co->co_code);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000125 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000126 char *name = "???";
Guido van Rossum2dff9911992-09-03 20:50:59 +0000127 if (*p == SET_LINENO)
128 lineno = (p[1] & 0xff) | ((p[2] & 0xff) << 8);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000129 if (co->co_filename && PyString_Check(co->co_filename))
130 filename = PyString_AsString(co->co_filename);
131 if (co->co_name && PyString_Check(co->co_name))
132 name = PyString_AsString(co->co_name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000133 sprintf(buf, "<code object %.100s at %lx, file \"%.300s\", line %d>",
134 name, (long)co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000135 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000136}
137
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000138static int
139code_compare(co, cp)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000140 PyCodeObject *co, *cp;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000141{
142 int cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000143 cmp = co->co_argcount - cp->co_argcount;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000144 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000145 cmp = co->co_nlocals - cp->co_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000146 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000147 cmp = co->co_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000148 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000149 cmp = PyObject_Compare((PyObject *)co->co_code,
150 (PyObject *)cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000151 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000152 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000153 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000154 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000155 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000156 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000157 return cmp;
158}
159
160static long
161code_hash(co)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000162 PyCodeObject *co;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000163{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000164 long h, h1, h2, h3, h4;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000165 h1 = PyObject_Hash((PyObject *)co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000166 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000167 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000168 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000169 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000170 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000171 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000172 if (h4 == -1) return -1;
173 h = h1 ^ h2 ^ h3 ^ h4 ^
174 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000175 if (h == -1) h = -2;
176 return h;
177}
178
Guido van Rossum79f25d91997-04-29 20:08:16 +0000179PyTypeObject PyCode_Type = {
180 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000181 0,
182 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000183 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000184 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000185 (destructor)code_dealloc, /*tp_dealloc*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000186 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000187 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000188 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000189 (cmpfunc)code_compare, /*tp_compare*/
190 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000191 0, /*tp_as_number*/
192 0, /*tp_as_sequence*/
193 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000194 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000195};
196
Guido van Rossum644a12b1997-04-09 19:24:53 +0000197#define NAME_CHARS \
198 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
199
Guido van Rossum79f25d91997-04-29 20:08:16 +0000200PyCodeObject *
201PyCode_New(argcount, nlocals, stacksize, flags,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000202 code, consts, names, varnames, filename, name,
203 firstlineno, lnotab)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000204 int argcount;
205 int nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000206 int stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000207 int flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000208 PyObject *code;
209 PyObject *consts;
210 PyObject *names;
211 PyObject *varnames;
212 PyObject *filename;
213 PyObject *name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000214 int firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000215 PyObject *lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000216{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000217 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000218 int i;
219 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000220 if (argcount < 0 || nlocals < 0 ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000221 code == NULL || !PyString_Check(code) ||
222 consts == NULL || !PyTuple_Check(consts) ||
223 names == NULL || !PyTuple_Check(names) ||
224 varnames == NULL || !PyTuple_Check(varnames) ||
225 name == NULL || !PyString_Check(name) ||
226 filename == NULL || !PyString_Check(filename) ||
227 lnotab == NULL || !PyString_Check(lnotab)) {
228 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000229 return NULL;
230 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000231 /* Make sure names and varnames are all strings, & intern them */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000232 for (i = PyTuple_Size(names); --i >= 0; ) {
233 PyObject *v = PyTuple_GetItem(names, i);
234 if (v == NULL || !PyString_Check(v)) {
235 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000236 return NULL;
237 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000238 PyString_InternInPlace(&PyTuple_GET_ITEM(names, i));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000239 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000240 for (i = PyTuple_Size(varnames); --i >= 0; ) {
241 PyObject *v = PyTuple_GetItem(varnames, i);
242 if (v == NULL || !PyString_Check(v)) {
243 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000244 return NULL;
245 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000246 PyString_InternInPlace(&PyTuple_GET_ITEM(varnames, i));
247 }
248 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000249 for (i = PyTuple_Size(consts); --i >= 0; ) {
250 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000251 char *p;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000252 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000253 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000254 p = PyString_AsString(v);
Guido van Rossum644a12b1997-04-09 19:24:53 +0000255 if ((int)strspn(p, NAME_CHARS)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000256 != PyString_Size(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000257 continue;
258 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000259 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000260 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000261 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000262 co->co_argcount = argcount;
263 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000264 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000265 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000266 Py_INCREF(code);
267 co->co_code = (PyStringObject *)code;
268 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000269 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000270 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000271 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000272 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000273 co->co_varnames = varnames;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000274 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000275 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000276 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000277 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000278 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000279 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000280 co->co_lnotab = lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000281 }
282 return co;
283}
284
285
286/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000287
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000288struct compiling {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000289 PyObject *c_code; /* string */
290 PyObject *c_consts; /* list of objects */
291 PyObject *c_names; /* list of strings (names) */
292 PyObject *c_globals; /* dictionary (value=None) */
293 PyObject *c_locals; /* dictionary (value=localID) */
294 PyObject *c_varnames; /* list (inverse of c_locals) */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000295 int c_nlocals; /* index of next local */
296 int c_argcount; /* number of top-level arguments */
297 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000298 int c_nexti; /* index into c_code */
299 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000300 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000301 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000302 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000303 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000304 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000305 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000306 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000307 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000308 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000309 int c_stacklevel; /* Current stack level */
310 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000311 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000312 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000313 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000314#ifdef PRIVATE_NAME_MANGLING
315 char *c_private; /* for private name mangling */
316#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000317};
318
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000319
Guido van Rossum452a9831996-09-17 14:32:04 +0000320/* Error message including line number */
321
322static void
323com_error(c, exc, msg)
324 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000325 PyObject *exc;
Guido van Rossum452a9831996-09-17 14:32:04 +0000326 char *msg;
327{
328 int n = strlen(msg);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000329 PyObject *v;
Guido van Rossum452a9831996-09-17 14:32:04 +0000330 char buffer[30];
331 char *s;
Guido van Rossum635abd21997-01-06 22:56:52 +0000332 c->c_errors++;
Guido van Rossum452a9831996-09-17 14:32:04 +0000333 if (c->c_lineno <= 1) {
334 /* Unknown line number or single interactive command */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000335 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000336 return;
337 }
338 sprintf(buffer, " (line %d)", c->c_lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000339 v = PyString_FromStringAndSize((char *)NULL, n + strlen(buffer));
Guido van Rossum452a9831996-09-17 14:32:04 +0000340 if (v == NULL)
341 return; /* MemoryError, too bad */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000342 s = PyString_AS_STRING((PyStringObject *)v);
Guido van Rossum452a9831996-09-17 14:32:04 +0000343 strcpy(s, msg);
344 strcat(s, buffer);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000345 PyErr_SetObject(exc, v);
346 Py_DECREF(v);
Guido van Rossum452a9831996-09-17 14:32:04 +0000347}
348
349
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000350/* Interface to the block stack */
351
352static void
353block_push(c, type)
354 struct compiling *c;
355 int type;
356{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000357 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000358 com_error(c, PyExc_SystemError,
359 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000360 }
361 else {
362 c->c_block[c->c_nblocks++] = type;
363 }
364}
365
366static void
367block_pop(c, type)
368 struct compiling *c;
369 int type;
370{
371 if (c->c_nblocks > 0)
372 c->c_nblocks--;
373 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000374 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000375 }
376}
377
378
Guido van Rossum681d79a1995-07-18 14:51:37 +0000379/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000380
Guido van Rossum79f25d91997-04-29 20:08:16 +0000381static int com_init Py_PROTO((struct compiling *, char *));
382static void com_free Py_PROTO((struct compiling *));
383static void com_push Py_PROTO((struct compiling *, int));
384static void com_pop Py_PROTO((struct compiling *, int));
385static void com_done Py_PROTO((struct compiling *));
386static void com_node Py_PROTO((struct compiling *, struct _node *));
387static void com_factor Py_PROTO((struct compiling *, struct _node *));
388static void com_addbyte Py_PROTO((struct compiling *, int));
389static void com_addint Py_PROTO((struct compiling *, int));
390static void com_addoparg Py_PROTO((struct compiling *, int, int));
391static void com_addfwref Py_PROTO((struct compiling *, int, int *));
392static void com_backpatch Py_PROTO((struct compiling *, int));
393static int com_add Py_PROTO((struct compiling *, PyObject *, PyObject *));
394static int com_addconst Py_PROTO((struct compiling *, PyObject *));
395static int com_addname Py_PROTO((struct compiling *, PyObject *));
396static void com_addopname Py_PROTO((struct compiling *, int, node *));
397static void com_list Py_PROTO((struct compiling *, node *, int));
398static int com_argdefs Py_PROTO((struct compiling *, node *));
399static int com_newlocal Py_PROTO((struct compiling *, char *));
400static PyCodeObject *icompile Py_PROTO((struct _node *, struct compiling *));
401static PyCodeObject *jcompile Py_PROTO((struct _node *, char *,
402 struct compiling *));
403static PyObject *parsestrplus Py_PROTO((node *));
404static PyObject *parsestr Py_PROTO((char *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000405
406static int
Guido van Rossum590baa41993-11-30 13:40:46 +0000407com_init(c, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000408 struct compiling *c;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000409 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000410{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000411 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
412 1000)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000413 goto fail_3;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000414 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000415 goto fail_2;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000416 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000417 goto fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000418 if ((c->c_globals = PyDict_New()) == NULL)
Guido van Rossumc5e96291991-12-10 13:53:51 +0000419 goto fail_0;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000420 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000421 goto fail_00;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000422 if ((c->c_varnames = PyList_New(0)) == NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000423 goto fail_000;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000424 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
425 1000)) == NULL)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000426 goto fail_0000;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000427 c->c_nlocals = 0;
428 c->c_argcount = 0;
429 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000430 c->c_nexti = 0;
431 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000432 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000433 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000434 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000435 c->c_begin = 0;
436 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000437 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000438 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000439 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000440 c->c_stacklevel = 0;
441 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000442 c->c_firstlineno = 0;
443 c->c_last_addr = 0;
444 c->c_last_line = 0;
445 c-> c_lnotab_next = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000446 return 1;
447
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000448 fail_0000:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000449 Py_DECREF(c->c_lnotab);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000450 fail_000:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000451 Py_DECREF(c->c_locals);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000452 fail_00:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000453 Py_DECREF(c->c_globals);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000454 fail_0:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000455 Py_DECREF(c->c_names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000456 fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000457 Py_DECREF(c->c_consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000458 fail_2:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000459 Py_DECREF(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000460 fail_3:
461 return 0;
462}
463
464static void
465com_free(c)
466 struct compiling *c;
467{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000468 Py_XDECREF(c->c_code);
469 Py_XDECREF(c->c_consts);
470 Py_XDECREF(c->c_names);
471 Py_XDECREF(c->c_globals);
472 Py_XDECREF(c->c_locals);
473 Py_XDECREF(c->c_varnames);
474 Py_XDECREF(c->c_lnotab);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000475}
476
477static void
Guido van Rossum8b993a91997-01-17 21:04:03 +0000478com_push(c, n)
479 struct compiling *c;
480 int n;
481{
482 c->c_stacklevel += n;
483 if (c->c_stacklevel > c->c_maxstacklevel)
484 c->c_maxstacklevel = c->c_stacklevel;
485}
486
487static void
488com_pop(c, n)
489 struct compiling *c;
490 int n;
491{
492 if (c->c_stacklevel < n) {
493 fprintf(stderr,
494 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
495 c->c_filename, c->c_lineno,
496 c->c_nexti, c->c_stacklevel, n);
497 c->c_stacklevel = 0;
498 }
499 else
500 c->c_stacklevel -= n;
501}
502
503static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000504com_done(c)
505 struct compiling *c;
506{
507 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000508 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000509 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000510 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000511}
512
513static void
514com_addbyte(c, byte)
515 struct compiling *c;
516 int byte;
517{
518 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000519 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000520 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000521 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000522 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000523 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000524 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000525 com_error(c, PyExc_SystemError,
526 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000527 }
528 if (c->c_code == NULL)
529 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000530 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000531 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000532 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000533 c->c_errors++;
534 return;
535 }
536 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000537 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000538}
539
540static void
541com_addint(c, x)
542 struct compiling *c;
543 int x;
544{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000545 com_addbyte(c, x & 0xff);
546 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000547}
548
549static void
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000550com_add_lnotab(c, addr, line)
551 struct compiling *c;
552 int addr;
553 int line;
554{
555 int size;
556 char *p;
557 if (c->c_lnotab == NULL)
558 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000559 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000560 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000561 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000562 c->c_errors++;
563 return;
564 }
565 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000566 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000567 *p++ = addr;
568 *p++ = line;
569 c->c_lnotab_next += 2;
570}
571
572static void
573com_set_lineno(c, lineno)
574 struct compiling *c;
575 int lineno;
576{
577 c->c_lineno = lineno;
578 if (c->c_firstlineno == 0) {
579 c->c_firstlineno = c->c_last_line = lineno;
580 }
581 else {
582 int incr_addr = c->c_nexti - c->c_last_addr;
583 int incr_line = lineno - c->c_last_line;
584 while (incr_addr > 0 || incr_line > 0) {
585 int trunc_addr = incr_addr;
586 int trunc_line = incr_line;
587 if (trunc_addr > 255)
588 trunc_addr = 255;
589 if (trunc_line > 255)
590 trunc_line = 255;
591 com_add_lnotab(c, trunc_addr, trunc_line);
592 incr_addr -= trunc_addr;
593 incr_line -= trunc_line;
594 }
595 c->c_last_addr = c->c_nexti;
596 c->c_last_line = lineno;
597 }
598}
599
600static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000601com_addoparg(c, op, arg)
602 struct compiling *c;
603 int op;
604 int arg;
605{
Guido van Rossum8e793d91997-03-03 19:13:14 +0000606 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000607 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000608 if (Py_OptimizeFlag)
609 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000610 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000611 com_addbyte(c, op);
612 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000613}
614
615static void
616com_addfwref(c, op, p_anchor)
617 struct compiling *c;
618 int op;
619 int *p_anchor;
620{
621 /* Compile a forward reference for backpatching */
622 int here;
623 int anchor;
624 com_addbyte(c, op);
625 here = c->c_nexti;
626 anchor = *p_anchor;
627 *p_anchor = here;
628 com_addint(c, anchor == 0 ? 0 : here - anchor);
629}
630
631static void
632com_backpatch(c, anchor)
633 struct compiling *c;
634 int anchor; /* Must be nonzero */
635{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000636 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000637 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000638 int dist;
639 int prev;
640 for (;;) {
641 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000642 prev = code[anchor] + (code[anchor+1] << 8);
643 dist = target - (anchor+2);
644 code[anchor] = dist & 0xff;
645 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000646 if (!prev)
647 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000648 anchor -= prev;
649 }
650}
651
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000652/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000653
654static int
655com_add(c, list, v)
656 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000657 PyObject *list;
658 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000659{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000660 int n = PyList_Size(list);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000661 int i;
662 for (i = n; --i >= 0; ) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000663 PyObject *w = PyList_GetItem(list, i);
664 if (v->ob_type == w->ob_type && PyObject_Compare(v, w) == 0)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000665 return i;
666 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000667 /* Check for error from PyObject_Compare */
668 if (PyErr_Occurred() || PyList_Append(list, v) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000669 c->c_errors++;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000670 return n;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000671}
672
673static int
674com_addconst(c, v)
675 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000676 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000677{
678 return com_add(c, c->c_consts, v);
679}
680
681static int
682com_addname(c, v)
683 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000684 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000685{
686 return com_add(c, c->c_names, v);
687}
688
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000689#ifdef PRIVATE_NAME_MANGLING
690static int
691com_mangle(c, name, buffer, maxlen)
692 struct compiling *c;
693 char *name;
694 char *buffer;
695 int maxlen;
696{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000697 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000698 This is independent from how the name is used. */
699 char *p;
700 int nlen, plen;
701 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000702 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000703 return 0; /* Don't mangle __extremely_long_names */
704 if (name[nlen-1] == '_' && name[nlen-2] == '_')
705 return 0; /* Don't mangle __whatever__ */
706 p = c->c_private;
707 /* Strip leading underscores from class name */
708 while (*p == '_')
709 p++;
710 if (*p == '\0')
711 return 0; /* Don't mangle if class is just underscores */
712 plen = strlen(p);
713 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000714 plen = maxlen-nlen-2; /* Truncate class name if too long */
715 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000716 buffer[0] = '_';
717 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000718 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000719 /* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
720 return 1;
721}
722#endif
723
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000724static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000725com_addopnamestr(c, op, name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000726 struct compiling *c;
727 int op;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000728 char *name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000729{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000730 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000731 int i;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000732#ifdef PRIVATE_NAME_MANGLING
733 char buffer[256];
734 if (name != NULL && name[0] == '_' && name[1] == '_' &&
735 c->c_private != NULL &&
736 com_mangle(c, name, buffer, (int)sizeof(buffer)))
737 name = buffer;
738#endif
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000739 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000740 c->c_errors++;
741 i = 255;
742 }
743 else {
744 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000745 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000746 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000747 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
748 switch (op) {
749 case LOAD_NAME:
750 case STORE_NAME:
751 case DELETE_NAME:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000752 if (PyDict_GetItemString(c->c_globals, name) != NULL) {
Guido van Rossumc5e96291991-12-10 13:53:51 +0000753 switch (op) {
754 case LOAD_NAME: op = LOAD_GLOBAL; break;
755 case STORE_NAME: op = STORE_GLOBAL; break;
756 case DELETE_NAME: op = DELETE_GLOBAL; break;
757 }
758 }
759 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000760 com_addoparg(c, op, i);
761}
762
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000763static void
764com_addopname(c, op, n)
765 struct compiling *c;
766 int op;
767 node *n;
768{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000769 char *name;
770 char buffer[1000];
771 /* XXX it is possible to write this code without the 1000
772 chars on the total length of dotted names, I just can't be
773 bothered right now */
774 if (TYPE(n) == STAR)
775 name = "*";
776 else if (TYPE(n) == dotted_name) {
777 char *p = buffer;
778 int i;
779 name = buffer;
780 for (i = 0; i < NCH(n); i += 2) {
781 char *s = STR(CHILD(n, i));
782 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000783 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000784 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +0000785 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000786 break;
787 }
788 if (p != buffer)
789 *p++ = '.';
790 strcpy(p, s);
791 p = strchr(p, '\0');
792 }
793 }
794 else {
795 REQ(n, NAME);
796 name = STR(n);
797 }
798 com_addopnamestr(c, op, name);
799}
800
Guido van Rossum79f25d91997-04-29 20:08:16 +0000801static PyObject *
Guido van Rossum452a9831996-09-17 14:32:04 +0000802parsenumber(co, s)
803 struct compiling *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000804 char *s;
805{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000806 extern long PyOS_strtol Py_PROTO((const char *, char **, int));
807 extern unsigned long PyOS_strtoul Py_PROTO((const char *,
808 char **, int));
809 extern double atof Py_PROTO((const char *));
Guido van Rossumc5e96291991-12-10 13:53:51 +0000810 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000811 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000812 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +0000813#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +0000814 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +0000815 int imflag;
816#endif
817
Guido van Rossum282914b1991-04-04 10:42:56 +0000818 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000819 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +0000820#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +0000821 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +0000822#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000823 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000824 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000825 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000826 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000827 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000828 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000829 if (*end == '\0') {
830 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000831 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000832 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000833 return NULL;
834 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000835 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000836 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000837 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +0000838#ifndef WITHOUT_COMPLEX
839 if (imflag) {
840 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000841 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +0000842 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000843 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000844 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +0000845 }
Guido van Rossumac1fc951997-10-08 15:23:55 +0000846 else
Guido van Rossum50564e81996-01-12 01:13:16 +0000847#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +0000848 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000849 PyFPE_START_PROTECT("atof", return 0)
850 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000851 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000852 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000853 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000854}
855
Guido van Rossum79f25d91997-04-29 20:08:16 +0000856static PyObject *
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000857parsestr(s)
858 char *s;
859{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000860 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000861 int len;
862 char *buf;
863 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000864 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000865 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +0000866 int first = *s;
867 int quote = first;
868 if (isalpha(quote) || quote == '_')
869 quote = *++s;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000870 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000871 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000872 return NULL;
873 }
874 s++;
875 len = strlen(s);
Guido van Rossum8054fad1993-10-26 15:19:44 +0000876 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000877 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000878 return NULL;
879 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000880 if (len >= 4 && s[0] == quote && s[1] == quote) {
881 s += 2;
882 len -= 2;
883 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000884 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000885 return NULL;
886 }
887 }
Guido van Rossum5f5e8171997-04-06 03:41:40 +0000888 if (first != quote || strchr(s, '\\') == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000889 return PyString_FromStringAndSize(s, len);
890 v = PyString_FromStringAndSize((char *)NULL, len);
891 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000892 end = s + len;
893 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000894 if (*s != '\\') {
895 *p++ = *s++;
896 continue;
897 }
898 s++;
899 switch (*s++) {
900 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000901 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000902 case '\\': *p++ = '\\'; break;
903 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000904 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000905 case 'b': *p++ = '\b'; break;
906 case 'f': *p++ = '\014'; break; /* FF */
907 case 't': *p++ = '\t'; break;
908 case 'n': *p++ = '\n'; break;
909 case 'r': *p++ = '\r'; break;
910 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000911 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
912 case '0': case '1': case '2': case '3':
913 case '4': case '5': case '6': case '7':
914 c = s[-1] - '0';
915 if ('0' <= *s && *s <= '7') {
916 c = (c<<3) + *s++ - '0';
917 if ('0' <= *s && *s <= '7')
918 c = (c<<3) + *s++ - '0';
919 }
920 *p++ = c;
921 break;
922 case 'x':
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000923 if (isxdigit(Py_CHARMASK(*s))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000924 unsigned int x = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000925 do {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000926 c = Py_CHARMASK(*s);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000927 s++;
Guido van Rossumed1100f1997-10-20 23:24:07 +0000928 x = (x<<4) & ~0xF;
929 if (isdigit(c))
930 x += c - '0';
931 else if (islower(c))
932 x += 10 + c - 'a';
933 else
934 x += 10 + c - 'A';
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000935 } while (isxdigit(Py_CHARMASK(*s)));
Guido van Rossumed1100f1997-10-20 23:24:07 +0000936 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000937 break;
938 }
939 /* FALLTHROUGH */
940 default: *p++ = '\\'; *p++ = s[-1]; break;
941 }
942 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000943 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000944 return v;
945}
946
Guido van Rossum79f25d91997-04-29 20:08:16 +0000947static PyObject *
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000948parsestrplus(n)
949 node *n;
950{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000951 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000952 int i;
953 REQ(CHILD(n, 0), STRING);
954 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
955 /* String literal concatenation */
956 for (i = 1; i < NCH(n) && v != NULL; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000957 PyString_ConcatAndDel(&v, parsestr(STR(CHILD(n, i))));
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000958 }
959 }
960 return v;
961}
962
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000963static void
964com_list_constructor(c, n)
965 struct compiling *c;
966 node *n;
967{
968 int len;
969 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000970 if (TYPE(n) != testlist)
971 REQ(n, exprlist);
972 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
973 len = (NCH(n) + 1) / 2;
974 for (i = 0; i < NCH(n); i += 2)
975 com_node(c, CHILD(n, i));
976 com_addoparg(c, BUILD_LIST, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000977 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000978}
979
980static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000981com_dictmaker(c, n)
982 struct compiling *c;
983 node *n;
984{
985 int i;
986 /* dictmaker: test ':' test (',' test ':' value)* [','] */
987 for (i = 0; i+2 < NCH(n); i += 4) {
988 /* We must arrange things just right for STORE_SUBSCR.
989 It wants the stack to look like (value) (dict) (key) */
990 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000991 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000992 com_node(c, CHILD(n, i+2)); /* value */
993 com_addbyte(c, ROT_TWO);
994 com_node(c, CHILD(n, i)); /* key */
995 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000996 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000997 }
998}
999
1000static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001001com_atom(c, n)
1002 struct compiling *c;
1003 node *n;
1004{
1005 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001006 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001007 int i;
1008 REQ(n, atom);
1009 ch = CHILD(n, 0);
1010 switch (TYPE(ch)) {
1011 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001012 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001013 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001014 com_push(c, 1);
1015 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001016 else
1017 com_node(c, CHILD(n, 1));
1018 break;
1019 case LSQB:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001020 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001021 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001022 com_push(c, 1);
1023 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001024 else
1025 com_list_constructor(c, CHILD(n, 1));
1026 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001027 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001028 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001029 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001030 if (TYPE(CHILD(n, 1)) != RBRACE)
1031 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001032 break;
1033 case BACKQUOTE:
1034 com_node(c, CHILD(n, 1));
1035 com_addbyte(c, UNARY_CONVERT);
1036 break;
1037 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001038 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001039 i = 255;
1040 }
1041 else {
1042 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001043 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001044 }
1045 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001046 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001047 break;
1048 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001049 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001050 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001051 c->c_errors++;
1052 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 NAME:
1062 com_addopname(c, LOAD_NAME, ch);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001063 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001064 break;
1065 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001066 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001067 com_error(c, PyExc_SystemError,
1068 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001069 }
1070}
1071
1072static void
1073com_slice(c, n, op)
1074 struct compiling *c;
1075 node *n;
1076 int op;
1077{
1078 if (NCH(n) == 1) {
1079 com_addbyte(c, op);
1080 }
1081 else if (NCH(n) == 2) {
1082 if (TYPE(CHILD(n, 0)) != COLON) {
1083 com_node(c, CHILD(n, 0));
1084 com_addbyte(c, op+1);
1085 }
1086 else {
1087 com_node(c, CHILD(n, 1));
1088 com_addbyte(c, op+2);
1089 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001090 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001091 }
1092 else {
1093 com_node(c, CHILD(n, 0));
1094 com_node(c, CHILD(n, 2));
1095 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001096 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001097 }
1098}
1099
Guido van Rossum635abd21997-01-06 22:56:52 +00001100static void
1101com_argument(c, n, pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001102 struct compiling *c;
1103 node *n; /* argument */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001104 PyObject **pkeywords;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001105{
1106 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001107 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001108 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001109 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001110 com_error(c, PyExc_SyntaxError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001111 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001112 }
1113 else {
1114 com_node(c, CHILD(n, 0));
1115 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001116 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001117 }
1118 m = n;
1119 do {
1120 m = CHILD(m, 0);
1121 } while (NCH(m) == 1);
1122 if (TYPE(m) != NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001123 com_error(c, PyExc_SyntaxError,
1124 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001125 }
1126 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001127 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001128 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001129 *pkeywords = PyDict_New();
Guido van Rossum635abd21997-01-06 22:56:52 +00001130 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001131 c->c_errors++;
1132 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001133 if (PyDict_GetItem(*pkeywords, v) != NULL)
1134 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001135 "duplicate keyword argument");
1136 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001137 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001138 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001139 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001140 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001141 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001142 }
1143 }
1144 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001145}
1146
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001147static void
1148com_call_function(c, n)
1149 struct compiling *c;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001150 node *n; /* EITHER arglist OR ')' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001151{
1152 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001153 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001154 }
1155 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001156 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001157 int i, na, nk;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001158 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001159 na = 0;
1160 nk = 0;
1161 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001162 com_argument(c, CHILD(n, i), &keywords);
1163 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001164 na++;
1165 else
1166 nk++;
1167 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001168 Py_XDECREF(keywords);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001169 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001170 com_error(c, PyExc_SyntaxError,
1171 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001172 }
1173 com_addoparg(c, CALL_FUNCTION, na | (nk << 8));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001174 com_pop(c, na + 2*nk);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001175 }
1176}
1177
1178static void
1179com_select_member(c, n)
1180 struct compiling *c;
1181 node *n;
1182{
1183 com_addopname(c, LOAD_ATTR, n);
1184}
1185
1186static void
Guido van Rossum8861b741996-07-30 16:49:37 +00001187com_sliceobj(c, n)
1188 struct compiling *c;
1189 node *n;
1190{
1191 int i=0;
1192 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001193 node *ch;
1194
1195 /* first argument */
1196 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001197 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001198 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001199 i++;
1200 }
1201 else {
1202 com_node(c, CHILD(n,i));
1203 i++;
1204 REQ(CHILD(n,i),COLON);
1205 i++;
1206 }
1207 /* second argument */
1208 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1209 com_node(c, CHILD(n,i));
1210 i++;
1211 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001212 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001213 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001214 com_push(c, 1);
1215 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001216 /* remaining arguments */
1217 for (; i < NCH(n); i++) {
1218 ns++;
1219 ch=CHILD(n,i);
1220 REQ(ch, sliceop);
1221 if (NCH(ch) == 1) {
1222 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001223 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001224 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001225 }
1226 else
1227 com_node(c, CHILD(ch,1));
1228 }
1229 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001230 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001231}
1232
1233static void
1234com_subscript(c, n)
1235 struct compiling *c;
1236 node *n;
1237{
1238 node *ch;
1239 REQ(n, subscript);
1240 ch = CHILD(n,0);
1241 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001242 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001243 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001244 com_push(c, 1);
1245 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001246 else {
1247 /* check for slice */
1248 if ((TYPE(ch) == COLON || NCH(n) > 1))
1249 com_sliceobj(c, n);
1250 else {
1251 REQ(ch, test);
1252 com_node(c, ch);
1253 }
1254 }
1255}
1256
1257static void
1258com_subscriptlist(c, n, assigning)
1259 struct compiling *c;
1260 node *n;
1261 int assigning;
1262{
1263 int i, op;
1264 REQ(n, subscriptlist);
1265 /* Check to make backward compatible slice behavior for '[i:j]' */
1266 if (NCH(n) == 1) {
1267 node *sub = CHILD(n, 0); /* subscript */
1268 /* Make it is a simple slice.
Guido van Rossum8b993a91997-01-17 21:04:03 +00001269 Should have exactly one colon. */
Guido van Rossum8861b741996-07-30 16:49:37 +00001270 if ((TYPE(CHILD(sub, 0)) == COLON
1271 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
Guido van Rossum8b993a91997-01-17 21:04:03 +00001272 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1273 {
Guido van Rossum8861b741996-07-30 16:49:37 +00001274 if (assigning == OP_APPLY)
1275 op = SLICE;
1276 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001277 op = ((assigning == OP_ASSIGN) ?
1278 STORE_SLICE : DELETE_SLICE);
Guido van Rossum8861b741996-07-30 16:49:37 +00001279 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001280 if (op == STORE_SLICE)
1281 com_pop(c, 2);
1282 else if (op == DELETE_SLICE)
1283 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001284 return;
1285 }
1286 }
1287 /* Else normal subscriptlist. Compile each subscript. */
1288 for (i = 0; i < NCH(n); i += 2)
1289 com_subscript(c, CHILD(n, i));
1290 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001291 if (NCH(n) > 1) {
1292 i = (NCH(n)+1) / 2;
1293 com_addoparg(c, BUILD_TUPLE, i);
1294 com_pop(c, i-1);
1295 }
1296 if (assigning == OP_APPLY) {
Guido van Rossum8861b741996-07-30 16:49:37 +00001297 op = BINARY_SUBSCR;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001298 i = 1;
1299 }
1300 else if (assigning == OP_ASSIGN) {
1301 op = STORE_SUBSCR;
1302 i = 3;
1303 }
1304 else {
1305 op = DELETE_SUBSCR;
1306 i = 2;
1307 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001308 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001309 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001310}
1311
1312static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001313com_apply_trailer(c, n)
1314 struct compiling *c;
1315 node *n;
1316{
1317 REQ(n, trailer);
1318 switch (TYPE(CHILD(n, 0))) {
1319 case LPAR:
1320 com_call_function(c, CHILD(n, 1));
1321 break;
1322 case DOT:
1323 com_select_member(c, CHILD(n, 1));
1324 break;
1325 case LSQB:
Guido van Rossum8861b741996-07-30 16:49:37 +00001326 com_subscriptlist(c, CHILD(n, 1), OP_APPLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001327 break;
1328 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001329 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001330 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001331 }
1332}
1333
1334static void
Guido van Rossum50564e81996-01-12 01:13:16 +00001335com_power(c, n)
1336 struct compiling *c;
1337 node *n;
1338{
1339 int i;
1340 REQ(n, power);
1341 com_atom(c, CHILD(n, 0));
1342 for (i = 1; i < NCH(n); i++) {
1343 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1344 com_factor(c, CHILD(n, i+1));
1345 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001346 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001347 break;
1348 }
1349 else
1350 com_apply_trailer(c, CHILD(n, i));
1351 }
1352}
1353
1354static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001355com_factor(c, n)
1356 struct compiling *c;
1357 node *n;
1358{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001359 REQ(n, factor);
1360 if (TYPE(CHILD(n, 0)) == PLUS) {
1361 com_factor(c, CHILD(n, 1));
1362 com_addbyte(c, UNARY_POSITIVE);
1363 }
1364 else if (TYPE(CHILD(n, 0)) == MINUS) {
1365 com_factor(c, CHILD(n, 1));
1366 com_addbyte(c, UNARY_NEGATIVE);
1367 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001368 else if (TYPE(CHILD(n, 0)) == TILDE) {
1369 com_factor(c, CHILD(n, 1));
1370 com_addbyte(c, UNARY_INVERT);
1371 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001372 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001373 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001374 }
1375}
1376
1377static void
1378com_term(c, n)
1379 struct compiling *c;
1380 node *n;
1381{
1382 int i;
1383 int op;
1384 REQ(n, term);
1385 com_factor(c, CHILD(n, 0));
1386 for (i = 2; i < NCH(n); i += 2) {
1387 com_factor(c, CHILD(n, i));
1388 switch (TYPE(CHILD(n, i-1))) {
1389 case STAR:
1390 op = BINARY_MULTIPLY;
1391 break;
1392 case SLASH:
1393 op = BINARY_DIVIDE;
1394 break;
1395 case PERCENT:
1396 op = BINARY_MODULO;
1397 break;
1398 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001399 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001400 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001401 op = 255;
1402 }
1403 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001404 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001405 }
1406}
1407
1408static void
1409com_arith_expr(c, n)
1410 struct compiling *c;
1411 node *n;
1412{
1413 int i;
1414 int op;
1415 REQ(n, arith_expr);
1416 com_term(c, CHILD(n, 0));
1417 for (i = 2; i < NCH(n); i += 2) {
1418 com_term(c, CHILD(n, i));
1419 switch (TYPE(CHILD(n, i-1))) {
1420 case PLUS:
1421 op = BINARY_ADD;
1422 break;
1423 case MINUS:
1424 op = BINARY_SUBTRACT;
1425 break;
1426 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001427 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001428 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001429 op = 255;
1430 }
1431 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001432 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001433 }
1434}
1435
1436static void
1437com_shift_expr(c, n)
1438 struct compiling *c;
1439 node *n;
1440{
1441 int i;
1442 int op;
1443 REQ(n, shift_expr);
1444 com_arith_expr(c, CHILD(n, 0));
1445 for (i = 2; i < NCH(n); i += 2) {
1446 com_arith_expr(c, CHILD(n, i));
1447 switch (TYPE(CHILD(n, i-1))) {
1448 case LEFTSHIFT:
1449 op = BINARY_LSHIFT;
1450 break;
1451 case RIGHTSHIFT:
1452 op = BINARY_RSHIFT;
1453 break;
1454 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001455 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001456 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001457 op = 255;
1458 }
1459 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001460 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001461 }
1462}
1463
1464static void
1465com_and_expr(c, n)
1466 struct compiling *c;
1467 node *n;
1468{
1469 int i;
1470 int op;
1471 REQ(n, and_expr);
1472 com_shift_expr(c, CHILD(n, 0));
1473 for (i = 2; i < NCH(n); i += 2) {
1474 com_shift_expr(c, CHILD(n, i));
1475 if (TYPE(CHILD(n, i-1)) == AMPER) {
1476 op = BINARY_AND;
1477 }
1478 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001479 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001480 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001481 op = 255;
1482 }
1483 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001484 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001485 }
1486}
1487
1488static void
1489com_xor_expr(c, n)
1490 struct compiling *c;
1491 node *n;
1492{
1493 int i;
1494 int op;
1495 REQ(n, xor_expr);
1496 com_and_expr(c, CHILD(n, 0));
1497 for (i = 2; i < NCH(n); i += 2) {
1498 com_and_expr(c, CHILD(n, i));
1499 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1500 op = BINARY_XOR;
1501 }
1502 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001503 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001504 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001505 op = 255;
1506 }
1507 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001508 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001509 }
1510}
1511
1512static void
1513com_expr(c, n)
1514 struct compiling *c;
1515 node *n;
1516{
1517 int i;
1518 int op;
1519 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001520 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001521 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001522 com_xor_expr(c, CHILD(n, i));
1523 if (TYPE(CHILD(n, i-1)) == VBAR) {
1524 op = BINARY_OR;
1525 }
1526 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001527 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001528 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001529 op = 255;
1530 }
1531 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001532 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001533 }
1534}
1535
1536static enum cmp_op
1537cmp_type(n)
1538 node *n;
1539{
1540 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001541 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001542 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1543 if (NCH(n) == 1) {
1544 n = CHILD(n, 0);
1545 switch (TYPE(n)) {
1546 case LESS: return LT;
1547 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001548 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001549 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001550 case LESSEQUAL: return LE;
1551 case GREATEREQUAL: return GE;
1552 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001553 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1554 if (strcmp(STR(n), "is") == 0) return IS;
1555 }
1556 }
1557 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001558 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001559 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1560 return NOT_IN;
1561 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1562 return IS_NOT;
1563 }
1564 }
1565 return BAD;
1566}
1567
1568static void
1569com_comparison(c, n)
1570 struct compiling *c;
1571 node *n;
1572{
1573 int i;
1574 enum cmp_op op;
1575 int anchor;
1576 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1577 com_expr(c, CHILD(n, 0));
1578 if (NCH(n) == 1)
1579 return;
1580
1581 /****************************************************************
1582 The following code is generated for all but the last
1583 comparison in a chain:
1584
1585 label: on stack: opcode: jump to:
1586
1587 a <code to load b>
1588 a, b DUP_TOP
1589 a, b, b ROT_THREE
1590 b, a, b COMPARE_OP
1591 b, 0-or-1 JUMP_IF_FALSE L1
1592 b, 1 POP_TOP
1593 b
1594
1595 We are now ready to repeat this sequence for the next
1596 comparison in the chain.
1597
1598 For the last we generate:
1599
1600 b <code to load c>
1601 b, c COMPARE_OP
1602 0-or-1
1603
1604 If there were any jumps to L1 (i.e., there was more than one
1605 comparison), we generate:
1606
1607 0-or-1 JUMP_FORWARD L2
1608 L1: b, 0 ROT_TWO
1609 0, b POP_TOP
1610 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00001611 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001612 ****************************************************************/
1613
1614 anchor = 0;
1615
1616 for (i = 2; i < NCH(n); i += 2) {
1617 com_expr(c, CHILD(n, i));
1618 if (i+2 < NCH(n)) {
1619 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001620 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001621 com_addbyte(c, ROT_THREE);
1622 }
1623 op = cmp_type(CHILD(n, i-1));
1624 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001625 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001626 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001627 }
1628 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001629 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001630 if (i+2 < NCH(n)) {
1631 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1632 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001633 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001634 }
1635 }
1636
1637 if (anchor) {
1638 int anchor2 = 0;
1639 com_addfwref(c, JUMP_FORWARD, &anchor2);
1640 com_backpatch(c, anchor);
1641 com_addbyte(c, ROT_TWO);
1642 com_addbyte(c, POP_TOP);
1643 com_backpatch(c, anchor2);
1644 }
1645}
1646
1647static void
1648com_not_test(c, n)
1649 struct compiling *c;
1650 node *n;
1651{
1652 REQ(n, not_test); /* 'not' not_test | comparison */
1653 if (NCH(n) == 1) {
1654 com_comparison(c, CHILD(n, 0));
1655 }
1656 else {
1657 com_not_test(c, CHILD(n, 1));
1658 com_addbyte(c, UNARY_NOT);
1659 }
1660}
1661
1662static void
1663com_and_test(c, n)
1664 struct compiling *c;
1665 node *n;
1666{
1667 int i;
1668 int anchor;
1669 REQ(n, and_test); /* not_test ('and' not_test)* */
1670 anchor = 0;
1671 i = 0;
1672 for (;;) {
1673 com_not_test(c, CHILD(n, i));
1674 if ((i += 2) >= NCH(n))
1675 break;
1676 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1677 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001678 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001679 }
1680 if (anchor)
1681 com_backpatch(c, anchor);
1682}
1683
1684static void
1685com_test(c, n)
1686 struct compiling *c;
1687 node *n;
1688{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001689 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00001690 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001691 PyObject *v;
Guido van Rossum57531fe1993-11-30 14:57:42 +00001692 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001693 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001694 v = (PyObject *) icompile(CHILD(n, 0), c);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001695 if (v == NULL) {
1696 c->c_errors++;
1697 i = 255;
1698 }
1699 else {
1700 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001701 Py_DECREF(v);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001702 }
1703 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001704 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001705 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001706 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001707 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001708 else {
1709 int anchor = 0;
1710 int i = 0;
1711 for (;;) {
1712 com_and_test(c, CHILD(n, i));
1713 if ((i += 2) >= NCH(n))
1714 break;
1715 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1716 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001717 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001718 }
1719 if (anchor)
1720 com_backpatch(c, anchor);
1721 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001722}
1723
1724static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001725com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001726 struct compiling *c;
1727 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001728 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001729{
1730 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001731 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001732 com_node(c, CHILD(n, 0));
1733 }
1734 else {
1735 int i;
1736 int len;
1737 len = (NCH(n) + 1) / 2;
1738 for (i = 0; i < NCH(n); i += 2)
1739 com_node(c, CHILD(n, i));
1740 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001741 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001742 }
1743}
1744
1745
1746/* Begin of assignment compilation */
1747
Guido van Rossum79f25d91997-04-29 20:08:16 +00001748static void com_assign_name Py_PROTO((struct compiling *, node *, int));
1749static void com_assign Py_PROTO((struct compiling *, node *, int));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001750
1751static void
1752com_assign_attr(c, n, assigning)
1753 struct compiling *c;
1754 node *n;
1755 int assigning;
1756{
1757 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001758 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001759}
1760
1761static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001762com_assign_trailer(c, n, assigning)
1763 struct compiling *c;
1764 node *n;
1765 int assigning;
1766{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001767 REQ(n, trailer);
1768 switch (TYPE(CHILD(n, 0))) {
1769 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001770 com_error(c, PyExc_SyntaxError,
1771 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001772 break;
1773 case DOT: /* '.' NAME */
1774 com_assign_attr(c, CHILD(n, 1), assigning);
1775 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001776 case LSQB: /* '[' subscriptlist ']' */
1777 com_subscriptlist(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001778 break;
1779 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001780 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001781 }
1782}
1783
1784static void
1785com_assign_tuple(c, n, assigning)
1786 struct compiling *c;
1787 node *n;
1788 int assigning;
1789{
1790 int i;
1791 if (TYPE(n) != testlist)
1792 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001793 if (assigning) {
1794 i = (NCH(n)+1)/2;
1795 com_addoparg(c, UNPACK_TUPLE, i);
1796 com_push(c, i-1);
1797 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001798 for (i = 0; i < NCH(n); i += 2)
1799 com_assign(c, CHILD(n, i), assigning);
1800}
1801
1802static void
1803com_assign_list(c, n, assigning)
1804 struct compiling *c;
1805 node *n;
1806 int assigning;
1807{
1808 int i;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001809 if (assigning) {
1810 i = (NCH(n)+1)/2;
1811 com_addoparg(c, UNPACK_LIST, i);
1812 com_push(c, i-1);
1813 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001814 for (i = 0; i < NCH(n); i += 2)
1815 com_assign(c, CHILD(n, i), assigning);
1816}
1817
1818static void
1819com_assign_name(c, n, assigning)
1820 struct compiling *c;
1821 node *n;
1822 int assigning;
1823{
1824 REQ(n, NAME);
1825 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001826 if (assigning)
1827 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001828}
1829
1830static void
1831com_assign(c, n, assigning)
1832 struct compiling *c;
1833 node *n;
1834 int assigning;
1835{
1836 /* Loop to avoid trivial recursion */
1837 for (;;) {
1838 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001839
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001840 case exprlist:
1841 case testlist:
1842 if (NCH(n) > 1) {
1843 com_assign_tuple(c, n, assigning);
1844 return;
1845 }
1846 n = CHILD(n, 0);
1847 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001848
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001849 case test:
1850 case and_test:
1851 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001852 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001853 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001854 case xor_expr:
1855 case and_expr:
1856 case shift_expr:
1857 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001858 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00001859 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001860 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001861 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001862 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001863 return;
1864 }
1865 n = CHILD(n, 0);
1866 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001867
Guido van Rossum50564e81996-01-12 01:13:16 +00001868 case power: /* atom trailer* ('**' power)* */
1869/* ('+'|'-'|'~') factor | atom trailer* */
1870 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001871 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001872 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001873 return;
1874 }
Guido van Rossum50564e81996-01-12 01:13:16 +00001875 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001876 int i;
1877 com_node(c, CHILD(n, 0));
1878 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00001879 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001880 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001881 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00001882 return;
1883 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001884 com_apply_trailer(c, CHILD(n, i));
1885 } /* NB i is still alive */
1886 com_assign_trailer(c,
1887 CHILD(n, i), assigning);
1888 return;
1889 }
1890 n = CHILD(n, 0);
1891 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001892
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001893 case atom:
1894 switch (TYPE(CHILD(n, 0))) {
1895 case LPAR:
1896 n = CHILD(n, 1);
1897 if (TYPE(n) == RPAR) {
1898 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001899 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001900 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001901 return;
1902 }
1903 break;
1904 case LSQB:
1905 n = CHILD(n, 1);
1906 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001907 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001908 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001909 return;
1910 }
1911 com_assign_list(c, n, assigning);
1912 return;
1913 case NAME:
1914 com_assign_name(c, CHILD(n, 0), assigning);
1915 return;
1916 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001917 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001918 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001919 return;
1920 }
1921 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001922
1923 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001924 com_error(c, PyExc_SyntaxError,
1925 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001926 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001927
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001928 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001929 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001930 com_error(c, PyExc_SystemError,
1931 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001932 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001933
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001934 }
1935 }
1936}
Guido van Rossum7c531111997-03-11 18:42:21 +00001937
Guido van Rossum79f25d91997-04-29 20:08:16 +00001938/* Forward */ static node *get_rawdocstring Py_PROTO((node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001939
1940static void
1941com_expr_stmt(c, n)
1942 struct compiling *c;
1943 node *n;
1944{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001945 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001946 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001947 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001948 return;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001949 com_node(c, CHILD(n, NCH(n)-1));
1950 if (NCH(n) == 1) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001951 if (c->c_interactive)
1952 com_addbyte(c, PRINT_EXPR);
1953 else
1954 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001955 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001956 }
1957 else {
1958 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001959 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001960 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001961 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001962 com_push(c, 1);
1963 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001964 com_assign(c, CHILD(n, i), OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001965 }
1966 }
1967}
1968
1969static void
Guido van Rossum228d7f31997-04-02 05:24:36 +00001970com_assert_stmt(c, n)
1971 struct compiling *c;
1972 node *n;
1973{
1974 int a = 0, b = 0;
1975 int i;
1976 REQ(n, assert_stmt); /* 'assert' test [',' test] */
1977 /* Generate code like for
1978
1979 if __debug__:
1980 if not <test>:
1981 raise AssertionError [, <message>]
1982
1983 where <message> is the second test, if present.
1984 */
1985 if (Py_OptimizeFlag)
1986 return;
1987 com_addopnamestr(c, LOAD_GLOBAL, "__debug__");
1988 com_push(c, 1);
1989 com_addfwref(c, JUMP_IF_FALSE, &a);
1990 com_addbyte(c, POP_TOP);
1991 com_pop(c, 1);
1992 com_node(c, CHILD(n, 1));
1993 com_addfwref(c, JUMP_IF_TRUE, &b);
1994 com_addbyte(c, POP_TOP);
1995 com_pop(c, 1);
1996 /* Raise that exception! */
1997 com_addopnamestr(c, LOAD_GLOBAL, "AssertionError");
1998 com_push(c, 1);
1999 i = NCH(n)/2; /* Either 2 or 4 */
2000 if (i > 1)
2001 com_node(c, CHILD(n, 3));
2002 com_addoparg(c, RAISE_VARARGS, i);
2003 com_pop(c, i);
2004 /* The interpreter does not fall through */
2005 /* All jumps converge here */
2006 com_backpatch(c, a);
2007 com_backpatch(c, b);
2008 com_addbyte(c, POP_TOP);
2009}
2010
2011static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002012com_print_stmt(c, n)
2013 struct compiling *c;
2014 node *n;
2015{
2016 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002017 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
2018 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002019 com_node(c, CHILD(n, i));
2020 com_addbyte(c, PRINT_ITEM);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002021 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002022 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002023 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002024 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002025 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002026}
2027
2028static void
2029com_return_stmt(c, n)
2030 struct compiling *c;
2031 node *n;
2032{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002033 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002034 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002035 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002036 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002037 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002038 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002039 com_push(c, 1);
2040 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002041 else
2042 com_node(c, CHILD(n, 1));
2043 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002044 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002045}
2046
2047static void
2048com_raise_stmt(c, n)
2049 struct compiling *c;
2050 node *n;
2051{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002052 int i;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002053 REQ(n, raise_stmt); /* 'raise' test [',' test [',' test]] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002054 com_node(c, CHILD(n, 1));
Guido van Rossum681d79a1995-07-18 14:51:37 +00002055 if (NCH(n) > 3) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002056 com_node(c, CHILD(n, 3));
Guido van Rossum681d79a1995-07-18 14:51:37 +00002057 if (NCH(n) > 5)
2058 com_node(c, CHILD(n, 5));
Guido van Rossumf10570b1995-07-07 22:53:21 +00002059 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002060 i = NCH(n)/2;
2061 com_addoparg(c, RAISE_VARARGS, i);
2062 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002063}
2064
2065static void
2066com_import_stmt(c, n)
2067 struct compiling *c;
2068 node *n;
2069{
2070 int i;
2071 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002072 /* 'import' dotted_name (',' dotted_name)* |
2073 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002074 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002075 /* 'from' dotted_name 'import' ... */
2076 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002077 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002078 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002079 for (i = 3; i < NCH(n); i += 2)
2080 com_addopname(c, IMPORT_FROM, CHILD(n, i));
2081 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002082 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002083 }
2084 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002085 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002086 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002087 REQ(CHILD(n, i), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002088 com_addopname(c, IMPORT_NAME, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002089 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002090 com_addopname(c, STORE_NAME, CHILD(CHILD(n, i), 0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002091 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002092 }
2093 }
2094}
2095
2096static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00002097com_global_stmt(c, n)
2098 struct compiling *c;
2099 node *n;
2100{
2101 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002102 REQ(n, global_stmt);
2103 /* 'global' NAME (',' NAME)* */
2104 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002105 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002106#ifdef PRIVATE_NAME_MANGLING
2107 char buffer[256];
2108 if (s != NULL && s[0] == '_' && s[1] == '_' &&
2109 c->c_private != NULL &&
2110 com_mangle(c, s, buffer, (int)sizeof(buffer)))
2111 s = buffer;
2112#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +00002113 if (PyDict_GetItemString(c->c_locals, s) != NULL) {
2114 com_error(c, PyExc_SyntaxError,
2115 "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002116 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002117 else if (PyDict_SetItemString(c->c_globals, s, Py_None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002118 c->c_errors++;
2119 }
2120}
2121
Guido van Rossum681d79a1995-07-18 14:51:37 +00002122static int
2123com_newlocal_o(c, nameval)
2124 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002125 PyObject *nameval;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002126{
2127 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002128 PyObject *ival;
2129 if (PyList_Size(c->c_varnames) != c->c_nlocals) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002130 /* This is usually caused by an error on a previous call */
2131 if (c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002132 com_error(c, PyExc_SystemError,
2133 "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002134 }
2135 return 0;
2136 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002137 ival = PyInt_FromLong(i = c->c_nlocals++);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002138 if (ival == NULL)
2139 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002140 else if (PyDict_SetItem(c->c_locals, nameval, ival) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002141 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002142 else if (PyList_Append(c->c_varnames, nameval) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002143 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002144 Py_XDECREF(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002145 return i;
2146}
2147
2148static int
2149com_addlocal_o(c, nameval)
2150 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002151 PyObject *nameval;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002152{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002153 PyObject *ival = PyDict_GetItem(c->c_locals, nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002154 if (ival != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002155 return PyInt_AsLong(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002156 return com_newlocal_o(c, nameval);
2157}
2158
2159static int
2160com_newlocal(c, name)
2161 struct compiling *c;
2162 char *name;
2163{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002164 PyObject *nameval = PyString_InternFromString(name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002165 int i;
2166 if (nameval == NULL) {
2167 c->c_errors++;
2168 return 0;
2169 }
2170 i = com_newlocal_o(c, nameval);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002171 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002172 return i;
2173}
2174
Guido van Rossumc5e96291991-12-10 13:53:51 +00002175static void
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002176com_exec_stmt(c, n)
2177 struct compiling *c;
2178 node *n;
2179{
2180 REQ(n, exec_stmt);
2181 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2182 com_node(c, CHILD(n, 1));
2183 if (NCH(n) >= 4)
2184 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002185 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002186 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002187 com_push(c, 1);
2188 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002189 if (NCH(n) >= 6)
2190 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002191 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002192 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002193 com_push(c, 1);
2194 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002195 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002196 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002197}
2198
Guido van Rossum7c531111997-03-11 18:42:21 +00002199static int
2200is_constant_false(c, n)
2201 struct compiling *c;
2202 node *n;
2203{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002204 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002205 int i;
2206
2207 /* Label to avoid tail recursion */
2208 next:
2209 switch (TYPE(n)) {
2210
2211 case suite:
2212 if (NCH(n) == 1) {
2213 n = CHILD(n, 0);
2214 goto next;
2215 }
2216 /* Fall through */
2217 case file_input:
2218 for (i = 0; i < NCH(n); i++) {
2219 node *ch = CHILD(n, i);
2220 if (TYPE(ch) == stmt) {
2221 n = ch;
2222 goto next;
2223 }
2224 }
2225 break;
2226
2227 case stmt:
2228 case simple_stmt:
2229 case small_stmt:
2230 n = CHILD(n, 0);
2231 goto next;
2232
2233 case expr_stmt:
2234 case testlist:
2235 case test:
2236 case and_test:
2237 case not_test:
2238 case comparison:
2239 case expr:
2240 case xor_expr:
2241 case and_expr:
2242 case shift_expr:
2243 case arith_expr:
2244 case term:
2245 case factor:
2246 case power:
2247 case atom:
2248 if (NCH(n) == 1) {
2249 n = CHILD(n, 0);
2250 goto next;
2251 }
2252 break;
2253
2254 case NAME:
2255 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2256 return 1;
2257 break;
2258
2259 case NUMBER:
2260 v = parsenumber(c, STR(n));
2261 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002262 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002263 break;
2264 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002265 i = PyObject_IsTrue(v);
2266 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002267 return i == 0;
2268
2269 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002270 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002271 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002272 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002273 break;
2274 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002275 i = PyObject_IsTrue(v);
2276 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002277 return i == 0;
2278
2279 }
2280 return 0;
2281}
2282
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002283static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002284com_if_stmt(c, n)
2285 struct compiling *c;
2286 node *n;
2287{
2288 int i;
2289 int anchor = 0;
2290 REQ(n, if_stmt);
2291 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2292 for (i = 0; i+3 < NCH(n); i+=4) {
2293 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002294 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002295 if (is_constant_false(c, ch))
2296 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002297 if (i > 0)
2298 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002299 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002300 com_addfwref(c, JUMP_IF_FALSE, &a);
2301 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002302 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002303 com_node(c, CHILD(n, i+3));
2304 com_addfwref(c, JUMP_FORWARD, &anchor);
2305 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002306 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002307 com_addbyte(c, POP_TOP);
2308 }
2309 if (i+2 < NCH(n))
2310 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002311 if (anchor)
2312 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002313}
2314
2315static void
2316com_while_stmt(c, n)
2317 struct compiling *c;
2318 node *n;
2319{
2320 int break_anchor = 0;
2321 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002322 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002323 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2324 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002325 block_push(c, SETUP_LOOP);
2326 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002327 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002328 com_node(c, CHILD(n, 1));
2329 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2330 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002331 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002332 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002333 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002334 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002335 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2336 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002337 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002338 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002339 com_addbyte(c, POP_TOP);
2340 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002341 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002342 if (NCH(n) > 4)
2343 com_node(c, CHILD(n, 6));
2344 com_backpatch(c, break_anchor);
2345}
2346
2347static void
2348com_for_stmt(c, n)
2349 struct compiling *c;
2350 node *n;
2351{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002352 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002353 int break_anchor = 0;
2354 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002355 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002356 REQ(n, for_stmt);
2357 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2358 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002359 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002360 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002361 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002362 if (v == NULL)
2363 c->c_errors++;
2364 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002365 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002366 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002367 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002368 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002369 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002370 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002371 com_assign(c, CHILD(n, 1), OP_ASSIGN);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002372 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002373 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002374 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002375 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2376 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002377 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002378 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002379 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002380 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002381 if (NCH(n) > 8)
2382 com_node(c, CHILD(n, 8));
2383 com_backpatch(c, break_anchor);
2384}
2385
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002386/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002387
2388 SETUP_FINALLY L
2389 <code for S>
2390 POP_BLOCK
2391 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002392 L: <code for Sf>
2393 END_FINALLY
2394
2395 The special instructions use the block stack. Each block
2396 stack entry contains the instruction that created it (here
2397 SETUP_FINALLY), the level of the value stack at the time the
2398 block stack entry was created, and a label (here L).
2399
2400 SETUP_FINALLY:
2401 Pushes the current value stack level and the label
2402 onto the block stack.
2403 POP_BLOCK:
2404 Pops en entry from the block stack, and pops the value
2405 stack until its level is the same as indicated on the
2406 block stack. (The label is ignored.)
2407 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002408 Pops a variable number of entries from the *value* stack
2409 and re-raises the exception they specify. The number of
2410 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002411
2412 The block stack is unwound when an exception is raised:
2413 when a SETUP_FINALLY entry is found, the exception is pushed
2414 onto the value stack (and the exception condition is cleared),
2415 and the interpreter jumps to the label gotten from the block
2416 stack.
2417
2418 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002419 (The contents of the value stack is shown in [], with the top
2420 at the right; 'tb' is trace-back info, 'val' the exception's
2421 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002422
2423 Value stack Label Instruction Argument
2424 [] SETUP_EXCEPT L1
2425 [] <code for S>
2426 [] POP_BLOCK
2427 [] JUMP_FORWARD L0
2428
Guido van Rossum3f5da241990-12-20 15:06:42 +00002429 [tb, val, exc] L1: DUP )
2430 [tb, val, exc, exc] <evaluate E1> )
2431 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2432 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2433 [tb, val, exc, 1] POP )
2434 [tb, val, exc] POP
2435 [tb, val] <assign to V1> (or POP if no V1)
2436 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002437 [] <code for S1>
2438 JUMP_FORWARD L0
2439
Guido van Rossum3f5da241990-12-20 15:06:42 +00002440 [tb, val, exc, 0] L2: POP
2441 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002442 .............................etc.......................
2443
Guido van Rossum3f5da241990-12-20 15:06:42 +00002444 [tb, val, exc, 0] Ln+1: POP
2445 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002446
2447 [] L0: <next statement>
2448
2449 Of course, parts are not generated if Vi or Ei is not present.
2450*/
2451
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002452static void
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002453com_try_except(c, n)
2454 struct compiling *c;
2455 node *n;
2456{
2457 int except_anchor = 0;
2458 int end_anchor = 0;
2459 int else_anchor = 0;
2460 int i;
2461 node *ch;
2462
2463 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2464 block_push(c, SETUP_EXCEPT);
2465 com_node(c, CHILD(n, 2));
2466 com_addbyte(c, POP_BLOCK);
2467 block_pop(c, SETUP_EXCEPT);
2468 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2469 com_backpatch(c, except_anchor);
2470 for (i = 3;
2471 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2472 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002473 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002474 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002475 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002476 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002477 break;
2478 }
2479 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002480 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002481 com_addoparg(c, SET_LINENO, ch->n_lineno);
2482 if (NCH(ch) > 1) {
2483 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002484 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002485 com_node(c, CHILD(ch, 1));
2486 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002487 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002488 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2489 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002490 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002491 }
2492 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002493 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002494 if (NCH(ch) > 3)
Guido van Rossum8861b741996-07-30 16:49:37 +00002495 com_assign(c, CHILD(ch, 3), OP_ASSIGN);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002496 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002497 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002498 com_pop(c, 1);
2499 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002500 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002501 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002502 com_node(c, CHILD(n, i+2));
2503 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2504 if (except_anchor) {
2505 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002506 /* We come in with [tb, val, exc, 0] on the
2507 stack; one pop and it's the same as
2508 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002509 com_addbyte(c, POP_TOP);
2510 }
2511 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002512 /* We actually come in here with [tb, val, exc] but the
2513 END_FINALLY will zap those and jump around.
2514 The c_stacklevel does not reflect them so we need not pop
2515 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002516 com_addbyte(c, END_FINALLY);
2517 com_backpatch(c, else_anchor);
2518 if (i < NCH(n))
2519 com_node(c, CHILD(n, i+2));
2520 com_backpatch(c, end_anchor);
2521}
2522
2523static void
2524com_try_finally(c, n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002525 struct compiling *c;
2526 node *n;
2527{
2528 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002529 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002530
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002531 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2532 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002533 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002534 com_addbyte(c, POP_BLOCK);
2535 block_pop(c, SETUP_FINALLY);
2536 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002537 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002538 /* While the generated code pushes only one item,
2539 the try-finally handling can enter here with
2540 up to three items. OK, here are the details:
2541 3 for an exception, 2 for RETURN, 1 for BREAK. */
2542 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002543 com_backpatch(c, finally_anchor);
2544 ch = CHILD(n, NCH(n)-1);
2545 com_addoparg(c, SET_LINENO, ch->n_lineno);
2546 com_node(c, ch);
2547 com_addbyte(c, END_FINALLY);
2548 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002549 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002550}
2551
2552static void
2553com_try_stmt(c, n)
2554 struct compiling *c;
2555 node *n;
2556{
2557 REQ(n, try_stmt);
2558 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2559 | 'try' ':' suite 'finally' ':' suite */
2560 if (TYPE(CHILD(n, 3)) != except_clause)
2561 com_try_finally(c, n);
2562 else
2563 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002564}
2565
Guido van Rossum8b993a91997-01-17 21:04:03 +00002566static node *
2567get_rawdocstring(n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002568 node *n;
2569{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002570 int i;
2571
Guido van Rossum8b993a91997-01-17 21:04:03 +00002572 /* Label to avoid tail recursion */
2573 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002574 switch (TYPE(n)) {
2575
2576 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002577 if (NCH(n) == 1) {
2578 n = CHILD(n, 0);
2579 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002580 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002581 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002582 case file_input:
2583 for (i = 0; i < NCH(n); i++) {
2584 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002585 if (TYPE(ch) == stmt) {
2586 n = ch;
2587 goto next;
2588 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002589 }
2590 break;
2591
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002592 case stmt:
2593 case simple_stmt:
2594 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002595 n = CHILD(n, 0);
2596 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002597
2598 case expr_stmt:
2599 case testlist:
2600 case test:
2601 case and_test:
2602 case not_test:
2603 case comparison:
2604 case expr:
2605 case xor_expr:
2606 case and_expr:
2607 case shift_expr:
2608 case arith_expr:
2609 case term:
2610 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002611 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002612 if (NCH(n) == 1) {
2613 n = CHILD(n, 0);
2614 goto next;
2615 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002616 break;
2617
2618 case atom:
2619 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002620 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002621 break;
2622
2623 }
2624 return NULL;
2625}
2626
Guido van Rossum79f25d91997-04-29 20:08:16 +00002627static PyObject *
Guido van Rossum8b993a91997-01-17 21:04:03 +00002628get_docstring(n)
2629 node *n;
2630{
2631 n = get_rawdocstring(n);
2632 if (n == NULL)
2633 return NULL;
2634 return parsestrplus(n);
2635}
2636
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002637static void
2638com_suite(c, n)
2639 struct compiling *c;
2640 node *n;
2641{
2642 REQ(n, suite);
2643 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2644 if (NCH(n) == 1) {
2645 com_node(c, CHILD(n, 0));
2646 }
2647 else {
2648 int i;
2649 for (i = 0; i < NCH(n); i++) {
2650 node *ch = CHILD(n, i);
2651 if (TYPE(ch) == stmt)
2652 com_node(c, ch);
2653 }
2654 }
2655}
2656
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002657/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002658static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002659com_continue_stmt(c, n)
2660 struct compiling *c;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002661 node *n; /* Not used, but passed for consistency */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002662{
2663 int i = c->c_nblocks;
2664 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2665 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2666 }
2667 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002668 com_error(c, PyExc_SyntaxError,
2669 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002670 }
2671 /* XXX Could allow it inside a 'finally' clause
2672 XXX if we could pop the exception still on the stack */
2673}
2674
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002675static int
Guido van Rossum681d79a1995-07-18 14:51:37 +00002676com_argdefs(c, n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002677 struct compiling *c;
2678 node *n;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002679{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002680 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002681 if (TYPE(n) == lambdef) {
2682 /* lambdef: 'lambda' [varargslist] ':' test */
2683 n = CHILD(n, 1);
2684 }
2685 else {
2686 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2687 n = CHILD(n, 2);
2688 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2689 n = CHILD(n, 1);
2690 }
2691 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002692 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002693 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002694 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002695 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2696 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002697 nargs = 0;
2698 ndefs = 0;
2699 for (i = 0; i < nch; i++) {
2700 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002701 if (TYPE(CHILD(n, i)) == STAR ||
2702 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002703 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002704 nargs++;
2705 i++;
2706 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002707 t = RPAR; /* Anything except EQUAL or COMMA */
2708 else
2709 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002710 if (t == EQUAL) {
2711 i++;
2712 ndefs++;
2713 com_node(c, CHILD(n, i));
2714 i++;
2715 if (i >= nch)
2716 break;
2717 t = TYPE(CHILD(n, i));
2718 }
2719 else {
2720 /* Treat "(a=1, b)" as "(a=1, b=None)" */
2721 if (ndefs) {
2722 com_addoparg(c, LOAD_CONST,
Guido van Rossum79f25d91997-04-29 20:08:16 +00002723 com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002724 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002725 ndefs++;
2726 }
2727 }
2728 if (t != COMMA)
2729 break;
2730 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002731 return ndefs;
2732}
2733
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002734static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002735com_funcdef(c, n)
2736 struct compiling *c;
2737 node *n;
2738{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002739 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002740 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002741 v = (PyObject *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002742 if (v == NULL)
2743 c->c_errors++;
2744 else {
2745 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002746 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002747 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002748 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002749 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002750 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002751 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002752 com_pop(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002753 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002754 }
2755}
2756
2757static void
Guido van Rossum25831651993-05-19 14:50:45 +00002758com_bases(c, n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002759 struct compiling *c;
2760 node *n;
2761{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002762 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002763 REQ(n, testlist);
2764 /* testlist: test (',' test)* [','] */
2765 for (i = 0; i < NCH(n); i += 2)
2766 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002767 i = (NCH(n)+1) / 2;
2768 com_addoparg(c, BUILD_TUPLE, i);
2769 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00002770}
2771
2772static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002773com_classdef(c, n)
2774 struct compiling *c;
2775 node *n;
2776{
Guido van Rossum25831651993-05-19 14:50:45 +00002777 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002778 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002779 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002780 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00002781 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00002782 c->c_errors++;
2783 return;
2784 }
2785 /* Push the class name on the stack */
2786 i = com_addconst(c, v);
2787 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002788 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002789 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00002790 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002791 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00002792 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002793 com_push(c, 1);
2794 }
Guido van Rossum25831651993-05-19 14:50:45 +00002795 else
2796 com_bases(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002797 v = (PyObject *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002798 if (v == NULL)
2799 c->c_errors++;
2800 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002801 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002802 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002803 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002804 com_addoparg(c, MAKE_FUNCTION, 0);
2805 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002806 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002807 com_pop(c, 2);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002808 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002809 Py_DECREF(v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002810 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002811}
2812
2813static void
2814com_node(c, n)
2815 struct compiling *c;
2816 node *n;
2817{
2818 switch (TYPE(n)) {
2819
2820 /* Definition nodes */
2821
2822 case funcdef:
2823 com_funcdef(c, n);
2824 break;
2825 case classdef:
2826 com_classdef(c, n);
2827 break;
2828
2829 /* Trivial parse tree nodes */
2830
2831 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002832 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002833 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002834 com_node(c, CHILD(n, 0));
2835 break;
2836
2837 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002838 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2839 com_addoparg(c, SET_LINENO, n->n_lineno);
2840 {
2841 int i;
2842 for (i = 0; i < NCH(n)-1; i += 2)
2843 com_node(c, CHILD(n, i));
2844 }
2845 break;
2846
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002847 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002848 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002849 com_node(c, CHILD(n, 0));
2850 break;
2851
2852 /* Statement nodes */
2853
2854 case expr_stmt:
2855 com_expr_stmt(c, n);
2856 break;
2857 case print_stmt:
2858 com_print_stmt(c, n);
2859 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002860 case del_stmt: /* 'del' exprlist */
Guido van Rossum8861b741996-07-30 16:49:37 +00002861 com_assign(c, CHILD(n, 1), OP_DELETE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002862 break;
2863 case pass_stmt:
2864 break;
2865 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002866 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002867 com_error(c, PyExc_SyntaxError,
2868 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002869 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002870 com_addbyte(c, BREAK_LOOP);
2871 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002872 case continue_stmt:
2873 com_continue_stmt(c, n);
2874 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002875 case return_stmt:
2876 com_return_stmt(c, n);
2877 break;
2878 case raise_stmt:
2879 com_raise_stmt(c, n);
2880 break;
2881 case import_stmt:
2882 com_import_stmt(c, n);
2883 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002884 case global_stmt:
2885 com_global_stmt(c, n);
2886 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002887 case exec_stmt:
2888 com_exec_stmt(c, n);
2889 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002890 case assert_stmt:
2891 com_assert_stmt(c, n);
2892 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002893 case if_stmt:
2894 com_if_stmt(c, n);
2895 break;
2896 case while_stmt:
2897 com_while_stmt(c, n);
2898 break;
2899 case for_stmt:
2900 com_for_stmt(c, n);
2901 break;
2902 case try_stmt:
2903 com_try_stmt(c, n);
2904 break;
2905 case suite:
2906 com_suite(c, n);
2907 break;
2908
2909 /* Expression nodes */
2910
2911 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002912 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002913 break;
2914 case test:
2915 com_test(c, n);
2916 break;
2917 case and_test:
2918 com_and_test(c, n);
2919 break;
2920 case not_test:
2921 com_not_test(c, n);
2922 break;
2923 case comparison:
2924 com_comparison(c, n);
2925 break;
2926 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002927 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002928 break;
2929 case expr:
2930 com_expr(c, n);
2931 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002932 case xor_expr:
2933 com_xor_expr(c, n);
2934 break;
2935 case and_expr:
2936 com_and_expr(c, n);
2937 break;
2938 case shift_expr:
2939 com_shift_expr(c, n);
2940 break;
2941 case arith_expr:
2942 com_arith_expr(c, n);
2943 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002944 case term:
2945 com_term(c, n);
2946 break;
2947 case factor:
2948 com_factor(c, n);
2949 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00002950 case power:
2951 com_power(c, n);
2952 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002953 case atom:
2954 com_atom(c, n);
2955 break;
2956
2957 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002958 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002959 com_error(c, PyExc_SystemError,
2960 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002961 }
2962}
2963
Guido van Rossum79f25d91997-04-29 20:08:16 +00002964static void com_fplist Py_PROTO((struct compiling *, node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002965
2966static void
2967com_fpdef(c, n)
2968 struct compiling *c;
2969 node *n;
2970{
2971 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
2972 if (TYPE(CHILD(n, 0)) == LPAR)
2973 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002974 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002975 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002976 com_pop(c, 1);
2977 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002978}
2979
2980static void
2981com_fplist(c, n)
2982 struct compiling *c;
2983 node *n;
2984{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00002985 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002986 if (NCH(n) == 1) {
2987 com_fpdef(c, CHILD(n, 0));
2988 }
2989 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002990 int i = (NCH(n)+1)/2;
2991 com_addoparg(c, UNPACK_TUPLE, i);
2992 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002993 for (i = 0; i < NCH(n); i += 2)
2994 com_fpdef(c, CHILD(n, i));
2995 }
2996}
2997
2998static void
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002999com_arglist(c, n)
3000 struct compiling *c;
3001 node *n;
3002{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003003 int nch, i;
3004 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003005 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003006 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003007 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003008 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003009 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003010 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003011 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003012 node *ch = CHILD(n, i);
3013 node *fp;
3014 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00003015 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003016 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003017 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3018 fp = CHILD(ch, 0);
3019 if (TYPE(fp) == NAME)
3020 name = STR(fp);
3021 else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003022 name = nbuf;
3023 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003024 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003025 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003026 com_newlocal(c, name);
3027 c->c_argcount++;
3028 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003029 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003030 ch = CHILD(n, i);
3031 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003032 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003033 else
3034 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003035 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003036 /* Handle *arguments */
3037 if (i < nch) {
3038 node *ch;
3039 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003040 if (TYPE(ch) != DOUBLESTAR) {
3041 REQ(ch, STAR);
3042 ch = CHILD(n, i+1);
3043 if (TYPE(ch) == NAME) {
3044 c->c_flags |= CO_VARARGS;
3045 i += 3;
3046 com_newlocal(c, STR(ch));
3047 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003048 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003049 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003050 /* Handle **keywords */
3051 if (i < nch) {
3052 node *ch;
3053 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003054 if (TYPE(ch) != DOUBLESTAR) {
3055 REQ(ch, STAR);
3056 ch = CHILD(n, i+1);
3057 REQ(ch, STAR);
3058 ch = CHILD(n, i+2);
3059 }
3060 else
3061 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003062 REQ(ch, NAME);
3063 c->c_flags |= CO_VARKEYWORDS;
3064 com_newlocal(c, STR(ch));
3065 }
3066 if (complex) {
3067 /* Generate code for complex arguments only after
3068 having counted the simple arguments */
3069 int ilocal = 0;
3070 for (i = 0; i < nch; i++) {
3071 node *ch = CHILD(n, i);
3072 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003073 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003074 break;
3075 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3076 fp = CHILD(ch, 0);
3077 if (TYPE(fp) != NAME) {
3078 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003079 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003080 com_fpdef(c, ch);
3081 }
3082 ilocal++;
3083 if (++i >= nch)
3084 break;
3085 ch = CHILD(n, i);
3086 if (TYPE(ch) == EQUAL)
3087 i += 2;
3088 else
3089 REQ(ch, COMMA);
3090 }
3091 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003092}
3093
3094static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003095com_file_input(c, n)
3096 struct compiling *c;
3097 node *n;
3098{
3099 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003100 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003101 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003102 doc = get_docstring(n);
3103 if (doc != NULL) {
3104 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003105 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003106 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003107 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003108 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003109 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003110 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003111 for (i = 0; i < NCH(n); i++) {
3112 node *ch = CHILD(n, i);
3113 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3114 com_node(c, ch);
3115 }
3116}
3117
3118/* Top-level compile-node interface */
3119
3120static void
3121compile_funcdef(c, n)
3122 struct compiling *c;
3123 node *n;
3124{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003125 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003126 node *ch;
3127 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003128 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003129 doc = get_docstring(CHILD(n, 4));
3130 if (doc != NULL) {
3131 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003132 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003133 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003134 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003135 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003136 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3137 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003138 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003139 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003140 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003141 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003142 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003143 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003144 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003145 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003146 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003147}
3148
3149static void
Guido van Rossum590baa41993-11-30 13:40:46 +00003150compile_lambdef(c, n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003151 struct compiling *c;
3152 node *n;
3153{
Guido van Rossum590baa41993-11-30 13:40:46 +00003154 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003155 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003156 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003157
3158 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003159 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003160 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003161 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003162 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003163 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003164 else
3165 ch = CHILD(n, 2);
3166 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003167 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003168 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003169}
3170
3171static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003172compile_classdef(c, n)
3173 struct compiling *c;
3174 node *n;
3175{
3176 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003177 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003178 REQ(n, classdef);
3179 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3180 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003181#ifdef PRIVATE_NAME_MANGLING
3182 c->c_private = c->c_name;
3183#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003184 ch = CHILD(n, NCH(n)-1); /* The suite */
3185 doc = get_docstring(ch);
3186 if (doc != NULL) {
3187 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003188 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003189 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003190 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003191 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003192 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003193 }
3194 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003195 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003196 com_node(c, ch);
3197 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003198 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003199 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003200 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003201}
3202
3203static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003204compile_node(c, n)
3205 struct compiling *c;
3206 node *n;
3207{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003208 com_addoparg(c, SET_LINENO, n->n_lineno);
3209
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003210 switch (TYPE(n)) {
3211
Guido van Rossum4c417781991-01-21 16:09:22 +00003212 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003213 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003214 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003215 n = CHILD(n, 0);
3216 if (TYPE(n) != NEWLINE)
3217 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003218 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003219 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003220 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003221 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003222 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003223 break;
3224
Guido van Rossum4c417781991-01-21 16:09:22 +00003225 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003226 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003227 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003228 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003229 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003230 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003231 break;
3232
Guido van Rossum590baa41993-11-30 13:40:46 +00003233 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003234 com_node(c, CHILD(n, 0));
3235 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003236 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003237 break;
3238
Guido van Rossum590baa41993-11-30 13:40:46 +00003239 case lambdef: /* anonymous function definition */
3240 compile_lambdef(c, n);
3241 break;
3242
Guido van Rossum4c417781991-01-21 16:09:22 +00003243 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003244 compile_funcdef(c, n);
3245 break;
3246
Guido van Rossum4c417781991-01-21 16:09:22 +00003247 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003248 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003249 break;
3250
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003251 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003252 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003253 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003254 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003255 }
3256}
3257
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003258/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00003259
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003260 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
3261 instructions that refer to local variables with LOAD_FAST etc.
3262 The latter instructions are much faster because they don't need to
3263 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003264
Guido van Rossum681d79a1995-07-18 14:51:37 +00003265 To find all local variables, we check all STORE_NAME, IMPORT_FROM
3266 and DELETE_NAME instructions. This yields all local variables,
3267 function definitions, class definitions and import statements.
3268 Argument names have already been entered into the list by the
3269 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003270
3271 All remaining LOAD_NAME instructions must refer to non-local (global
3272 or builtin) variables, so are replaced by LOAD_GLOBAL.
3273
3274 There are two problems: 'from foo import *' and 'exec' may introduce
3275 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00003276 case, we can still optimize bona fide locals (since those
3277 statements will be surrounded by fast_2_locals() and
3278 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003279
Guido van Rossum681d79a1995-07-18 14:51:37 +00003280 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00003281
3282static void
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003283optimize(c)
3284 struct compiling *c;
Guido van Rossum282914b1991-04-04 10:42:56 +00003285{
Guido van Rossum0a697f61991-04-16 08:39:12 +00003286 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00003287 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00003288 int oparg = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003289 PyObject *name;
3290 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003291
Guido van Rossum282914b1991-04-04 10:42:56 +00003292#define NEXTOP() (*next_instr++)
3293#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossum79f25d91997-04-29 20:08:16 +00003294#define GETITEM(v, i) (PyList_GetItem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003295#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
3296
Guido van Rossum79f25d91997-04-29 20:08:16 +00003297 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003298
3299 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00003300
Guido van Rossum79f25d91997-04-29 20:08:16 +00003301 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003302 for (;;) {
3303 opcode = NEXTOP();
3304 if (opcode == STOP_CODE)
3305 break;
3306 if (HAS_ARG(opcode))
3307 oparg = NEXTARG();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003308 switch (opcode) {
3309 case STORE_NAME:
3310 case DELETE_NAME:
3311 case IMPORT_FROM:
3312 com_addlocal_o(c, GETNAMEOBJ(oparg));
3313 break;
3314 case EXEC_STMT:
3315 c->c_flags &= ~CO_OPTIMIZED;
3316 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00003317 }
3318 }
3319
Guido van Rossum79f25d91997-04-29 20:08:16 +00003320 if (PyDict_GetItemString(c->c_locals, "*") != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003321 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003322
Guido van Rossum79f25d91997-04-29 20:08:16 +00003323 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003324 for (;;) {
3325 cur_instr = next_instr;
3326 opcode = NEXTOP();
3327 if (opcode == STOP_CODE)
3328 break;
3329 if (HAS_ARG(opcode))
3330 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003331 if (opcode == LOAD_NAME ||
3332 opcode == STORE_NAME ||
3333 opcode == DELETE_NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003334 PyObject *v;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003335 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00003336 name = GETNAMEOBJ(oparg);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003337 v = PyDict_GetItem(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003338 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003339 PyErr_Clear();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003340 if (opcode == LOAD_NAME &&
3341 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003342 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003343 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00003344 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003345 i = PyInt_AsLong(v);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003346 switch (opcode) {
3347 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
3348 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
3349 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
3350 }
3351 cur_instr[1] = i & 0xff;
3352 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00003353 }
3354 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003355
Guido van Rossum681d79a1995-07-18 14:51:37 +00003356 if (c->c_errors == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00003357 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00003358}
3359
Guido van Rossum79f25d91997-04-29 20:08:16 +00003360PyCodeObject *
3361PyNode_Compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003362 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003363 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003364{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003365 return jcompile(n, filename, NULL);
3366}
3367
Guido van Rossum79f25d91997-04-29 20:08:16 +00003368static PyCodeObject *
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003369icompile(n, base)
3370 node *n;
3371 struct compiling *base;
3372{
3373 return jcompile(n, base->c_filename, base);
3374}
3375
Guido van Rossum79f25d91997-04-29 20:08:16 +00003376static PyCodeObject *
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003377jcompile(n, filename, base)
3378 node *n;
3379 char *filename;
3380 struct compiling *base;
3381{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003382 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003383 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003384 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003385 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003386#ifdef PRIVATE_NAME_MANGLING
3387 if (base)
3388 sc.c_private = base->c_private;
3389 else
3390 sc.c_private = NULL;
3391#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003392 compile_node(&sc, n);
3393 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003394 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003395 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003396 sc.c_flags |= CO_NEWLOCALS;
3397 }
3398 else if (TYPE(n) == classdef)
3399 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00003400 co = NULL;
3401 if (sc.c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003402 PyObject *consts, *names, *varnames, *filename, *name;
3403 consts = PyList_AsTuple(sc.c_consts);
3404 names = PyList_AsTuple(sc.c_names);
3405 varnames = PyList_AsTuple(sc.c_varnames);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003406 filename = PyString_InternFromString(sc.c_filename);
3407 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003408 if (!PyErr_Occurred())
3409 co = PyCode_New(sc.c_argcount,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003410 sc.c_nlocals,
Guido van Rossum8b993a91997-01-17 21:04:03 +00003411 sc.c_maxstacklevel,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003412 sc.c_flags,
3413 sc.c_code,
3414 consts,
3415 names,
3416 varnames,
3417 filename,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003418 name,
3419 sc.c_firstlineno,
3420 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003421 Py_XDECREF(consts);
3422 Py_XDECREF(names);
3423 Py_XDECREF(varnames);
3424 Py_XDECREF(filename);
3425 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003426 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003427 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003428 return co;
3429}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003430
3431int
3432PyCode_Addr2Line(co, addrq)
3433 PyCodeObject *co;
3434 int addrq;
3435{
3436 int size = PyString_Size(co->co_lnotab) / 2;
3437 char *p = PyString_AsString(co->co_lnotab);
3438 int line = co->co_firstlineno;
3439 int addr = 0;
3440 while (--size >= 0) {
3441 addr += *p++;
3442 if (addr > addrq)
3443 break;
3444 line += *p++;
3445 }
3446 return line;
3447}