blob: b75bf450025d6a5ad21468948b2135b581e00601 [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 Rossumfd71b9e2000-06-30 23:50:40 +00007Copyright (c) 2000, BeOpen.com.
8Copyright (c) 1995-2000, Corporation for National Research Initiatives.
9Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
10All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011
Guido van Rossumfd71b9e2000-06-30 23:50:40 +000012See the file "Misc/COPYRIGHT" for information on usage and
13redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000014
15******************************************************************/
16
Guido van Rossum10dc2e81990-11-18 17:27:39 +000017/* Compile an expression node to intermediate code */
18
Guido van Rossum3f5da241990-12-20 15:06:42 +000019/* XXX TO DO:
Guido van Rossum8b993a91997-01-17 21:04:03 +000020 XXX add __doc__ attribute == co_doc to code object attributes?
21 XXX (it's currently the first item of the co_const tuple)
Guido van Rossum3f5da241990-12-20 15:06:42 +000022 XXX Generate simple jump for break/return outside 'try...finally'
Guido van Rossum8b993a91997-01-17 21:04:03 +000023 XXX Allow 'continue' inside try-finally
Guido van Rossum8b993a91997-01-17 21:04:03 +000024 XXX New opcode for loading the initial index for a for loop
Guido van Rossum681d79a1995-07-18 14:51:37 +000025 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000026*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000027
Guido van Rossum8ff077b1996-08-24 06:21:31 +000028#ifndef NO_PRIVATE_NAME_MANGLING
29#define PRIVATE_NAME_MANGLING
30#endif
31
Guido van Rossum79f25d91997-04-29 20:08:16 +000032#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000033
Guido van Rossum10dc2e81990-11-18 17:27:39 +000034#include "node.h"
35#include "token.h"
36#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000037#include "compile.h"
38#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000039#include "structmember.h"
40
41#include <ctype.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000042
Guido van Rossumb05a5c71997-05-07 17:46:13 +000043/* Three symbols from graminit.h are also defined in Python.h, with
44 Py_ prefixes to their names. Python.h can't include graminit.h
45 (which defines too many confusing symbols), but we can check here
46 that they haven't changed (which is very unlikely, but possible). */
47#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000048 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000049#endif
50#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000051 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000052#endif
53#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000054 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000055#endif
56
Guido van Rossum8e793d91997-03-03 19:13:14 +000057int Py_OptimizeFlag = 0;
58
Guido van Rossum8861b741996-07-30 16:49:37 +000059#define OP_DELETE 0
60#define OP_ASSIGN 1
61#define OP_APPLY 2
62
Guido van Rossum79f25d91997-04-29 20:08:16 +000063#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000064
65static struct memberlist code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000066 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
67 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000068 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000069 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000070 {"co_code", T_OBJECT, OFF(co_code), READONLY},
71 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
72 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000073 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000074 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000075 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000076 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
77 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000078 {NULL} /* Sentinel */
79};
80
Guido van Rossum79f25d91997-04-29 20:08:16 +000081static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +000082code_getattr(co, name)
Guido van Rossum79f25d91997-04-29 20:08:16 +000083 PyCodeObject *co;
Guido van Rossum3f5da241990-12-20 15:06:42 +000084 char *name;
85{
Guido van Rossum79f25d91997-04-29 20:08:16 +000086 return PyMember_Get((char *)co, code_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +000087}
Guido van Rossum10dc2e81990-11-18 17:27:39 +000088
89static void
Guido van Rossum3f5da241990-12-20 15:06:42 +000090code_dealloc(co)
Guido van Rossum79f25d91997-04-29 20:08:16 +000091 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +000092{
Guido van Rossum79f25d91997-04-29 20:08:16 +000093 Py_XDECREF(co->co_code);
94 Py_XDECREF(co->co_consts);
95 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +000096 Py_XDECREF(co->co_varnames);
Guido van Rossum79f25d91997-04-29 20:08:16 +000097 Py_XDECREF(co->co_filename);
98 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +000099 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000100 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000101}
102
Guido van Rossum79f25d91997-04-29 20:08:16 +0000103static PyObject *
Guido van Rossum2dff9911992-09-03 20:50:59 +0000104code_repr(co)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000105 PyCodeObject *co;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000106{
107 char buf[500];
108 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000109 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000110 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000111
Guido van Rossuma396a882000-04-07 01:21:36 +0000112 if (co->co_firstlineno != 0)
113 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000114 if (co->co_filename && PyString_Check(co->co_filename))
115 filename = PyString_AsString(co->co_filename);
116 if (co->co_name && PyString_Check(co->co_name))
117 name = PyString_AsString(co->co_name);
Fred Drake615ae552000-06-30 16:20:13 +0000118 sprintf(buf, "<code object %.100s at %p, file \"%.300s\", line %d>",
119 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000120 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000121}
122
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000123static int
124code_compare(co, cp)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000125 PyCodeObject *co, *cp;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000126{
127 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000128 cmp = PyObject_Compare(co->co_name, cp->co_name);
129 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000130 cmp = co->co_argcount - cp->co_argcount;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000131 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000132 cmp = co->co_nlocals - cp->co_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000133 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000134 cmp = co->co_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000135 if (cmp) return cmp;
Guido van Rossumd076c731998-10-07 19:42:25 +0000136 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000137 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000138 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000139 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000140 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000141 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000142 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000143 return cmp;
144}
145
146static long
147code_hash(co)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000148 PyCodeObject *co;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000149{
Guido van Rossum44679592000-04-10 16:20:31 +0000150 long h, h0, h1, h2, h3, h4;
151 h0 = PyObject_Hash(co->co_name);
152 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000153 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000154 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000155 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000156 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000157 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000158 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000159 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000160 if (h4 == -1) return -1;
Guido van Rossum44679592000-04-10 16:20:31 +0000161 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000162 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000163 if (h == -1) h = -2;
164 return h;
165}
166
Guido van Rossum79f25d91997-04-29 20:08:16 +0000167PyTypeObject PyCode_Type = {
168 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000169 0,
170 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000171 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000172 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000173 (destructor)code_dealloc, /*tp_dealloc*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000174 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000175 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000176 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000177 (cmpfunc)code_compare, /*tp_compare*/
178 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000179 0, /*tp_as_number*/
180 0, /*tp_as_sequence*/
181 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000182 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000183};
184
Guido van Rossum644a12b1997-04-09 19:24:53 +0000185#define NAME_CHARS \
186 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
187
Guido van Rossum79f25d91997-04-29 20:08:16 +0000188PyCodeObject *
189PyCode_New(argcount, nlocals, stacksize, flags,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000190 code, consts, names, varnames, filename, name,
191 firstlineno, lnotab)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000192 int argcount;
193 int nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000194 int stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000195 int flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000196 PyObject *code;
197 PyObject *consts;
198 PyObject *names;
199 PyObject *varnames;
200 PyObject *filename;
201 PyObject *name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000202 int firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000203 PyObject *lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000204{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000205 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000206 int i;
Guido van Rossumd076c731998-10-07 19:42:25 +0000207 PyBufferProcs *pb;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000208 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000209 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000210 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000211 consts == NULL || !PyTuple_Check(consts) ||
212 names == NULL || !PyTuple_Check(names) ||
213 varnames == NULL || !PyTuple_Check(varnames) ||
214 name == NULL || !PyString_Check(name) ||
215 filename == NULL || !PyString_Check(filename) ||
216 lnotab == NULL || !PyString_Check(lnotab)) {
217 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000218 return NULL;
219 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000220 pb = code->ob_type->tp_as_buffer;
221 if (pb == NULL ||
222 pb->bf_getreadbuffer == NULL ||
223 pb->bf_getsegcount == NULL ||
224 (*pb->bf_getsegcount)(code, NULL) != 1)
225 {
226 PyErr_BadInternalCall();
227 return NULL;
228 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000229 /* Make sure names and varnames are all strings, & intern them */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000230 for (i = PyTuple_Size(names); --i >= 0; ) {
231 PyObject *v = PyTuple_GetItem(names, i);
232 if (v == NULL || !PyString_Check(v)) {
233 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000234 return NULL;
235 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000236 PyString_InternInPlace(&PyTuple_GET_ITEM(names, i));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000237 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000238 for (i = PyTuple_Size(varnames); --i >= 0; ) {
239 PyObject *v = PyTuple_GetItem(varnames, i);
240 if (v == NULL || !PyString_Check(v)) {
241 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000242 return NULL;
243 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000244 PyString_InternInPlace(&PyTuple_GET_ITEM(varnames, i));
245 }
246 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000247 for (i = PyTuple_Size(consts); --i >= 0; ) {
248 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000249 char *p;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000250 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000251 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000252 p = PyString_AsString(v);
Guido van Rossum582acec2000-06-28 22:07:35 +0000253 if (strspn(p, NAME_CHARS)
254 != (size_t)PyString_Size(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000255 continue;
256 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000257 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000258 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000259 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000260 co->co_argcount = argcount;
261 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000262 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000263 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000264 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000265 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000266 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000267 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000268 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000269 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000270 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000271 co->co_varnames = varnames;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000272 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000273 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000274 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000275 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000276 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000277 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000278 co->co_lnotab = lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000279 }
280 return co;
281}
282
283
284/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000285
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000286struct compiling {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000287 PyObject *c_code; /* string */
288 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000289 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000290 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000291 PyObject *c_name_dict; /* inverse of c_names */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000292 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{
Guido van Rossum582acec2000-06-28 22:07:35 +0000328 size_t 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));
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000393static int com_add Py_PROTO((struct compiling *, PyObject *, PyObject *, PyObject *));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000394static 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 Rossuma2ace6a2000-04-28 16:42:25 +0000411 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000412 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
413 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000414 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000415 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000416 goto fail;
417 if ((c->c_const_dict = PyDict_New()) == NULL)
418 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000419 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000420 goto fail;
421 if ((c->c_name_dict = PyDict_New()) == NULL)
422 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000423 if ((c->c_globals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000424 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000425 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000426 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000427 if ((c->c_varnames = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000428 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000429 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
430 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000431 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000432 c->c_nlocals = 0;
433 c->c_argcount = 0;
434 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000435 c->c_nexti = 0;
436 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000437 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000438 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000439 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000440 c->c_begin = 0;
441 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000442 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000443 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000444 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000445 c->c_stacklevel = 0;
446 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000447 c->c_firstlineno = 0;
448 c->c_last_addr = 0;
449 c->c_last_line = 0;
450 c-> c_lnotab_next = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000451 return 1;
452
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000453 fail:
454 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000455 return 0;
456}
457
458static void
459com_free(c)
460 struct compiling *c;
461{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000462 Py_XDECREF(c->c_code);
463 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000464 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000465 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000466 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000467 Py_XDECREF(c->c_globals);
468 Py_XDECREF(c->c_locals);
469 Py_XDECREF(c->c_varnames);
470 Py_XDECREF(c->c_lnotab);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000471}
472
473static void
Guido van Rossum8b993a91997-01-17 21:04:03 +0000474com_push(c, n)
475 struct compiling *c;
476 int n;
477{
478 c->c_stacklevel += n;
479 if (c->c_stacklevel > c->c_maxstacklevel)
480 c->c_maxstacklevel = c->c_stacklevel;
481}
482
483static void
484com_pop(c, n)
485 struct compiling *c;
486 int n;
487{
488 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000489 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000490 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
491 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000492 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000493 c->c_stacklevel = 0;
494 }
495 else
496 c->c_stacklevel -= n;
497}
498
499static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000500com_done(c)
501 struct compiling *c;
502{
503 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000504 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000505 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000506 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000507}
508
509static void
510com_addbyte(c, byte)
511 struct compiling *c;
512 int byte;
513{
514 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000515 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000516 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000517 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000518 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000519 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000520 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000521 com_error(c, PyExc_SystemError,
522 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000523 }
524 if (c->c_code == NULL)
525 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000526 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000527 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000528 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000529 c->c_errors++;
530 return;
531 }
532 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000533 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000534}
535
536static void
537com_addint(c, x)
538 struct compiling *c;
539 int x;
540{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000541 com_addbyte(c, x & 0xff);
542 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000543}
544
545static void
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000546com_add_lnotab(c, addr, line)
547 struct compiling *c;
548 int addr;
549 int line;
550{
551 int size;
552 char *p;
553 if (c->c_lnotab == NULL)
554 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000555 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000556 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000557 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000558 c->c_errors++;
559 return;
560 }
561 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000562 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000563 *p++ = addr;
564 *p++ = line;
565 c->c_lnotab_next += 2;
566}
567
568static void
569com_set_lineno(c, lineno)
570 struct compiling *c;
571 int lineno;
572{
573 c->c_lineno = lineno;
574 if (c->c_firstlineno == 0) {
575 c->c_firstlineno = c->c_last_line = lineno;
576 }
577 else {
578 int incr_addr = c->c_nexti - c->c_last_addr;
579 int incr_line = lineno - c->c_last_line;
580 while (incr_addr > 0 || incr_line > 0) {
581 int trunc_addr = incr_addr;
582 int trunc_line = incr_line;
583 if (trunc_addr > 255)
584 trunc_addr = 255;
585 if (trunc_line > 255)
586 trunc_line = 255;
587 com_add_lnotab(c, trunc_addr, trunc_line);
588 incr_addr -= trunc_addr;
589 incr_line -= trunc_line;
590 }
591 c->c_last_addr = c->c_nexti;
592 c->c_last_line = lineno;
593 }
594}
595
596static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000597com_addoparg(c, op, arg)
598 struct compiling *c;
599 int op;
600 int arg;
601{
Guido van Rossum8e793d91997-03-03 19:13:14 +0000602 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000603 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000604 if (Py_OptimizeFlag)
605 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000606 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000607 com_addbyte(c, op);
608 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000609}
610
611static void
612com_addfwref(c, op, p_anchor)
613 struct compiling *c;
614 int op;
615 int *p_anchor;
616{
617 /* Compile a forward reference for backpatching */
618 int here;
619 int anchor;
620 com_addbyte(c, op);
621 here = c->c_nexti;
622 anchor = *p_anchor;
623 *p_anchor = here;
624 com_addint(c, anchor == 0 ? 0 : here - anchor);
625}
626
627static void
628com_backpatch(c, anchor)
629 struct compiling *c;
630 int anchor; /* Must be nonzero */
631{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000632 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000633 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000634 int dist;
635 int prev;
636 for (;;) {
637 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000638 prev = code[anchor] + (code[anchor+1] << 8);
639 dist = target - (anchor+2);
640 code[anchor] = dist & 0xff;
641 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000642 if (!prev)
643 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000644 anchor -= prev;
645 }
646}
647
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000648/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000649
650static int
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000651com_add(c, list, dict, v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000652 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000653 PyObject *list;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000654 PyObject *dict;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000655 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000656{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000657 PyObject *w, *t, *np=NULL;
658 long n;
659
660 t = Py_BuildValue("(OO)", v, v->ob_type);
661 if (t == NULL)
662 goto fail;
663 w = PyDict_GetItem(dict, t);
664 if (w != NULL) {
665 n = PyInt_AsLong(w);
666 } else {
667 n = PyList_Size(list);
668 np = PyInt_FromLong(n);
669 if (np == NULL)
670 goto fail;
671 if (PyList_Append(list, v) != 0)
672 goto fail;
673 if (PyDict_SetItem(dict, t, np) != 0)
674 goto fail;
675 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000676 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000677 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000678 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000679 fail:
680 Py_XDECREF(np);
681 Py_XDECREF(t);
682 c->c_errors++;
683 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000684}
685
686static int
687com_addconst(c, v)
688 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000689 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000690{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000691 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000692}
693
694static int
695com_addname(c, v)
696 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000697 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000698{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000699 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000700}
701
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000702#ifdef PRIVATE_NAME_MANGLING
703static int
704com_mangle(c, name, buffer, maxlen)
705 struct compiling *c;
706 char *name;
707 char *buffer;
Guido van Rossum582acec2000-06-28 22:07:35 +0000708 size_t maxlen;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000709{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000710 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000711 This is independent from how the name is used. */
712 char *p;
Guido van Rossum582acec2000-06-28 22:07:35 +0000713 size_t nlen, plen;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000714 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000715 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000716 return 0; /* Don't mangle __extremely_long_names */
717 if (name[nlen-1] == '_' && name[nlen-2] == '_')
718 return 0; /* Don't mangle __whatever__ */
719 p = c->c_private;
720 /* Strip leading underscores from class name */
721 while (*p == '_')
722 p++;
723 if (*p == '\0')
724 return 0; /* Don't mangle if class is just underscores */
725 plen = strlen(p);
726 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000727 plen = maxlen-nlen-2; /* Truncate class name if too long */
728 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000729 buffer[0] = '_';
730 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000731 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000732 /* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
733 return 1;
734}
735#endif
736
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000737static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000738com_addopnamestr(c, op, name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000739 struct compiling *c;
740 int op;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000741 char *name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000742{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000743 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000744 int i;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000745#ifdef PRIVATE_NAME_MANGLING
746 char buffer[256];
747 if (name != NULL && name[0] == '_' && name[1] == '_' &&
748 c->c_private != NULL &&
Guido van Rossum582acec2000-06-28 22:07:35 +0000749 com_mangle(c, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000750 name = buffer;
751#endif
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000752 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000753 c->c_errors++;
754 i = 255;
755 }
756 else {
757 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000758 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000759 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000760 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
761 switch (op) {
762 case LOAD_NAME:
763 case STORE_NAME:
764 case DELETE_NAME:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000765 if (PyDict_GetItemString(c->c_globals, name) != NULL) {
Guido van Rossumc5e96291991-12-10 13:53:51 +0000766 switch (op) {
767 case LOAD_NAME: op = LOAD_GLOBAL; break;
768 case STORE_NAME: op = STORE_GLOBAL; break;
769 case DELETE_NAME: op = DELETE_GLOBAL; break;
770 }
771 }
772 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000773 com_addoparg(c, op, i);
774}
775
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000776static void
777com_addopname(c, op, n)
778 struct compiling *c;
779 int op;
780 node *n;
781{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000782 char *name;
783 char buffer[1000];
784 /* XXX it is possible to write this code without the 1000
785 chars on the total length of dotted names, I just can't be
786 bothered right now */
787 if (TYPE(n) == STAR)
788 name = "*";
789 else if (TYPE(n) == dotted_name) {
790 char *p = buffer;
791 int i;
792 name = buffer;
793 for (i = 0; i < NCH(n); i += 2) {
794 char *s = STR(CHILD(n, i));
795 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000796 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000797 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +0000798 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000799 break;
800 }
801 if (p != buffer)
802 *p++ = '.';
803 strcpy(p, s);
804 p = strchr(p, '\0');
805 }
806 }
807 else {
808 REQ(n, NAME);
809 name = STR(n);
810 }
811 com_addopnamestr(c, op, name);
812}
813
Guido van Rossum79f25d91997-04-29 20:08:16 +0000814static PyObject *
Guido van Rossum452a9831996-09-17 14:32:04 +0000815parsenumber(co, s)
816 struct compiling *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000817 char *s;
818{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000819 extern double atof Py_PROTO((const char *));
Guido van Rossumc5e96291991-12-10 13:53:51 +0000820 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000821 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000822 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +0000823#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +0000824 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +0000825 int imflag;
826#endif
827
Guido van Rossum282914b1991-04-04 10:42:56 +0000828 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000829 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +0000830#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +0000831 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +0000832#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000833 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000834 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000835 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000836 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000837 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000838 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000839 if (*end == '\0') {
840 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000841 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000842 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000843 return NULL;
844 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000845 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000846 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000847 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +0000848#ifndef WITHOUT_COMPLEX
849 if (imflag) {
850 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000851 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +0000852 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000853 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000854 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +0000855 }
Guido van Rossumac1fc951997-10-08 15:23:55 +0000856 else
Guido van Rossum50564e81996-01-12 01:13:16 +0000857#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +0000858 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000859 PyFPE_START_PROTECT("atof", return 0)
860 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000861 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000862 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000863 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000864}
865
Guido van Rossum79f25d91997-04-29 20:08:16 +0000866static PyObject *
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000867parsestr(s)
868 char *s;
869{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000870 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +0000871 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000872 char *buf;
873 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000874 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000875 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +0000876 int first = *s;
877 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000878 int rawmode = 0;
879 int unicode = 0;
880 if (isalpha(quote) || quote == '_') {
881 if (quote == 'u' || quote == 'U') {
882 quote = *++s;
883 unicode = 1;
884 }
885 if (quote == 'r' || quote == 'R') {
886 quote = *++s;
887 rawmode = 1;
888 }
889 }
Guido van Rossum8054fad1993-10-26 15:19:44 +0000890 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000891 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000892 return NULL;
893 }
894 s++;
895 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +0000896 if (len > INT_MAX) {
897 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
898 return NULL;
899 }
Guido van Rossum8054fad1993-10-26 15:19:44 +0000900 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000901 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000902 return NULL;
903 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000904 if (len >= 4 && s[0] == quote && s[1] == quote) {
905 s += 2;
906 len -= 2;
907 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000908 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000909 return NULL;
910 }
911 }
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +0000912 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000913 if (rawmode)
914 return PyUnicode_DecodeRawUnicodeEscape(
915 s, len, NULL);
916 else
917 return PyUnicode_DecodeUnicodeEscape(
918 s, len, NULL);
919 }
920 else if (rawmode || strchr(s, '\\') == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000921 return PyString_FromStringAndSize(s, len);
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000922 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000923 v = PyString_FromStringAndSize((char *)NULL, len);
924 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000925 end = s + len;
926 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000927 if (*s != '\\') {
928 *p++ = *s++;
929 continue;
930 }
931 s++;
932 switch (*s++) {
933 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000934 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000935 case '\\': *p++ = '\\'; break;
936 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000937 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000938 case 'b': *p++ = '\b'; break;
939 case 'f': *p++ = '\014'; break; /* FF */
940 case 't': *p++ = '\t'; break;
941 case 'n': *p++ = '\n'; break;
942 case 'r': *p++ = '\r'; break;
943 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000944 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
945 case '0': case '1': case '2': case '3':
946 case '4': case '5': case '6': case '7':
947 c = s[-1] - '0';
948 if ('0' <= *s && *s <= '7') {
949 c = (c<<3) + *s++ - '0';
950 if ('0' <= *s && *s <= '7')
951 c = (c<<3) + *s++ - '0';
952 }
953 *p++ = c;
954 break;
955 case 'x':
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000956 if (isxdigit(Py_CHARMASK(*s))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000957 unsigned int x = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000958 do {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000959 c = Py_CHARMASK(*s);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000960 s++;
Guido van Rossumed1100f1997-10-20 23:24:07 +0000961 x = (x<<4) & ~0xF;
962 if (isdigit(c))
963 x += c - '0';
964 else if (islower(c))
965 x += 10 + c - 'a';
966 else
967 x += 10 + c - 'A';
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000968 } while (isxdigit(Py_CHARMASK(*s)));
Guido van Rossumed1100f1997-10-20 23:24:07 +0000969 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000970 break;
971 }
972 /* FALLTHROUGH */
973 default: *p++ = '\\'; *p++ = s[-1]; break;
974 }
975 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000976 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000977 return v;
978}
979
Guido van Rossum79f25d91997-04-29 20:08:16 +0000980static PyObject *
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000981parsestrplus(n)
982 node *n;
983{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000984 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000985 int i;
986 REQ(CHILD(n, 0), STRING);
987 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
988 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +0000989 for (i = 1; i < NCH(n); i++) {
990 PyObject *s;
991 s = parsestr(STR(CHILD(n, i)));
992 if (s == NULL)
993 goto onError;
994 if (PyString_Check(v) && PyString_Check(s)) {
995 PyString_ConcatAndDel(&v, s);
996 if (v == NULL)
997 goto onError;
998 }
999 else {
1000 PyObject *temp;
1001 temp = PyUnicode_Concat(v, s);
1002 Py_DECREF(s);
1003 if (temp == NULL)
1004 goto onError;
1005 Py_DECREF(v);
1006 v = temp;
1007 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001008 }
1009 }
1010 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001011
1012 onError:
1013 Py_XDECREF(v);
1014 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001015}
1016
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001017static void
1018com_list_constructor(c, n)
1019 struct compiling *c;
1020 node *n;
1021{
1022 int len;
1023 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001024 if (TYPE(n) != testlist)
1025 REQ(n, exprlist);
1026 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
1027 len = (NCH(n) + 1) / 2;
1028 for (i = 0; i < NCH(n); i += 2)
1029 com_node(c, CHILD(n, i));
1030 com_addoparg(c, BUILD_LIST, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001031 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001032}
1033
1034static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001035com_dictmaker(c, n)
1036 struct compiling *c;
1037 node *n;
1038{
1039 int i;
1040 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1041 for (i = 0; i+2 < NCH(n); i += 4) {
1042 /* We must arrange things just right for STORE_SUBSCR.
1043 It wants the stack to look like (value) (dict) (key) */
1044 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001045 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001046 com_node(c, CHILD(n, i+2)); /* value */
1047 com_addbyte(c, ROT_TWO);
1048 com_node(c, CHILD(n, i)); /* key */
1049 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001050 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001051 }
1052}
1053
1054static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001055com_atom(c, n)
1056 struct compiling *c;
1057 node *n;
1058{
1059 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001060 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001061 int i;
1062 REQ(n, atom);
1063 ch = CHILD(n, 0);
1064 switch (TYPE(ch)) {
1065 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001066 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001067 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001068 com_push(c, 1);
1069 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001070 else
1071 com_node(c, CHILD(n, 1));
1072 break;
1073 case LSQB:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001074 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001075 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001076 com_push(c, 1);
1077 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001078 else
1079 com_list_constructor(c, CHILD(n, 1));
1080 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001081 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001082 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001083 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001084 if (TYPE(CHILD(n, 1)) != RBRACE)
1085 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001086 break;
1087 case BACKQUOTE:
1088 com_node(c, CHILD(n, 1));
1089 com_addbyte(c, UNARY_CONVERT);
1090 break;
1091 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001092 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001093 i = 255;
1094 }
1095 else {
1096 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001097 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001098 }
1099 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001100 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001101 break;
1102 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001103 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001104 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001105 c->c_errors++;
1106 i = 255;
1107 }
1108 else {
1109 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001110 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001111 }
1112 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001113 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001114 break;
1115 case NAME:
1116 com_addopname(c, LOAD_NAME, ch);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001117 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001118 break;
1119 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001120 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001121 com_error(c, PyExc_SystemError,
1122 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001123 }
1124}
1125
1126static void
1127com_slice(c, n, op)
1128 struct compiling *c;
1129 node *n;
1130 int op;
1131{
1132 if (NCH(n) == 1) {
1133 com_addbyte(c, op);
1134 }
1135 else if (NCH(n) == 2) {
1136 if (TYPE(CHILD(n, 0)) != COLON) {
1137 com_node(c, CHILD(n, 0));
1138 com_addbyte(c, op+1);
1139 }
1140 else {
1141 com_node(c, CHILD(n, 1));
1142 com_addbyte(c, op+2);
1143 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001144 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001145 }
1146 else {
1147 com_node(c, CHILD(n, 0));
1148 com_node(c, CHILD(n, 2));
1149 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001150 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001151 }
1152}
1153
Guido van Rossum635abd21997-01-06 22:56:52 +00001154static void
1155com_argument(c, n, pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001156 struct compiling *c;
1157 node *n; /* argument */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001158 PyObject **pkeywords;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001159{
1160 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001161 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001162 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001163 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001164 com_error(c, PyExc_SyntaxError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001165 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001166 }
1167 else {
1168 com_node(c, CHILD(n, 0));
1169 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001170 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001171 }
1172 m = n;
1173 do {
1174 m = CHILD(m, 0);
1175 } while (NCH(m) == 1);
1176 if (TYPE(m) != NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001177 com_error(c, PyExc_SyntaxError,
1178 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001179 }
1180 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001181 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001182 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001183 *pkeywords = PyDict_New();
Guido van Rossum635abd21997-01-06 22:56:52 +00001184 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001185 c->c_errors++;
1186 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001187 if (PyDict_GetItem(*pkeywords, v) != NULL)
1188 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001189 "duplicate keyword argument");
1190 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001191 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001192 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001193 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001194 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001195 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001196 }
1197 }
1198 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001199}
1200
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001201static void
1202com_call_function(c, n)
1203 struct compiling *c;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001204 node *n; /* EITHER arglist OR ')' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001205{
1206 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001207 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001208 }
1209 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001210 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001211 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001212 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001213 int star_flag = 0;
1214 int starstar_flag = 0;
1215 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001216 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001217 na = 0;
1218 nk = 0;
1219 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001220 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001221 if (TYPE(ch) == STAR ||
1222 TYPE(ch) == DOUBLESTAR)
1223 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001224 if (ch->n_lineno != lineno) {
1225 lineno = ch->n_lineno;
1226 com_addoparg(c, SET_LINENO, lineno);
1227 }
1228 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001229 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001230 na++;
1231 else
1232 nk++;
1233 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001234 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001235 while (i < NCH(n)) {
1236 node *tok = CHILD(n, i);
1237 node *ch = CHILD(n, i+1);
1238 i += 3;
1239 switch (TYPE(tok)) {
1240 case STAR: star_flag = 1; break;
1241 case DOUBLESTAR: starstar_flag = 1; break;
1242 }
1243 com_node(c, ch);
1244 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001245 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001246 com_error(c, PyExc_SyntaxError,
1247 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001248 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001249 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001250 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001251 star_flag + (starstar_flag << 1);
1252 else
1253 opcode = CALL_FUNCTION;
1254 com_addoparg(c, opcode, na | (nk << 8));
1255 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001256 }
1257}
1258
1259static void
1260com_select_member(c, n)
1261 struct compiling *c;
1262 node *n;
1263{
1264 com_addopname(c, LOAD_ATTR, n);
1265}
1266
1267static void
Guido van Rossum8861b741996-07-30 16:49:37 +00001268com_sliceobj(c, n)
1269 struct compiling *c;
1270 node *n;
1271{
1272 int i=0;
1273 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001274 node *ch;
1275
1276 /* first argument */
1277 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001278 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001279 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001280 i++;
1281 }
1282 else {
1283 com_node(c, CHILD(n,i));
1284 i++;
1285 REQ(CHILD(n,i),COLON);
1286 i++;
1287 }
1288 /* second argument */
1289 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1290 com_node(c, CHILD(n,i));
1291 i++;
1292 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001293 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001294 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001295 com_push(c, 1);
1296 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001297 /* remaining arguments */
1298 for (; i < NCH(n); i++) {
1299 ns++;
1300 ch=CHILD(n,i);
1301 REQ(ch, sliceop);
1302 if (NCH(ch) == 1) {
1303 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001304 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001305 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001306 }
1307 else
1308 com_node(c, CHILD(ch,1));
1309 }
1310 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001311 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001312}
1313
1314static void
1315com_subscript(c, n)
1316 struct compiling *c;
1317 node *n;
1318{
1319 node *ch;
1320 REQ(n, subscript);
1321 ch = CHILD(n,0);
1322 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001323 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001324 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001325 com_push(c, 1);
1326 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001327 else {
1328 /* check for slice */
1329 if ((TYPE(ch) == COLON || NCH(n) > 1))
1330 com_sliceobj(c, n);
1331 else {
1332 REQ(ch, test);
1333 com_node(c, ch);
1334 }
1335 }
1336}
1337
1338static void
1339com_subscriptlist(c, n, assigning)
1340 struct compiling *c;
1341 node *n;
1342 int assigning;
1343{
1344 int i, op;
1345 REQ(n, subscriptlist);
1346 /* Check to make backward compatible slice behavior for '[i:j]' */
1347 if (NCH(n) == 1) {
1348 node *sub = CHILD(n, 0); /* subscript */
1349 /* Make it is a simple slice.
Guido van Rossum8b993a91997-01-17 21:04:03 +00001350 Should have exactly one colon. */
Guido van Rossum8861b741996-07-30 16:49:37 +00001351 if ((TYPE(CHILD(sub, 0)) == COLON
1352 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
Guido van Rossum8b993a91997-01-17 21:04:03 +00001353 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1354 {
Guido van Rossum8861b741996-07-30 16:49:37 +00001355 if (assigning == OP_APPLY)
1356 op = SLICE;
1357 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001358 op = ((assigning == OP_ASSIGN) ?
1359 STORE_SLICE : DELETE_SLICE);
Guido van Rossum8861b741996-07-30 16:49:37 +00001360 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001361 if (op == STORE_SLICE)
1362 com_pop(c, 2);
1363 else if (op == DELETE_SLICE)
1364 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001365 return;
1366 }
1367 }
1368 /* Else normal subscriptlist. Compile each subscript. */
1369 for (i = 0; i < NCH(n); i += 2)
1370 com_subscript(c, CHILD(n, i));
1371 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001372 if (NCH(n) > 1) {
1373 i = (NCH(n)+1) / 2;
1374 com_addoparg(c, BUILD_TUPLE, i);
1375 com_pop(c, i-1);
1376 }
1377 if (assigning == OP_APPLY) {
Guido van Rossum8861b741996-07-30 16:49:37 +00001378 op = BINARY_SUBSCR;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001379 i = 1;
1380 }
1381 else if (assigning == OP_ASSIGN) {
1382 op = STORE_SUBSCR;
1383 i = 3;
1384 }
1385 else {
1386 op = DELETE_SUBSCR;
1387 i = 2;
1388 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001389 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001390 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001391}
1392
1393static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001394com_apply_trailer(c, n)
1395 struct compiling *c;
1396 node *n;
1397{
1398 REQ(n, trailer);
1399 switch (TYPE(CHILD(n, 0))) {
1400 case LPAR:
1401 com_call_function(c, CHILD(n, 1));
1402 break;
1403 case DOT:
1404 com_select_member(c, CHILD(n, 1));
1405 break;
1406 case LSQB:
Guido van Rossum8861b741996-07-30 16:49:37 +00001407 com_subscriptlist(c, CHILD(n, 1), OP_APPLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001408 break;
1409 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001410 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001411 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001412 }
1413}
1414
1415static void
Guido van Rossum50564e81996-01-12 01:13:16 +00001416com_power(c, n)
1417 struct compiling *c;
1418 node *n;
1419{
1420 int i;
1421 REQ(n, power);
1422 com_atom(c, CHILD(n, 0));
1423 for (i = 1; i < NCH(n); i++) {
1424 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1425 com_factor(c, CHILD(n, i+1));
1426 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001427 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001428 break;
1429 }
1430 else
1431 com_apply_trailer(c, CHILD(n, i));
1432 }
1433}
1434
1435static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001436com_factor(c, n)
1437 struct compiling *c;
1438 node *n;
1439{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001440 REQ(n, factor);
1441 if (TYPE(CHILD(n, 0)) == PLUS) {
1442 com_factor(c, CHILD(n, 1));
1443 com_addbyte(c, UNARY_POSITIVE);
1444 }
1445 else if (TYPE(CHILD(n, 0)) == MINUS) {
1446 com_factor(c, CHILD(n, 1));
1447 com_addbyte(c, UNARY_NEGATIVE);
1448 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001449 else if (TYPE(CHILD(n, 0)) == TILDE) {
1450 com_factor(c, CHILD(n, 1));
1451 com_addbyte(c, UNARY_INVERT);
1452 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001453 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001454 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001455 }
1456}
1457
1458static void
1459com_term(c, n)
1460 struct compiling *c;
1461 node *n;
1462{
1463 int i;
1464 int op;
1465 REQ(n, term);
1466 com_factor(c, CHILD(n, 0));
1467 for (i = 2; i < NCH(n); i += 2) {
1468 com_factor(c, CHILD(n, i));
1469 switch (TYPE(CHILD(n, i-1))) {
1470 case STAR:
1471 op = BINARY_MULTIPLY;
1472 break;
1473 case SLASH:
1474 op = BINARY_DIVIDE;
1475 break;
1476 case PERCENT:
1477 op = BINARY_MODULO;
1478 break;
1479 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001480 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001481 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001482 op = 255;
1483 }
1484 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001485 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001486 }
1487}
1488
1489static void
1490com_arith_expr(c, n)
1491 struct compiling *c;
1492 node *n;
1493{
1494 int i;
1495 int op;
1496 REQ(n, arith_expr);
1497 com_term(c, CHILD(n, 0));
1498 for (i = 2; i < NCH(n); i += 2) {
1499 com_term(c, CHILD(n, i));
1500 switch (TYPE(CHILD(n, i-1))) {
1501 case PLUS:
1502 op = BINARY_ADD;
1503 break;
1504 case MINUS:
1505 op = BINARY_SUBTRACT;
1506 break;
1507 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001508 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001509 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001510 op = 255;
1511 }
1512 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001513 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001514 }
1515}
1516
1517static void
1518com_shift_expr(c, n)
1519 struct compiling *c;
1520 node *n;
1521{
1522 int i;
1523 int op;
1524 REQ(n, shift_expr);
1525 com_arith_expr(c, CHILD(n, 0));
1526 for (i = 2; i < NCH(n); i += 2) {
1527 com_arith_expr(c, CHILD(n, i));
1528 switch (TYPE(CHILD(n, i-1))) {
1529 case LEFTSHIFT:
1530 op = BINARY_LSHIFT;
1531 break;
1532 case RIGHTSHIFT:
1533 op = BINARY_RSHIFT;
1534 break;
1535 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001536 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001537 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001538 op = 255;
1539 }
1540 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001541 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001542 }
1543}
1544
1545static void
1546com_and_expr(c, n)
1547 struct compiling *c;
1548 node *n;
1549{
1550 int i;
1551 int op;
1552 REQ(n, and_expr);
1553 com_shift_expr(c, CHILD(n, 0));
1554 for (i = 2; i < NCH(n); i += 2) {
1555 com_shift_expr(c, CHILD(n, i));
1556 if (TYPE(CHILD(n, i-1)) == AMPER) {
1557 op = BINARY_AND;
1558 }
1559 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001560 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001561 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001562 op = 255;
1563 }
1564 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001565 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001566 }
1567}
1568
1569static void
1570com_xor_expr(c, n)
1571 struct compiling *c;
1572 node *n;
1573{
1574 int i;
1575 int op;
1576 REQ(n, xor_expr);
1577 com_and_expr(c, CHILD(n, 0));
1578 for (i = 2; i < NCH(n); i += 2) {
1579 com_and_expr(c, CHILD(n, i));
1580 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1581 op = BINARY_XOR;
1582 }
1583 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001584 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001585 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001586 op = 255;
1587 }
1588 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001589 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001590 }
1591}
1592
1593static void
1594com_expr(c, n)
1595 struct compiling *c;
1596 node *n;
1597{
1598 int i;
1599 int op;
1600 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001601 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001602 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001603 com_xor_expr(c, CHILD(n, i));
1604 if (TYPE(CHILD(n, i-1)) == VBAR) {
1605 op = BINARY_OR;
1606 }
1607 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001608 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001609 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001610 op = 255;
1611 }
1612 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001613 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001614 }
1615}
1616
1617static enum cmp_op
1618cmp_type(n)
1619 node *n;
1620{
1621 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001622 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001623 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1624 if (NCH(n) == 1) {
1625 n = CHILD(n, 0);
1626 switch (TYPE(n)) {
1627 case LESS: return LT;
1628 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001629 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001630 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001631 case LESSEQUAL: return LE;
1632 case GREATEREQUAL: return GE;
1633 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001634 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1635 if (strcmp(STR(n), "is") == 0) return IS;
1636 }
1637 }
1638 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001639 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001640 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1641 return NOT_IN;
1642 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1643 return IS_NOT;
1644 }
1645 }
1646 return BAD;
1647}
1648
1649static void
1650com_comparison(c, n)
1651 struct compiling *c;
1652 node *n;
1653{
1654 int i;
1655 enum cmp_op op;
1656 int anchor;
1657 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1658 com_expr(c, CHILD(n, 0));
1659 if (NCH(n) == 1)
1660 return;
1661
1662 /****************************************************************
1663 The following code is generated for all but the last
1664 comparison in a chain:
1665
1666 label: on stack: opcode: jump to:
1667
1668 a <code to load b>
1669 a, b DUP_TOP
1670 a, b, b ROT_THREE
1671 b, a, b COMPARE_OP
1672 b, 0-or-1 JUMP_IF_FALSE L1
1673 b, 1 POP_TOP
1674 b
1675
1676 We are now ready to repeat this sequence for the next
1677 comparison in the chain.
1678
1679 For the last we generate:
1680
1681 b <code to load c>
1682 b, c COMPARE_OP
1683 0-or-1
1684
1685 If there were any jumps to L1 (i.e., there was more than one
1686 comparison), we generate:
1687
1688 0-or-1 JUMP_FORWARD L2
1689 L1: b, 0 ROT_TWO
1690 0, b POP_TOP
1691 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00001692 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001693 ****************************************************************/
1694
1695 anchor = 0;
1696
1697 for (i = 2; i < NCH(n); i += 2) {
1698 com_expr(c, CHILD(n, i));
1699 if (i+2 < NCH(n)) {
1700 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001701 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001702 com_addbyte(c, ROT_THREE);
1703 }
1704 op = cmp_type(CHILD(n, i-1));
1705 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001706 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001707 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001708 }
1709 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001710 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001711 if (i+2 < NCH(n)) {
1712 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1713 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001714 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001715 }
1716 }
1717
1718 if (anchor) {
1719 int anchor2 = 0;
1720 com_addfwref(c, JUMP_FORWARD, &anchor2);
1721 com_backpatch(c, anchor);
1722 com_addbyte(c, ROT_TWO);
1723 com_addbyte(c, POP_TOP);
1724 com_backpatch(c, anchor2);
1725 }
1726}
1727
1728static void
1729com_not_test(c, n)
1730 struct compiling *c;
1731 node *n;
1732{
1733 REQ(n, not_test); /* 'not' not_test | comparison */
1734 if (NCH(n) == 1) {
1735 com_comparison(c, CHILD(n, 0));
1736 }
1737 else {
1738 com_not_test(c, CHILD(n, 1));
1739 com_addbyte(c, UNARY_NOT);
1740 }
1741}
1742
1743static void
1744com_and_test(c, n)
1745 struct compiling *c;
1746 node *n;
1747{
1748 int i;
1749 int anchor;
1750 REQ(n, and_test); /* not_test ('and' not_test)* */
1751 anchor = 0;
1752 i = 0;
1753 for (;;) {
1754 com_not_test(c, CHILD(n, i));
1755 if ((i += 2) >= NCH(n))
1756 break;
1757 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1758 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001759 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001760 }
1761 if (anchor)
1762 com_backpatch(c, anchor);
1763}
1764
1765static void
1766com_test(c, n)
1767 struct compiling *c;
1768 node *n;
1769{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001770 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00001771 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001772 PyObject *v;
Guido van Rossum57531fe1993-11-30 14:57:42 +00001773 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001774 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001775 v = (PyObject *) icompile(CHILD(n, 0), c);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001776 if (v == NULL) {
1777 c->c_errors++;
1778 i = 255;
1779 }
1780 else {
1781 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001782 Py_DECREF(v);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001783 }
1784 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001785 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001786 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001787 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001788 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001789 else {
1790 int anchor = 0;
1791 int i = 0;
1792 for (;;) {
1793 com_and_test(c, CHILD(n, i));
1794 if ((i += 2) >= NCH(n))
1795 break;
1796 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1797 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001798 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001799 }
1800 if (anchor)
1801 com_backpatch(c, anchor);
1802 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001803}
1804
1805static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001806com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001807 struct compiling *c;
1808 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001809 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001810{
1811 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001812 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001813 com_node(c, CHILD(n, 0));
1814 }
1815 else {
1816 int i;
1817 int len;
1818 len = (NCH(n) + 1) / 2;
1819 for (i = 0; i < NCH(n); i += 2)
1820 com_node(c, CHILD(n, i));
1821 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001822 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001823 }
1824}
1825
1826
1827/* Begin of assignment compilation */
1828
Guido van Rossum79f25d91997-04-29 20:08:16 +00001829static void com_assign_name Py_PROTO((struct compiling *, node *, int));
1830static void com_assign Py_PROTO((struct compiling *, node *, int));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001831
1832static void
1833com_assign_attr(c, n, assigning)
1834 struct compiling *c;
1835 node *n;
1836 int assigning;
1837{
1838 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001839 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001840}
1841
1842static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001843com_assign_trailer(c, n, assigning)
1844 struct compiling *c;
1845 node *n;
1846 int assigning;
1847{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001848 REQ(n, trailer);
1849 switch (TYPE(CHILD(n, 0))) {
1850 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001851 com_error(c, PyExc_SyntaxError,
1852 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001853 break;
1854 case DOT: /* '.' NAME */
1855 com_assign_attr(c, CHILD(n, 1), assigning);
1856 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001857 case LSQB: /* '[' subscriptlist ']' */
1858 com_subscriptlist(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001859 break;
1860 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001861 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001862 }
1863}
1864
1865static void
1866com_assign_tuple(c, n, assigning)
1867 struct compiling *c;
1868 node *n;
1869 int assigning;
1870{
1871 int i;
1872 if (TYPE(n) != testlist)
1873 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001874 if (assigning) {
1875 i = (NCH(n)+1)/2;
1876 com_addoparg(c, UNPACK_TUPLE, i);
1877 com_push(c, i-1);
1878 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001879 for (i = 0; i < NCH(n); i += 2)
1880 com_assign(c, CHILD(n, i), assigning);
1881}
1882
1883static void
1884com_assign_list(c, n, assigning)
1885 struct compiling *c;
1886 node *n;
1887 int assigning;
1888{
1889 int i;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001890 if (assigning) {
1891 i = (NCH(n)+1)/2;
1892 com_addoparg(c, UNPACK_LIST, i);
1893 com_push(c, i-1);
1894 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001895 for (i = 0; i < NCH(n); i += 2)
1896 com_assign(c, CHILD(n, i), assigning);
1897}
1898
1899static void
1900com_assign_name(c, n, assigning)
1901 struct compiling *c;
1902 node *n;
1903 int assigning;
1904{
1905 REQ(n, NAME);
1906 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001907 if (assigning)
1908 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001909}
1910
1911static void
1912com_assign(c, n, assigning)
1913 struct compiling *c;
1914 node *n;
1915 int assigning;
1916{
1917 /* Loop to avoid trivial recursion */
1918 for (;;) {
1919 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001920
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001921 case exprlist:
1922 case testlist:
1923 if (NCH(n) > 1) {
1924 com_assign_tuple(c, n, assigning);
1925 return;
1926 }
1927 n = CHILD(n, 0);
1928 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001929
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001930 case test:
1931 case and_test:
1932 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001933 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001934 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001935 case xor_expr:
1936 case and_expr:
1937 case shift_expr:
1938 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001939 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00001940 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001941 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001942 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001943 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001944 return;
1945 }
1946 n = CHILD(n, 0);
1947 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001948
Guido van Rossum50564e81996-01-12 01:13:16 +00001949 case power: /* atom trailer* ('**' power)* */
1950/* ('+'|'-'|'~') factor | atom trailer* */
1951 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001952 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001953 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001954 return;
1955 }
Guido van Rossum50564e81996-01-12 01:13:16 +00001956 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001957 int i;
1958 com_node(c, CHILD(n, 0));
1959 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00001960 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001961 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001962 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00001963 return;
1964 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001965 com_apply_trailer(c, CHILD(n, i));
1966 } /* NB i is still alive */
1967 com_assign_trailer(c,
1968 CHILD(n, i), assigning);
1969 return;
1970 }
1971 n = CHILD(n, 0);
1972 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001973
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001974 case atom:
1975 switch (TYPE(CHILD(n, 0))) {
1976 case LPAR:
1977 n = CHILD(n, 1);
1978 if (TYPE(n) == RPAR) {
1979 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001980 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001981 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001982 return;
1983 }
1984 break;
1985 case LSQB:
1986 n = CHILD(n, 1);
1987 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001988 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001989 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001990 return;
1991 }
1992 com_assign_list(c, n, assigning);
1993 return;
1994 case NAME:
1995 com_assign_name(c, CHILD(n, 0), assigning);
1996 return;
1997 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001998 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001999 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002000 return;
2001 }
2002 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002003
2004 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002005 com_error(c, PyExc_SyntaxError,
2006 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002007 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002008
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002009 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002010 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002011 com_error(c, PyExc_SystemError,
2012 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002013 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002014
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002015 }
2016 }
2017}
Guido van Rossum7c531111997-03-11 18:42:21 +00002018
Guido van Rossum79f25d91997-04-29 20:08:16 +00002019/* Forward */ static node *get_rawdocstring Py_PROTO((node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002020
2021static void
2022com_expr_stmt(c, n)
2023 struct compiling *c;
2024 node *n;
2025{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002026 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002027 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002028 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002029 return;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002030 com_node(c, CHILD(n, NCH(n)-1));
2031 if (NCH(n) == 1) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002032 if (c->c_interactive)
2033 com_addbyte(c, PRINT_EXPR);
2034 else
2035 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002036 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002037 }
2038 else {
2039 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002040 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002041 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002042 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002043 com_push(c, 1);
2044 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002045 com_assign(c, CHILD(n, i), OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002046 }
2047 }
2048}
2049
2050static void
Guido van Rossum228d7f31997-04-02 05:24:36 +00002051com_assert_stmt(c, n)
2052 struct compiling *c;
2053 node *n;
2054{
2055 int a = 0, b = 0;
2056 int i;
2057 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2058 /* Generate code like for
2059
2060 if __debug__:
2061 if not <test>:
2062 raise AssertionError [, <message>]
2063
2064 where <message> is the second test, if present.
2065 */
2066 if (Py_OptimizeFlag)
2067 return;
2068 com_addopnamestr(c, LOAD_GLOBAL, "__debug__");
2069 com_push(c, 1);
2070 com_addfwref(c, JUMP_IF_FALSE, &a);
2071 com_addbyte(c, POP_TOP);
2072 com_pop(c, 1);
2073 com_node(c, CHILD(n, 1));
2074 com_addfwref(c, JUMP_IF_TRUE, &b);
2075 com_addbyte(c, POP_TOP);
2076 com_pop(c, 1);
2077 /* Raise that exception! */
2078 com_addopnamestr(c, LOAD_GLOBAL, "AssertionError");
2079 com_push(c, 1);
2080 i = NCH(n)/2; /* Either 2 or 4 */
2081 if (i > 1)
2082 com_node(c, CHILD(n, 3));
2083 com_addoparg(c, RAISE_VARARGS, i);
2084 com_pop(c, i);
2085 /* The interpreter does not fall through */
2086 /* All jumps converge here */
2087 com_backpatch(c, a);
2088 com_backpatch(c, b);
2089 com_addbyte(c, POP_TOP);
2090}
2091
2092static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002093com_print_stmt(c, n)
2094 struct compiling *c;
2095 node *n;
2096{
2097 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002098 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
2099 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002100 com_node(c, CHILD(n, i));
2101 com_addbyte(c, PRINT_ITEM);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002102 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002103 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002104 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002105 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002106 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002107}
2108
2109static void
2110com_return_stmt(c, n)
2111 struct compiling *c;
2112 node *n;
2113{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002114 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002115 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002116 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002117 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002118 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002119 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002120 com_push(c, 1);
2121 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002122 else
2123 com_node(c, CHILD(n, 1));
2124 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002125 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002126}
2127
2128static void
2129com_raise_stmt(c, n)
2130 struct compiling *c;
2131 node *n;
2132{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002133 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002134 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2135 if (NCH(n) > 1) {
2136 com_node(c, CHILD(n, 1));
2137 if (NCH(n) > 3) {
2138 com_node(c, CHILD(n, 3));
2139 if (NCH(n) > 5)
2140 com_node(c, CHILD(n, 5));
2141 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002142 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002143 i = NCH(n)/2;
2144 com_addoparg(c, RAISE_VARARGS, i);
2145 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002146}
2147
2148static void
2149com_import_stmt(c, n)
2150 struct compiling *c;
2151 node *n;
2152{
2153 int i;
2154 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002155 /* 'import' dotted_name (',' dotted_name)* |
2156 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002157 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002158 /* 'from' dotted_name 'import' ... */
2159 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002160 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002161 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002162 for (i = 3; i < NCH(n); i += 2)
2163 com_addopname(c, IMPORT_FROM, CHILD(n, i));
2164 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002165 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002166 }
2167 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002168 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002169 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002170 REQ(CHILD(n, i), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002171 com_addopname(c, IMPORT_NAME, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002172 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002173 com_addopname(c, STORE_NAME, CHILD(CHILD(n, i), 0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002174 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002175 }
2176 }
2177}
2178
2179static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00002180com_global_stmt(c, n)
2181 struct compiling *c;
2182 node *n;
2183{
2184 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002185 REQ(n, global_stmt);
2186 /* 'global' NAME (',' NAME)* */
2187 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002188 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002189#ifdef PRIVATE_NAME_MANGLING
2190 char buffer[256];
2191 if (s != NULL && s[0] == '_' && s[1] == '_' &&
2192 c->c_private != NULL &&
Guido van Rossum582acec2000-06-28 22:07:35 +00002193 com_mangle(c, s, buffer, sizeof(buffer)))
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002194 s = buffer;
2195#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +00002196 if (PyDict_GetItemString(c->c_locals, s) != NULL) {
2197 com_error(c, PyExc_SyntaxError,
2198 "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002199 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002200 else if (PyDict_SetItemString(c->c_globals, s, Py_None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002201 c->c_errors++;
2202 }
2203}
2204
Guido van Rossum681d79a1995-07-18 14:51:37 +00002205static int
2206com_newlocal_o(c, nameval)
2207 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002208 PyObject *nameval;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002209{
2210 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002211 PyObject *ival;
2212 if (PyList_Size(c->c_varnames) != c->c_nlocals) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002213 /* This is usually caused by an error on a previous call */
2214 if (c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002215 com_error(c, PyExc_SystemError,
2216 "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002217 }
2218 return 0;
2219 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002220 ival = PyInt_FromLong(i = c->c_nlocals++);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002221 if (ival == NULL)
2222 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002223 else if (PyDict_SetItem(c->c_locals, nameval, ival) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002224 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002225 else if (PyList_Append(c->c_varnames, nameval) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002226 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002227 Py_XDECREF(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002228 return i;
2229}
2230
2231static int
2232com_addlocal_o(c, nameval)
2233 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002234 PyObject *nameval;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002235{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002236 PyObject *ival = PyDict_GetItem(c->c_locals, nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002237 if (ival != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002238 return PyInt_AsLong(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002239 return com_newlocal_o(c, nameval);
2240}
2241
2242static int
2243com_newlocal(c, name)
2244 struct compiling *c;
2245 char *name;
2246{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002247 PyObject *nameval = PyString_InternFromString(name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002248 int i;
2249 if (nameval == NULL) {
2250 c->c_errors++;
2251 return 0;
2252 }
2253 i = com_newlocal_o(c, nameval);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002254 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002255 return i;
2256}
2257
Guido van Rossumc5e96291991-12-10 13:53:51 +00002258static void
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002259com_exec_stmt(c, n)
2260 struct compiling *c;
2261 node *n;
2262{
2263 REQ(n, exec_stmt);
2264 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2265 com_node(c, CHILD(n, 1));
2266 if (NCH(n) >= 4)
2267 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002268 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002269 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002270 com_push(c, 1);
2271 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002272 if (NCH(n) >= 6)
2273 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002274 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002275 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002276 com_push(c, 1);
2277 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002278 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002279 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002280}
2281
Guido van Rossum7c531111997-03-11 18:42:21 +00002282static int
2283is_constant_false(c, n)
2284 struct compiling *c;
2285 node *n;
2286{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002287 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002288 int i;
2289
2290 /* Label to avoid tail recursion */
2291 next:
2292 switch (TYPE(n)) {
2293
2294 case suite:
2295 if (NCH(n) == 1) {
2296 n = CHILD(n, 0);
2297 goto next;
2298 }
2299 /* Fall through */
2300 case file_input:
2301 for (i = 0; i < NCH(n); i++) {
2302 node *ch = CHILD(n, i);
2303 if (TYPE(ch) == stmt) {
2304 n = ch;
2305 goto next;
2306 }
2307 }
2308 break;
2309
2310 case stmt:
2311 case simple_stmt:
2312 case small_stmt:
2313 n = CHILD(n, 0);
2314 goto next;
2315
2316 case expr_stmt:
2317 case testlist:
2318 case test:
2319 case and_test:
2320 case not_test:
2321 case comparison:
2322 case expr:
2323 case xor_expr:
2324 case and_expr:
2325 case shift_expr:
2326 case arith_expr:
2327 case term:
2328 case factor:
2329 case power:
2330 case atom:
2331 if (NCH(n) == 1) {
2332 n = CHILD(n, 0);
2333 goto next;
2334 }
2335 break;
2336
2337 case NAME:
2338 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2339 return 1;
2340 break;
2341
2342 case NUMBER:
2343 v = parsenumber(c, STR(n));
2344 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002345 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002346 break;
2347 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002348 i = PyObject_IsTrue(v);
2349 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002350 return i == 0;
2351
2352 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002353 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002354 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002355 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002356 break;
2357 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002358 i = PyObject_IsTrue(v);
2359 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002360 return i == 0;
2361
2362 }
2363 return 0;
2364}
2365
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002366static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002367com_if_stmt(c, n)
2368 struct compiling *c;
2369 node *n;
2370{
2371 int i;
2372 int anchor = 0;
2373 REQ(n, if_stmt);
2374 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2375 for (i = 0; i+3 < NCH(n); i+=4) {
2376 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002377 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002378 if (is_constant_false(c, ch))
2379 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002380 if (i > 0)
2381 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002382 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002383 com_addfwref(c, JUMP_IF_FALSE, &a);
2384 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002385 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002386 com_node(c, CHILD(n, i+3));
2387 com_addfwref(c, JUMP_FORWARD, &anchor);
2388 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002389 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002390 com_addbyte(c, POP_TOP);
2391 }
2392 if (i+2 < NCH(n))
2393 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002394 if (anchor)
2395 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002396}
2397
2398static void
2399com_while_stmt(c, n)
2400 struct compiling *c;
2401 node *n;
2402{
2403 int break_anchor = 0;
2404 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002405 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002406 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2407 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002408 block_push(c, SETUP_LOOP);
2409 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002410 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002411 com_node(c, CHILD(n, 1));
2412 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2413 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002414 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002415 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002416 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002417 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002418 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2419 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002420 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002421 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002422 com_addbyte(c, POP_TOP);
2423 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002424 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002425 if (NCH(n) > 4)
2426 com_node(c, CHILD(n, 6));
2427 com_backpatch(c, break_anchor);
2428}
2429
2430static void
2431com_for_stmt(c, n)
2432 struct compiling *c;
2433 node *n;
2434{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002435 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002436 int break_anchor = 0;
2437 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002438 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002439 REQ(n, for_stmt);
2440 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2441 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002442 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002443 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002444 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002445 if (v == NULL)
2446 c->c_errors++;
2447 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002448 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002449 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002450 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002451 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002452 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002453 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002454 com_assign(c, CHILD(n, 1), OP_ASSIGN);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002455 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002456 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002457 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002458 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2459 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002460 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002461 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002462 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002463 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002464 if (NCH(n) > 8)
2465 com_node(c, CHILD(n, 8));
2466 com_backpatch(c, break_anchor);
2467}
2468
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002469/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002470
2471 SETUP_FINALLY L
2472 <code for S>
2473 POP_BLOCK
2474 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002475 L: <code for Sf>
2476 END_FINALLY
2477
2478 The special instructions use the block stack. Each block
2479 stack entry contains the instruction that created it (here
2480 SETUP_FINALLY), the level of the value stack at the time the
2481 block stack entry was created, and a label (here L).
2482
2483 SETUP_FINALLY:
2484 Pushes the current value stack level and the label
2485 onto the block stack.
2486 POP_BLOCK:
2487 Pops en entry from the block stack, and pops the value
2488 stack until its level is the same as indicated on the
2489 block stack. (The label is ignored.)
2490 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002491 Pops a variable number of entries from the *value* stack
2492 and re-raises the exception they specify. The number of
2493 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002494
2495 The block stack is unwound when an exception is raised:
2496 when a SETUP_FINALLY entry is found, the exception is pushed
2497 onto the value stack (and the exception condition is cleared),
2498 and the interpreter jumps to the label gotten from the block
2499 stack.
2500
2501 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002502 (The contents of the value stack is shown in [], with the top
2503 at the right; 'tb' is trace-back info, 'val' the exception's
2504 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002505
2506 Value stack Label Instruction Argument
2507 [] SETUP_EXCEPT L1
2508 [] <code for S>
2509 [] POP_BLOCK
2510 [] JUMP_FORWARD L0
2511
Guido van Rossum3f5da241990-12-20 15:06:42 +00002512 [tb, val, exc] L1: DUP )
2513 [tb, val, exc, exc] <evaluate E1> )
2514 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2515 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2516 [tb, val, exc, 1] POP )
2517 [tb, val, exc] POP
2518 [tb, val] <assign to V1> (or POP if no V1)
2519 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002520 [] <code for S1>
2521 JUMP_FORWARD L0
2522
Guido van Rossum3f5da241990-12-20 15:06:42 +00002523 [tb, val, exc, 0] L2: POP
2524 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002525 .............................etc.......................
2526
Guido van Rossum3f5da241990-12-20 15:06:42 +00002527 [tb, val, exc, 0] Ln+1: POP
2528 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002529
2530 [] L0: <next statement>
2531
2532 Of course, parts are not generated if Vi or Ei is not present.
2533*/
2534
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002535static void
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002536com_try_except(c, n)
2537 struct compiling *c;
2538 node *n;
2539{
2540 int except_anchor = 0;
2541 int end_anchor = 0;
2542 int else_anchor = 0;
2543 int i;
2544 node *ch;
2545
2546 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2547 block_push(c, SETUP_EXCEPT);
2548 com_node(c, CHILD(n, 2));
2549 com_addbyte(c, POP_BLOCK);
2550 block_pop(c, SETUP_EXCEPT);
2551 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2552 com_backpatch(c, except_anchor);
2553 for (i = 3;
2554 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2555 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002556 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002557 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002558 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002559 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002560 break;
2561 }
2562 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002563 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002564 com_addoparg(c, SET_LINENO, ch->n_lineno);
2565 if (NCH(ch) > 1) {
2566 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002567 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002568 com_node(c, CHILD(ch, 1));
2569 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002570 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002571 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2572 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002573 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002574 }
2575 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002576 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002577 if (NCH(ch) > 3)
Guido van Rossum8861b741996-07-30 16:49:37 +00002578 com_assign(c, CHILD(ch, 3), OP_ASSIGN);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002579 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002580 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002581 com_pop(c, 1);
2582 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002583 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002584 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002585 com_node(c, CHILD(n, i+2));
2586 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2587 if (except_anchor) {
2588 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002589 /* We come in with [tb, val, exc, 0] on the
2590 stack; one pop and it's the same as
2591 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002592 com_addbyte(c, POP_TOP);
2593 }
2594 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002595 /* We actually come in here with [tb, val, exc] but the
2596 END_FINALLY will zap those and jump around.
2597 The c_stacklevel does not reflect them so we need not pop
2598 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002599 com_addbyte(c, END_FINALLY);
2600 com_backpatch(c, else_anchor);
2601 if (i < NCH(n))
2602 com_node(c, CHILD(n, i+2));
2603 com_backpatch(c, end_anchor);
2604}
2605
2606static void
2607com_try_finally(c, n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002608 struct compiling *c;
2609 node *n;
2610{
2611 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002612 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002613
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002614 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2615 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002616 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002617 com_addbyte(c, POP_BLOCK);
2618 block_pop(c, SETUP_FINALLY);
2619 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002620 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002621 /* While the generated code pushes only one item,
2622 the try-finally handling can enter here with
2623 up to three items. OK, here are the details:
2624 3 for an exception, 2 for RETURN, 1 for BREAK. */
2625 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002626 com_backpatch(c, finally_anchor);
2627 ch = CHILD(n, NCH(n)-1);
2628 com_addoparg(c, SET_LINENO, ch->n_lineno);
2629 com_node(c, ch);
2630 com_addbyte(c, END_FINALLY);
2631 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002632 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002633}
2634
2635static void
2636com_try_stmt(c, n)
2637 struct compiling *c;
2638 node *n;
2639{
2640 REQ(n, try_stmt);
2641 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2642 | 'try' ':' suite 'finally' ':' suite */
2643 if (TYPE(CHILD(n, 3)) != except_clause)
2644 com_try_finally(c, n);
2645 else
2646 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002647}
2648
Guido van Rossum8b993a91997-01-17 21:04:03 +00002649static node *
2650get_rawdocstring(n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002651 node *n;
2652{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002653 int i;
2654
Guido van Rossum8b993a91997-01-17 21:04:03 +00002655 /* Label to avoid tail recursion */
2656 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002657 switch (TYPE(n)) {
2658
2659 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002660 if (NCH(n) == 1) {
2661 n = CHILD(n, 0);
2662 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002663 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002664 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002665 case file_input:
2666 for (i = 0; i < NCH(n); i++) {
2667 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002668 if (TYPE(ch) == stmt) {
2669 n = ch;
2670 goto next;
2671 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002672 }
2673 break;
2674
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002675 case stmt:
2676 case simple_stmt:
2677 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002678 n = CHILD(n, 0);
2679 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002680
2681 case expr_stmt:
2682 case testlist:
2683 case test:
2684 case and_test:
2685 case not_test:
2686 case comparison:
2687 case expr:
2688 case xor_expr:
2689 case and_expr:
2690 case shift_expr:
2691 case arith_expr:
2692 case term:
2693 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002694 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002695 if (NCH(n) == 1) {
2696 n = CHILD(n, 0);
2697 goto next;
2698 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002699 break;
2700
2701 case atom:
2702 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002703 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002704 break;
2705
2706 }
2707 return NULL;
2708}
2709
Guido van Rossum79f25d91997-04-29 20:08:16 +00002710static PyObject *
Guido van Rossum8b993a91997-01-17 21:04:03 +00002711get_docstring(n)
2712 node *n;
2713{
Guido van Rossum541563e1999-01-28 15:08:09 +00002714 /* Don't generate doc-strings if run with -OO */
2715 if (Py_OptimizeFlag > 1)
2716 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002717 n = get_rawdocstring(n);
2718 if (n == NULL)
2719 return NULL;
2720 return parsestrplus(n);
2721}
2722
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002723static void
2724com_suite(c, n)
2725 struct compiling *c;
2726 node *n;
2727{
2728 REQ(n, suite);
2729 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2730 if (NCH(n) == 1) {
2731 com_node(c, CHILD(n, 0));
2732 }
2733 else {
2734 int i;
2735 for (i = 0; i < NCH(n); i++) {
2736 node *ch = CHILD(n, i);
2737 if (TYPE(ch) == stmt)
2738 com_node(c, ch);
2739 }
2740 }
2741}
2742
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002743/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002744static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002745com_continue_stmt(c, n)
2746 struct compiling *c;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002747 node *n; /* Not used, but passed for consistency */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002748{
2749 int i = c->c_nblocks;
2750 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2751 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2752 }
2753 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002754 com_error(c, PyExc_SyntaxError,
2755 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002756 }
2757 /* XXX Could allow it inside a 'finally' clause
2758 XXX if we could pop the exception still on the stack */
2759}
2760
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002761static int
Guido van Rossum681d79a1995-07-18 14:51:37 +00002762com_argdefs(c, n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002763 struct compiling *c;
2764 node *n;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002765{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002766 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002767 if (TYPE(n) == lambdef) {
2768 /* lambdef: 'lambda' [varargslist] ':' test */
2769 n = CHILD(n, 1);
2770 }
2771 else {
2772 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2773 n = CHILD(n, 2);
2774 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2775 n = CHILD(n, 1);
2776 }
2777 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002778 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002779 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002780 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002781 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2782 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002783 nargs = 0;
2784 ndefs = 0;
2785 for (i = 0; i < nch; i++) {
2786 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002787 if (TYPE(CHILD(n, i)) == STAR ||
2788 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002789 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002790 nargs++;
2791 i++;
2792 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002793 t = RPAR; /* Anything except EQUAL or COMMA */
2794 else
2795 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002796 if (t == EQUAL) {
2797 i++;
2798 ndefs++;
2799 com_node(c, CHILD(n, i));
2800 i++;
2801 if (i >= nch)
2802 break;
2803 t = TYPE(CHILD(n, i));
2804 }
2805 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00002806 /* Treat "(a=1, b)" as an error */
2807 if (ndefs)
2808 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00002809 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002810 }
2811 if (t != COMMA)
2812 break;
2813 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002814 return ndefs;
2815}
2816
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002817static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002818com_funcdef(c, n)
2819 struct compiling *c;
2820 node *n;
2821{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002822 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002823 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002824 v = (PyObject *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002825 if (v == NULL)
2826 c->c_errors++;
2827 else {
2828 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002829 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002830 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002831 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002832 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002833 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002834 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002835 com_pop(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002836 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002837 }
2838}
2839
2840static void
Guido van Rossum25831651993-05-19 14:50:45 +00002841com_bases(c, n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002842 struct compiling *c;
2843 node *n;
2844{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002845 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002846 REQ(n, testlist);
2847 /* testlist: test (',' test)* [','] */
2848 for (i = 0; i < NCH(n); i += 2)
2849 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002850 i = (NCH(n)+1) / 2;
2851 com_addoparg(c, BUILD_TUPLE, i);
2852 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00002853}
2854
2855static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002856com_classdef(c, n)
2857 struct compiling *c;
2858 node *n;
2859{
Guido van Rossum25831651993-05-19 14:50:45 +00002860 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002861 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002862 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002863 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00002864 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00002865 c->c_errors++;
2866 return;
2867 }
2868 /* Push the class name on the stack */
2869 i = com_addconst(c, v);
2870 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002871 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002872 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00002873 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002874 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00002875 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002876 com_push(c, 1);
2877 }
Guido van Rossum25831651993-05-19 14:50:45 +00002878 else
2879 com_bases(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002880 v = (PyObject *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002881 if (v == NULL)
2882 c->c_errors++;
2883 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002884 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002885 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002886 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002887 com_addoparg(c, MAKE_FUNCTION, 0);
2888 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002889 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002890 com_pop(c, 2);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002891 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002892 Py_DECREF(v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002893 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002894}
2895
2896static void
2897com_node(c, n)
2898 struct compiling *c;
2899 node *n;
2900{
2901 switch (TYPE(n)) {
2902
2903 /* Definition nodes */
2904
2905 case funcdef:
2906 com_funcdef(c, n);
2907 break;
2908 case classdef:
2909 com_classdef(c, n);
2910 break;
2911
2912 /* Trivial parse tree nodes */
2913
2914 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002915 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002916 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002917 com_node(c, CHILD(n, 0));
2918 break;
2919
2920 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002921 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2922 com_addoparg(c, SET_LINENO, n->n_lineno);
2923 {
2924 int i;
2925 for (i = 0; i < NCH(n)-1; i += 2)
2926 com_node(c, CHILD(n, i));
2927 }
2928 break;
2929
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002930 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002931 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002932 com_node(c, CHILD(n, 0));
2933 break;
2934
2935 /* Statement nodes */
2936
2937 case expr_stmt:
2938 com_expr_stmt(c, n);
2939 break;
2940 case print_stmt:
2941 com_print_stmt(c, n);
2942 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002943 case del_stmt: /* 'del' exprlist */
Guido van Rossum8861b741996-07-30 16:49:37 +00002944 com_assign(c, CHILD(n, 1), OP_DELETE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002945 break;
2946 case pass_stmt:
2947 break;
2948 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002949 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002950 com_error(c, PyExc_SyntaxError,
2951 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002952 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002953 com_addbyte(c, BREAK_LOOP);
2954 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002955 case continue_stmt:
2956 com_continue_stmt(c, n);
2957 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002958 case return_stmt:
2959 com_return_stmt(c, n);
2960 break;
2961 case raise_stmt:
2962 com_raise_stmt(c, n);
2963 break;
2964 case import_stmt:
2965 com_import_stmt(c, n);
2966 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002967 case global_stmt:
2968 com_global_stmt(c, n);
2969 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002970 case exec_stmt:
2971 com_exec_stmt(c, n);
2972 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002973 case assert_stmt:
2974 com_assert_stmt(c, n);
2975 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002976 case if_stmt:
2977 com_if_stmt(c, n);
2978 break;
2979 case while_stmt:
2980 com_while_stmt(c, n);
2981 break;
2982 case for_stmt:
2983 com_for_stmt(c, n);
2984 break;
2985 case try_stmt:
2986 com_try_stmt(c, n);
2987 break;
2988 case suite:
2989 com_suite(c, n);
2990 break;
2991
2992 /* Expression nodes */
2993
2994 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002995 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002996 break;
2997 case test:
2998 com_test(c, n);
2999 break;
3000 case and_test:
3001 com_and_test(c, n);
3002 break;
3003 case not_test:
3004 com_not_test(c, n);
3005 break;
3006 case comparison:
3007 com_comparison(c, n);
3008 break;
3009 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003010 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003011 break;
3012 case expr:
3013 com_expr(c, n);
3014 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003015 case xor_expr:
3016 com_xor_expr(c, n);
3017 break;
3018 case and_expr:
3019 com_and_expr(c, n);
3020 break;
3021 case shift_expr:
3022 com_shift_expr(c, n);
3023 break;
3024 case arith_expr:
3025 com_arith_expr(c, n);
3026 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003027 case term:
3028 com_term(c, n);
3029 break;
3030 case factor:
3031 com_factor(c, n);
3032 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003033 case power:
3034 com_power(c, n);
3035 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003036 case atom:
3037 com_atom(c, n);
3038 break;
3039
3040 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003041 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003042 com_error(c, PyExc_SystemError,
3043 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003044 }
3045}
3046
Guido van Rossum79f25d91997-04-29 20:08:16 +00003047static void com_fplist Py_PROTO((struct compiling *, node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003048
3049static void
3050com_fpdef(c, n)
3051 struct compiling *c;
3052 node *n;
3053{
3054 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3055 if (TYPE(CHILD(n, 0)) == LPAR)
3056 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003057 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003058 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003059 com_pop(c, 1);
3060 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003061}
3062
3063static void
3064com_fplist(c, n)
3065 struct compiling *c;
3066 node *n;
3067{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003068 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003069 if (NCH(n) == 1) {
3070 com_fpdef(c, CHILD(n, 0));
3071 }
3072 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003073 int i = (NCH(n)+1)/2;
3074 com_addoparg(c, UNPACK_TUPLE, i);
3075 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003076 for (i = 0; i < NCH(n); i += 2)
3077 com_fpdef(c, CHILD(n, i));
3078 }
3079}
3080
3081static void
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003082com_arglist(c, n)
3083 struct compiling *c;
3084 node *n;
3085{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003086 int nch, i;
3087 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003088 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003089 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003090 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003091 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003092 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003093 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003094 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003095 node *ch = CHILD(n, i);
3096 node *fp;
3097 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00003098 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003099 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003100 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3101 fp = CHILD(ch, 0);
3102 if (TYPE(fp) == NAME)
3103 name = STR(fp);
3104 else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003105 name = nbuf;
3106 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003107 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003108 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003109 com_newlocal(c, name);
3110 c->c_argcount++;
3111 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003112 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003113 ch = CHILD(n, i);
3114 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003115 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003116 else
3117 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003118 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003119 /* Handle *arguments */
3120 if (i < nch) {
3121 node *ch;
3122 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003123 if (TYPE(ch) != DOUBLESTAR) {
3124 REQ(ch, STAR);
3125 ch = CHILD(n, i+1);
3126 if (TYPE(ch) == NAME) {
3127 c->c_flags |= CO_VARARGS;
3128 i += 3;
3129 com_newlocal(c, STR(ch));
3130 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003131 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003132 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003133 /* Handle **keywords */
3134 if (i < nch) {
3135 node *ch;
3136 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003137 if (TYPE(ch) != DOUBLESTAR) {
3138 REQ(ch, STAR);
3139 ch = CHILD(n, i+1);
3140 REQ(ch, STAR);
3141 ch = CHILD(n, i+2);
3142 }
3143 else
3144 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003145 REQ(ch, NAME);
3146 c->c_flags |= CO_VARKEYWORDS;
3147 com_newlocal(c, STR(ch));
3148 }
3149 if (complex) {
3150 /* Generate code for complex arguments only after
3151 having counted the simple arguments */
3152 int ilocal = 0;
3153 for (i = 0; i < nch; i++) {
3154 node *ch = CHILD(n, i);
3155 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003156 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003157 break;
3158 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3159 fp = CHILD(ch, 0);
3160 if (TYPE(fp) != NAME) {
3161 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003162 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003163 com_fpdef(c, ch);
3164 }
3165 ilocal++;
3166 if (++i >= nch)
3167 break;
3168 ch = CHILD(n, i);
3169 if (TYPE(ch) == EQUAL)
3170 i += 2;
3171 else
3172 REQ(ch, COMMA);
3173 }
3174 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003175}
3176
3177static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003178com_file_input(c, n)
3179 struct compiling *c;
3180 node *n;
3181{
3182 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003183 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003184 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003185 doc = get_docstring(n);
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 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003194 for (i = 0; i < NCH(n); i++) {
3195 node *ch = CHILD(n, i);
3196 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3197 com_node(c, ch);
3198 }
3199}
3200
3201/* Top-level compile-node interface */
3202
3203static void
3204compile_funcdef(c, n)
3205 struct compiling *c;
3206 node *n;
3207{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003208 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003209 node *ch;
3210 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003211 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003212 doc = get_docstring(CHILD(n, 4));
3213 if (doc != NULL) {
3214 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003215 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003216 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003217 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003218 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003219 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3220 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003221 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003222 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003223 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003224 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003225 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003226 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003227 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003228 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003229 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003230}
3231
3232static void
Guido van Rossum590baa41993-11-30 13:40:46 +00003233compile_lambdef(c, n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003234 struct compiling *c;
3235 node *n;
3236{
Guido van Rossum590baa41993-11-30 13:40:46 +00003237 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003238 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003239 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003240
3241 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003242 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003243 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003244 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003245 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003246 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003247 else
3248 ch = CHILD(n, 2);
3249 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003250 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003251 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003252}
3253
3254static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003255compile_classdef(c, n)
3256 struct compiling *c;
3257 node *n;
3258{
3259 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003260 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003261 REQ(n, classdef);
3262 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3263 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003264#ifdef PRIVATE_NAME_MANGLING
3265 c->c_private = c->c_name;
3266#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003267 ch = CHILD(n, NCH(n)-1); /* The suite */
3268 doc = get_docstring(ch);
3269 if (doc != NULL) {
3270 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003271 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003272 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003273 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003274 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003275 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003276 }
3277 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003278 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003279 com_node(c, ch);
3280 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003281 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003282 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003283 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003284}
3285
3286static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003287compile_node(c, n)
3288 struct compiling *c;
3289 node *n;
3290{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003291 com_addoparg(c, SET_LINENO, n->n_lineno);
3292
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003293 switch (TYPE(n)) {
3294
Guido van Rossum4c417781991-01-21 16:09:22 +00003295 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003296 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003297 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003298 n = CHILD(n, 0);
3299 if (TYPE(n) != NEWLINE)
3300 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003301 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003302 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003303 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003304 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003305 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003306 break;
3307
Guido van Rossum4c417781991-01-21 16:09:22 +00003308 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003309 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003310 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003311 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003312 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003313 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003314 break;
3315
Guido van Rossum590baa41993-11-30 13:40:46 +00003316 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003317 com_node(c, CHILD(n, 0));
3318 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003319 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003320 break;
3321
Guido van Rossum590baa41993-11-30 13:40:46 +00003322 case lambdef: /* anonymous function definition */
3323 compile_lambdef(c, n);
3324 break;
3325
Guido van Rossum4c417781991-01-21 16:09:22 +00003326 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003327 compile_funcdef(c, n);
3328 break;
3329
Guido van Rossum4c417781991-01-21 16:09:22 +00003330 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003331 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003332 break;
3333
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003334 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003335 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003336 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003337 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003338 }
3339}
3340
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003341/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00003342
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003343 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
3344 instructions that refer to local variables with LOAD_FAST etc.
3345 The latter instructions are much faster because they don't need to
3346 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003347
Guido van Rossum681d79a1995-07-18 14:51:37 +00003348 To find all local variables, we check all STORE_NAME, IMPORT_FROM
3349 and DELETE_NAME instructions. This yields all local variables,
3350 function definitions, class definitions and import statements.
3351 Argument names have already been entered into the list by the
3352 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003353
3354 All remaining LOAD_NAME instructions must refer to non-local (global
3355 or builtin) variables, so are replaced by LOAD_GLOBAL.
3356
3357 There are two problems: 'from foo import *' and 'exec' may introduce
3358 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00003359 case, we can still optimize bona fide locals (since those
3360 statements will be surrounded by fast_2_locals() and
3361 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003362
Guido van Rossum681d79a1995-07-18 14:51:37 +00003363 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00003364
3365static void
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003366optimize(c)
3367 struct compiling *c;
Guido van Rossum282914b1991-04-04 10:42:56 +00003368{
Guido van Rossum0a697f61991-04-16 08:39:12 +00003369 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00003370 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00003371 int oparg = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003372 PyObject *name;
3373 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003374
Guido van Rossum282914b1991-04-04 10:42:56 +00003375#define NEXTOP() (*next_instr++)
3376#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossum79f25d91997-04-29 20:08:16 +00003377#define GETITEM(v, i) (PyList_GetItem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003378#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
3379
Guido van Rossum79f25d91997-04-29 20:08:16 +00003380 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003381
3382 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00003383
Guido van Rossum79f25d91997-04-29 20:08:16 +00003384 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003385 for (;;) {
3386 opcode = NEXTOP();
3387 if (opcode == STOP_CODE)
3388 break;
3389 if (HAS_ARG(opcode))
3390 oparg = NEXTARG();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003391 switch (opcode) {
3392 case STORE_NAME:
3393 case DELETE_NAME:
3394 case IMPORT_FROM:
3395 com_addlocal_o(c, GETNAMEOBJ(oparg));
3396 break;
3397 case EXEC_STMT:
3398 c->c_flags &= ~CO_OPTIMIZED;
3399 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00003400 }
3401 }
3402
Guido van Rossum79f25d91997-04-29 20:08:16 +00003403 if (PyDict_GetItemString(c->c_locals, "*") != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003404 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003405
Guido van Rossum79f25d91997-04-29 20:08:16 +00003406 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003407 for (;;) {
3408 cur_instr = next_instr;
3409 opcode = NEXTOP();
3410 if (opcode == STOP_CODE)
3411 break;
3412 if (HAS_ARG(opcode))
3413 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003414 if (opcode == LOAD_NAME ||
3415 opcode == STORE_NAME ||
3416 opcode == DELETE_NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003417 PyObject *v;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003418 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00003419 name = GETNAMEOBJ(oparg);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003420 v = PyDict_GetItem(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003421 if (v == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003422 if (opcode == LOAD_NAME &&
3423 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003424 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003425 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00003426 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003427 i = PyInt_AsLong(v);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003428 switch (opcode) {
3429 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
3430 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
3431 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
3432 }
3433 cur_instr[1] = i & 0xff;
3434 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00003435 }
3436 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003437
Guido van Rossum681d79a1995-07-18 14:51:37 +00003438 if (c->c_errors == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00003439 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00003440}
3441
Guido van Rossum79f25d91997-04-29 20:08:16 +00003442PyCodeObject *
3443PyNode_Compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003444 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003445 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003446{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003447 return jcompile(n, filename, NULL);
3448}
3449
Guido van Rossum79f25d91997-04-29 20:08:16 +00003450static PyCodeObject *
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003451icompile(n, base)
3452 node *n;
3453 struct compiling *base;
3454{
3455 return jcompile(n, base->c_filename, base);
3456}
3457
Guido van Rossum79f25d91997-04-29 20:08:16 +00003458static PyCodeObject *
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003459jcompile(n, filename, base)
3460 node *n;
3461 char *filename;
3462 struct compiling *base;
3463{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003464 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003465 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003466 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003467 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003468#ifdef PRIVATE_NAME_MANGLING
3469 if (base)
3470 sc.c_private = base->c_private;
3471 else
3472 sc.c_private = NULL;
3473#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003474 compile_node(&sc, n);
3475 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003476 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003477 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003478 sc.c_flags |= CO_NEWLOCALS;
3479 }
3480 else if (TYPE(n) == classdef)
3481 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00003482 co = NULL;
3483 if (sc.c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003484 PyObject *consts, *names, *varnames, *filename, *name;
3485 consts = PyList_AsTuple(sc.c_consts);
3486 names = PyList_AsTuple(sc.c_names);
3487 varnames = PyList_AsTuple(sc.c_varnames);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003488 filename = PyString_InternFromString(sc.c_filename);
3489 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003490 if (!PyErr_Occurred())
3491 co = PyCode_New(sc.c_argcount,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003492 sc.c_nlocals,
Guido van Rossum8b993a91997-01-17 21:04:03 +00003493 sc.c_maxstacklevel,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003494 sc.c_flags,
3495 sc.c_code,
3496 consts,
3497 names,
3498 varnames,
3499 filename,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003500 name,
3501 sc.c_firstlineno,
3502 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003503 Py_XDECREF(consts);
3504 Py_XDECREF(names);
3505 Py_XDECREF(varnames);
3506 Py_XDECREF(filename);
3507 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003508 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003509 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003510 return co;
3511}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003512
3513int
3514PyCode_Addr2Line(co, addrq)
3515 PyCodeObject *co;
3516 int addrq;
3517{
3518 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003519 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003520 int line = co->co_firstlineno;
3521 int addr = 0;
3522 while (--size >= 0) {
3523 addr += *p++;
3524 if (addr > addrq)
3525 break;
3526 line += *p++;
3527 }
3528 return line;
3529}