blob: 0409f2d0d8240e1b6934fdd4b529a9859a2d7659 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002/* Compile an expression node to intermediate code */
3
Guido van Rossum3f5da241990-12-20 15:06:42 +00004/* XXX TO DO:
Guido van Rossum8b993a91997-01-17 21:04:03 +00005 XXX add __doc__ attribute == co_doc to code object attributes?
6 XXX (it's currently the first item of the co_const tuple)
Guido van Rossum3f5da241990-12-20 15:06:42 +00007 XXX Generate simple jump for break/return outside 'try...finally'
Guido van Rossum8b993a91997-01-17 21:04:03 +00008 XXX Allow 'continue' inside try-finally
Guido van Rossum8b993a91997-01-17 21:04:03 +00009 XXX New opcode for loading the initial index for a for loop
Guido van Rossum681d79a1995-07-18 14:51:37 +000010 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000011*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000012
Guido van Rossum8ff077b1996-08-24 06:21:31 +000013#ifndef NO_PRIVATE_NAME_MANGLING
14#define PRIVATE_NAME_MANGLING
15#endif
16
Guido van Rossum79f25d91997-04-29 20:08:16 +000017#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000018
Guido van Rossum10dc2e81990-11-18 17:27:39 +000019#include "node.h"
20#include "token.h"
21#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000022#include "compile.h"
23#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000024#include "structmember.h"
25
26#include <ctype.h>
Jack Jansen41aa8e52000-07-03 21:39:47 +000027#ifdef HAVE_LIMITS_H
28#include <limits.h>
29#endif
Fred Drakeef8ace32000-08-24 00:32:09 +000030#ifndef INT_MAX
31#define INT_MAX 2147483647
32#endif
Guido van Rossum282914b1991-04-04 10:42:56 +000033
Guido van Rossumb05a5c71997-05-07 17:46:13 +000034/* Three symbols from graminit.h are also defined in Python.h, with
35 Py_ prefixes to their names. Python.h can't include graminit.h
36 (which defines too many confusing symbols), but we can check here
37 that they haven't changed (which is very unlikely, but possible). */
38#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000039 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000040#endif
41#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000042 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000043#endif
44#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000045 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000046#endif
47
Guido van Rossum8e793d91997-03-03 19:13:14 +000048int Py_OptimizeFlag = 0;
49
Guido van Rossum8861b741996-07-30 16:49:37 +000050#define OP_DELETE 0
51#define OP_ASSIGN 1
52#define OP_APPLY 2
53
Guido van Rossum79f25d91997-04-29 20:08:16 +000054#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000055
56static struct memberlist code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000057 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
58 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000059 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000060 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000061 {"co_code", T_OBJECT, OFF(co_code), READONLY},
62 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
63 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000064 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000065 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000066 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000067 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
68 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000069 {NULL} /* Sentinel */
70};
71
Guido van Rossum79f25d91997-04-29 20:08:16 +000072static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000073code_getattr(PyCodeObject *co, char *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +000074{
Guido van Rossum79f25d91997-04-29 20:08:16 +000075 return PyMember_Get((char *)co, code_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +000076}
Guido van Rossum10dc2e81990-11-18 17:27:39 +000077
78static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000079code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +000080{
Guido van Rossum79f25d91997-04-29 20:08:16 +000081 Py_XDECREF(co->co_code);
82 Py_XDECREF(co->co_consts);
83 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +000084 Py_XDECREF(co->co_varnames);
Guido van Rossum79f25d91997-04-29 20:08:16 +000085 Py_XDECREF(co->co_filename);
86 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +000087 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +000088 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +000089}
90
Guido van Rossum79f25d91997-04-29 20:08:16 +000091static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000092code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +000093{
94 char buf[500];
95 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +000096 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +000097 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +000098
Guido van Rossuma396a882000-04-07 01:21:36 +000099 if (co->co_firstlineno != 0)
100 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000101 if (co->co_filename && PyString_Check(co->co_filename))
102 filename = PyString_AsString(co->co_filename);
103 if (co->co_name && PyString_Check(co->co_name))
104 name = PyString_AsString(co->co_name);
Fred Drake615ae552000-06-30 16:20:13 +0000105 sprintf(buf, "<code object %.100s at %p, file \"%.300s\", line %d>",
106 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000107 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000108}
109
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000110static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000111code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000112{
113 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000114 cmp = PyObject_Compare(co->co_name, cp->co_name);
115 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000116 cmp = co->co_argcount - cp->co_argcount;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000117 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000118 cmp = co->co_nlocals - cp->co_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000119 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000120 cmp = co->co_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000121 if (cmp) return cmp;
Guido van Rossumd076c731998-10-07 19:42:25 +0000122 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000123 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000124 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000125 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000126 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000127 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000128 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000129 return cmp;
130}
131
132static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000133code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000134{
Guido van Rossum44679592000-04-10 16:20:31 +0000135 long h, h0, h1, h2, h3, h4;
136 h0 = PyObject_Hash(co->co_name);
137 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000138 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000139 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000140 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000141 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000142 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000143 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000144 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000145 if (h4 == -1) return -1;
Guido van Rossum44679592000-04-10 16:20:31 +0000146 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000147 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000148 if (h == -1) h = -2;
149 return h;
150}
151
Guido van Rossum79f25d91997-04-29 20:08:16 +0000152PyTypeObject PyCode_Type = {
153 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000154 0,
155 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000156 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000157 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000158 (destructor)code_dealloc, /*tp_dealloc*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000159 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000160 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000161 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000162 (cmpfunc)code_compare, /*tp_compare*/
163 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000164 0, /*tp_as_number*/
165 0, /*tp_as_sequence*/
166 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000167 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000168};
169
Guido van Rossum644a12b1997-04-09 19:24:53 +0000170#define NAME_CHARS \
171 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
172
Guido van Rossum79f25d91997-04-29 20:08:16 +0000173PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000174PyCode_New(int argcount, int nlocals, int stacksize, int flags,
175 PyObject *code, PyObject *consts, PyObject *names,
176 PyObject *varnames, PyObject *filename, PyObject *name,
177 int firstlineno, PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000178{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000179 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000180 int i;
Guido van Rossumd076c731998-10-07 19:42:25 +0000181 PyBufferProcs *pb;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000182 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000183 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000184 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000185 consts == NULL || !PyTuple_Check(consts) ||
186 names == NULL || !PyTuple_Check(names) ||
187 varnames == NULL || !PyTuple_Check(varnames) ||
188 name == NULL || !PyString_Check(name) ||
189 filename == NULL || !PyString_Check(filename) ||
190 lnotab == NULL || !PyString_Check(lnotab)) {
191 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000192 return NULL;
193 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000194 pb = code->ob_type->tp_as_buffer;
195 if (pb == NULL ||
196 pb->bf_getreadbuffer == NULL ||
197 pb->bf_getsegcount == NULL ||
198 (*pb->bf_getsegcount)(code, NULL) != 1)
199 {
200 PyErr_BadInternalCall();
201 return NULL;
202 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000203 /* Make sure names and varnames are all strings, & intern them */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000204 for (i = PyTuple_Size(names); --i >= 0; ) {
205 PyObject *v = PyTuple_GetItem(names, i);
206 if (v == NULL || !PyString_Check(v)) {
207 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000208 return NULL;
209 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000210 PyString_InternInPlace(&PyTuple_GET_ITEM(names, i));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000211 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000212 for (i = PyTuple_Size(varnames); --i >= 0; ) {
213 PyObject *v = PyTuple_GetItem(varnames, i);
214 if (v == NULL || !PyString_Check(v)) {
215 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000216 return NULL;
217 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000218 PyString_InternInPlace(&PyTuple_GET_ITEM(varnames, i));
219 }
220 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000221 for (i = PyTuple_Size(consts); --i >= 0; ) {
222 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000223 char *p;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000224 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000225 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000226 p = PyString_AsString(v);
Guido van Rossum582acec2000-06-28 22:07:35 +0000227 if (strspn(p, NAME_CHARS)
228 != (size_t)PyString_Size(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000229 continue;
230 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000231 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000232 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000233 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000234 co->co_argcount = argcount;
235 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000236 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000237 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000238 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000239 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000240 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000241 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000242 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000243 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000245 co->co_varnames = varnames;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000246 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000247 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000248 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000249 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000250 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000251 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000252 co->co_lnotab = lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000253 }
254 return co;
255}
256
257
258/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000259
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000260struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000261 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000262 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000263 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000264 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000265 PyObject *c_name_dict; /* inverse of c_names */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000266 PyObject *c_globals; /* dictionary (value=None) */
267 PyObject *c_locals; /* dictionary (value=localID) */
268 PyObject *c_varnames; /* list (inverse of c_locals) */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000269 int c_nlocals; /* index of next local */
270 int c_argcount; /* number of top-level arguments */
271 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000272 int c_nexti; /* index into c_code */
273 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000274 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000275 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000276 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000277 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000278 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000279 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000280 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000281 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000282 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000283 int c_stacklevel; /* Current stack level */
284 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000285 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000286 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000287 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000288#ifdef PRIVATE_NAME_MANGLING
289 char *c_private; /* for private name mangling */
290#endif
Skip Montanaro803d6e52000-08-12 18:09:51 +0000291 int c_tmpname; /* temporary local name counter */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000292};
293
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000294
Guido van Rossum452a9831996-09-17 14:32:04 +0000295/* Error message including line number */
296
297static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000298com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000299{
Fred Drakedcf08e02000-08-15 15:49:44 +0000300 PyObject *v, *tb, *tmp;
Guido van Rossum635abd21997-01-06 22:56:52 +0000301 c->c_errors++;
Guido van Rossum452a9831996-09-17 14:32:04 +0000302 if (c->c_lineno <= 1) {
303 /* Unknown line number or single interactive command */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000304 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000305 return;
306 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000307 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000308 if (v == NULL)
309 return; /* MemoryError, too bad */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000310 PyErr_SetObject(exc, v);
311 Py_DECREF(v);
Fred Drakedcf08e02000-08-15 15:49:44 +0000312
313 /* add attributes for the line number and filename for the error */
314 PyErr_Fetch(&exc, &v, &tb);
315 PyErr_NormalizeException(&exc, &v, &tb);
316 tmp = PyInt_FromLong(c->c_lineno);
317 if (tmp == NULL)
318 PyErr_Clear();
319 else {
320 if (PyObject_SetAttrString(v, "lineno", tmp))
321 PyErr_Clear();
322 Py_DECREF(tmp);
323 }
324 if (c->c_filename != NULL) {
325 tmp = PyString_FromString(c->c_filename);
326 if (tmp == NULL)
327 PyErr_Clear();
328 else {
329 if (PyObject_SetAttrString(v, "filename", tmp))
330 PyErr_Clear();
331 Py_DECREF(tmp);
332 }
333 }
334 PyErr_Restore(exc, v, tb);
Guido van Rossum452a9831996-09-17 14:32:04 +0000335}
336
337
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000338/* Interface to the block stack */
339
340static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000341block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000342{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000343 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000344 com_error(c, PyExc_SystemError,
345 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000346 }
347 else {
348 c->c_block[c->c_nblocks++] = type;
349 }
350}
351
352static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000353block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000354{
355 if (c->c_nblocks > 0)
356 c->c_nblocks--;
357 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000358 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000359 }
360}
361
362
Guido van Rossum681d79a1995-07-18 14:51:37 +0000363/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000364
Tim Petersdbd9ba62000-07-09 03:09:57 +0000365static int com_init(struct compiling *, char *);
366static void com_free(struct compiling *);
367static void com_push(struct compiling *, int);
368static void com_pop(struct compiling *, int);
369static void com_done(struct compiling *);
370static void com_node(struct compiling *, struct _node *);
371static void com_factor(struct compiling *, struct _node *);
372static void com_addbyte(struct compiling *, int);
373static void com_addint(struct compiling *, int);
374static void com_addoparg(struct compiling *, int, int);
375static void com_addfwref(struct compiling *, int, int *);
376static void com_backpatch(struct compiling *, int);
377static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
378static int com_addconst(struct compiling *, PyObject *);
379static int com_addname(struct compiling *, PyObject *);
380static void com_addopname(struct compiling *, int, node *);
381static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000382static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000383static int com_argdefs(struct compiling *, node *);
384static int com_newlocal(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000385static void com_assign(struct compiling *, node *, int, node *);
386static void com_assign_name(struct compiling *, node *, int);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000387static PyCodeObject *icompile(struct _node *, struct compiling *);
388static PyCodeObject *jcompile(struct _node *, char *,
389 struct compiling *);
390static PyObject *parsestrplus(node *);
391static PyObject *parsestr(char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000392static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000393
394static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000395com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000396{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000397 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000398 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
399 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000400 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000401 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000402 goto fail;
403 if ((c->c_const_dict = PyDict_New()) == NULL)
404 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000405 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000406 goto fail;
407 if ((c->c_name_dict = PyDict_New()) == NULL)
408 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000409 if ((c->c_globals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000410 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000411 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000412 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000413 if ((c->c_varnames = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000414 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000415 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
416 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000417 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000418 c->c_nlocals = 0;
419 c->c_argcount = 0;
420 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000421 c->c_nexti = 0;
422 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000423 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000424 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000425 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000426 c->c_begin = 0;
427 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000428 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000429 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000430 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000431 c->c_stacklevel = 0;
432 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000433 c->c_firstlineno = 0;
434 c->c_last_addr = 0;
435 c->c_last_line = 0;
436 c-> c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000437 c->c_tmpname = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000438 return 1;
439
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000440 fail:
441 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000442 return 0;
443}
444
445static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000446com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000447{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000448 Py_XDECREF(c->c_code);
449 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000450 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000451 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000452 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000453 Py_XDECREF(c->c_globals);
454 Py_XDECREF(c->c_locals);
455 Py_XDECREF(c->c_varnames);
456 Py_XDECREF(c->c_lnotab);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000457}
458
459static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000460com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000461{
462 c->c_stacklevel += n;
463 if (c->c_stacklevel > c->c_maxstacklevel)
464 c->c_maxstacklevel = c->c_stacklevel;
465}
466
467static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000468com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000469{
470 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000471 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000472 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
473 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000474 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000475 c->c_stacklevel = 0;
476 }
477 else
478 c->c_stacklevel -= n;
479}
480
481static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000482com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000483{
484 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000485 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000486 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000487 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000488}
489
490static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000491com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000492{
493 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000494 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000495 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000496 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000497 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000498 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000499 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000500 com_error(c, PyExc_SystemError,
501 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000502 }
503 if (c->c_code == NULL)
504 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000505 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000506 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000507 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000508 c->c_errors++;
509 return;
510 }
511 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000512 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000513}
514
515static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000516com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000517{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000518 com_addbyte(c, x & 0xff);
519 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000520}
521
522static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000523com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000524{
525 int size;
526 char *p;
527 if (c->c_lnotab == NULL)
528 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000529 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000530 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000531 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000532 c->c_errors++;
533 return;
534 }
535 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000536 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000537 *p++ = addr;
538 *p++ = line;
539 c->c_lnotab_next += 2;
540}
541
542static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000543com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000544{
545 c->c_lineno = lineno;
546 if (c->c_firstlineno == 0) {
547 c->c_firstlineno = c->c_last_line = lineno;
548 }
549 else {
550 int incr_addr = c->c_nexti - c->c_last_addr;
551 int incr_line = lineno - c->c_last_line;
552 while (incr_addr > 0 || incr_line > 0) {
553 int trunc_addr = incr_addr;
554 int trunc_line = incr_line;
555 if (trunc_addr > 255)
556 trunc_addr = 255;
557 if (trunc_line > 255)
558 trunc_line = 255;
559 com_add_lnotab(c, trunc_addr, trunc_line);
560 incr_addr -= trunc_addr;
561 incr_line -= trunc_line;
562 }
563 c->c_last_addr = c->c_nexti;
564 c->c_last_line = lineno;
565 }
566}
567
568static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000569com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000570{
Fred Drakeef8ace32000-08-24 00:32:09 +0000571 int extended_arg = arg >> 16;
Guido van Rossum8e793d91997-03-03 19:13:14 +0000572 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000573 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000574 if (Py_OptimizeFlag)
575 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000576 }
Fred Drakeef8ace32000-08-24 00:32:09 +0000577 if (extended_arg){
578 com_addbyte(c, EXTENDED_ARG);
579 com_addint(c, extended_arg);
580 arg &= 0xffff;
581 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000582 com_addbyte(c, op);
583 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000584}
585
586static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000587com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000588{
589 /* Compile a forward reference for backpatching */
590 int here;
591 int anchor;
592 com_addbyte(c, op);
593 here = c->c_nexti;
594 anchor = *p_anchor;
595 *p_anchor = here;
596 com_addint(c, anchor == 0 ? 0 : here - anchor);
597}
598
599static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000600com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000601{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000602 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000603 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000604 int dist;
605 int prev;
606 for (;;) {
607 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000608 prev = code[anchor] + (code[anchor+1] << 8);
609 dist = target - (anchor+2);
610 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000611 dist >>= 8;
612 code[anchor+1] = dist;
613 dist >>= 8;
614 if (dist) {
615 com_error(c, PyExc_SystemError,
616 "com_backpatch: offset too large");
617 break;
618 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000619 if (!prev)
620 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000621 anchor -= prev;
622 }
623}
624
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000625/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000626
627static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000628com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000629{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000630 PyObject *w, *t, *np=NULL;
631 long n;
632
633 t = Py_BuildValue("(OO)", v, v->ob_type);
634 if (t == NULL)
635 goto fail;
636 w = PyDict_GetItem(dict, t);
637 if (w != NULL) {
638 n = PyInt_AsLong(w);
639 } else {
640 n = PyList_Size(list);
641 np = PyInt_FromLong(n);
642 if (np == NULL)
643 goto fail;
644 if (PyList_Append(list, v) != 0)
645 goto fail;
646 if (PyDict_SetItem(dict, t, np) != 0)
647 goto fail;
648 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000649 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000650 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000651 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000652 fail:
653 Py_XDECREF(np);
654 Py_XDECREF(t);
655 c->c_errors++;
656 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000657}
658
659static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000660com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000661{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000662 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000663}
664
665static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000666com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000667{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000668 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000669}
670
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000671#ifdef PRIVATE_NAME_MANGLING
672static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000673com_mangle(struct compiling *c, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000674{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000675 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000676 This is independent from how the name is used. */
677 char *p;
Guido van Rossum582acec2000-06-28 22:07:35 +0000678 size_t nlen, plen;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000679 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000680 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000681 return 0; /* Don't mangle __extremely_long_names */
682 if (name[nlen-1] == '_' && name[nlen-2] == '_')
683 return 0; /* Don't mangle __whatever__ */
684 p = c->c_private;
685 /* Strip leading underscores from class name */
686 while (*p == '_')
687 p++;
688 if (*p == '\0')
689 return 0; /* Don't mangle if class is just underscores */
690 plen = strlen(p);
691 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000692 plen = maxlen-nlen-2; /* Truncate class name if too long */
693 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000694 buffer[0] = '_';
695 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000696 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000697 /* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
698 return 1;
699}
700#endif
701
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000702static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000703com_addopnamestr(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000704{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000705 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000706 int i;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000707#ifdef PRIVATE_NAME_MANGLING
708 char buffer[256];
709 if (name != NULL && name[0] == '_' && name[1] == '_' &&
710 c->c_private != NULL &&
Guido van Rossum582acec2000-06-28 22:07:35 +0000711 com_mangle(c, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000712 name = buffer;
713#endif
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000714 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000715 c->c_errors++;
716 i = 255;
717 }
718 else {
719 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000720 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000721 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000722 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
723 switch (op) {
724 case LOAD_NAME:
725 case STORE_NAME:
726 case DELETE_NAME:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000727 if (PyDict_GetItemString(c->c_globals, name) != NULL) {
Guido van Rossumc5e96291991-12-10 13:53:51 +0000728 switch (op) {
729 case LOAD_NAME: op = LOAD_GLOBAL; break;
730 case STORE_NAME: op = STORE_GLOBAL; break;
731 case DELETE_NAME: op = DELETE_GLOBAL; break;
732 }
733 }
734 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000735 com_addoparg(c, op, i);
736}
737
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000738static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000739com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000740{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000741 char *name;
742 char buffer[1000];
743 /* XXX it is possible to write this code without the 1000
744 chars on the total length of dotted names, I just can't be
745 bothered right now */
746 if (TYPE(n) == STAR)
747 name = "*";
748 else if (TYPE(n) == dotted_name) {
749 char *p = buffer;
750 int i;
751 name = buffer;
752 for (i = 0; i < NCH(n); i += 2) {
753 char *s = STR(CHILD(n, i));
754 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000755 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000756 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +0000757 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000758 break;
759 }
760 if (p != buffer)
761 *p++ = '.';
762 strcpy(p, s);
763 p = strchr(p, '\0');
764 }
765 }
766 else {
767 REQ(n, NAME);
768 name = STR(n);
769 }
770 com_addopnamestr(c, op, name);
771}
772
Guido van Rossum79f25d91997-04-29 20:08:16 +0000773static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000774parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000775{
Tim Petersdbd9ba62000-07-09 03:09:57 +0000776 extern double atof(const char *);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000777 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000778 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000779 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +0000780#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +0000781 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +0000782 int imflag;
783#endif
784
Guido van Rossum282914b1991-04-04 10:42:56 +0000785 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000786 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +0000787#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +0000788 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +0000789#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000790 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000791 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000792 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000793 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000794 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000795 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000796 if (*end == '\0') {
797 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000798 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000799 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000800 return NULL;
801 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000802 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000803 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000804 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +0000805#ifndef WITHOUT_COMPLEX
806 if (imflag) {
807 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000808 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +0000809 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000810 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000811 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +0000812 }
Guido van Rossumac1fc951997-10-08 15:23:55 +0000813 else
Guido van Rossum50564e81996-01-12 01:13:16 +0000814#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +0000815 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000816 PyFPE_START_PROTECT("atof", return 0)
817 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000818 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000819 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000820 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000821}
822
Guido van Rossum79f25d91997-04-29 20:08:16 +0000823static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000824parsestr(char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000825{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000826 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +0000827 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000828 char *buf;
829 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000830 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000831 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +0000832 int first = *s;
833 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000834 int rawmode = 0;
835 int unicode = 0;
836 if (isalpha(quote) || quote == '_') {
837 if (quote == 'u' || quote == 'U') {
838 quote = *++s;
839 unicode = 1;
840 }
841 if (quote == 'r' || quote == 'R') {
842 quote = *++s;
843 rawmode = 1;
844 }
845 }
Guido van Rossum8054fad1993-10-26 15:19:44 +0000846 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000847 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000848 return NULL;
849 }
850 s++;
851 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +0000852 if (len > INT_MAX) {
853 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
854 return NULL;
855 }
Guido van Rossum8054fad1993-10-26 15:19:44 +0000856 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000857 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000858 return NULL;
859 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000860 if (len >= 4 && s[0] == quote && s[1] == quote) {
861 s += 2;
862 len -= 2;
863 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000864 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000865 return NULL;
866 }
867 }
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +0000868 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000869 if (rawmode)
870 return PyUnicode_DecodeRawUnicodeEscape(
871 s, len, NULL);
872 else
873 return PyUnicode_DecodeUnicodeEscape(
874 s, len, NULL);
875 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +0000876 if (rawmode || strchr(s, '\\') == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000877 return PyString_FromStringAndSize(s, len);
878 v = PyString_FromStringAndSize((char *)NULL, len);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +0000879 if (v == NULL)
880 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000881 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000882 end = s + len;
883 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000884 if (*s != '\\') {
885 *p++ = *s++;
886 continue;
887 }
888 s++;
889 switch (*s++) {
890 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000891 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000892 case '\\': *p++ = '\\'; break;
893 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000894 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000895 case 'b': *p++ = '\b'; break;
896 case 'f': *p++ = '\014'; break; /* FF */
897 case 't': *p++ = '\t'; break;
898 case 'n': *p++ = '\n'; break;
899 case 'r': *p++ = '\r'; break;
900 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000901 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
902 case '0': case '1': case '2': case '3':
903 case '4': case '5': case '6': case '7':
904 c = s[-1] - '0';
905 if ('0' <= *s && *s <= '7') {
906 c = (c<<3) + *s++ - '0';
907 if ('0' <= *s && *s <= '7')
908 c = (c<<3) + *s++ - '0';
909 }
910 *p++ = c;
911 break;
912 case 'x':
Fredrik Lundh1fa0b892000-09-02 20:11:27 +0000913 if (isxdigit(Py_CHARMASK(s[0])) && isxdigit(Py_CHARMASK(s[1]))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000914 unsigned int x = 0;
Fredrik Lundh1fa0b892000-09-02 20:11:27 +0000915 c = Py_CHARMASK(*s);
916 s++;
917 if (isdigit(c))
918 x = c - '0';
919 else if (islower(c))
920 x = 10 + c - 'a';
921 else
922 x = 10 + c - 'A';
923 x = x << 4;
924 c = Py_CHARMASK(*s);
925 s++;
926 if (isdigit(c))
927 x += c - '0';
928 else if (islower(c))
929 x += 10 + c - 'a';
930 else
931 x += 10 + c - 'A';
Guido van Rossumed1100f1997-10-20 23:24:07 +0000932 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000933 break;
934 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +0000935 PyErr_SetString(PyExc_ValueError, "invalid \\x escape");
936 Py_DECREF(v);
937 return NULL;
938 default:
939 *p++ = '\\';
940 *p++ = s[-1];
941 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000942 }
943 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000944 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000945 return v;
946}
947
Guido van Rossum79f25d91997-04-29 20:08:16 +0000948static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000949parsestrplus(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000950{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000951 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000952 int i;
953 REQ(CHILD(n, 0), STRING);
954 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
955 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +0000956 for (i = 1; i < NCH(n); i++) {
957 PyObject *s;
958 s = parsestr(STR(CHILD(n, i)));
959 if (s == NULL)
960 goto onError;
961 if (PyString_Check(v) && PyString_Check(s)) {
962 PyString_ConcatAndDel(&v, s);
963 if (v == NULL)
964 goto onError;
965 }
966 else {
967 PyObject *temp;
968 temp = PyUnicode_Concat(v, s);
969 Py_DECREF(s);
970 if (temp == NULL)
971 goto onError;
972 Py_DECREF(v);
973 v = temp;
974 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000975 }
976 }
977 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +0000978
979 onError:
980 Py_XDECREF(v);
981 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000982}
983
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000984static void
Skip Montanaro803d6e52000-08-12 18:09:51 +0000985com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000986{
Skip Montanaro803d6e52000-08-12 18:09:51 +0000987 PyObject *v;
988 int anchor = 0;
989 int save_begin = c->c_begin;
990
991 /* list_iter: for v in expr [list_iter] */
992 com_node(c, CHILD(n, 3)); /* expr */
993 v = PyInt_FromLong(0L);
994 if (v == NULL)
995 c->c_errors++;
996 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
997 com_push(c, 1);
998 Py_XDECREF(v);
999 c->c_begin = c->c_nexti;
1000 com_addoparg(c, SET_LINENO, n->n_lineno);
1001 com_addfwref(c, FOR_LOOP, &anchor);
1002 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001003 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001004 c->c_loops++;
1005 com_list_iter(c, n, e, t);
1006 c->c_loops--;
1007 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1008 c->c_begin = save_begin;
1009 com_backpatch(c, anchor);
1010 com_pop(c, 2); /* FOR_LOOP has popped these */
1011}
1012
1013static void
1014com_list_if(struct compiling *c, node *n, node *e, char *t)
1015{
1016 int anchor = 0;
1017 int a = 0;
1018 /* list_iter: 'if' test [list_iter] */
1019 com_addoparg(c, SET_LINENO, n->n_lineno);
1020 com_node(c, CHILD(n, 1));
1021 com_addfwref(c, JUMP_IF_FALSE, &a);
1022 com_addbyte(c, POP_TOP);
1023 com_pop(c, 1);
1024 com_list_iter(c, n, e, t);
1025 com_addfwref(c, JUMP_FORWARD, &anchor);
1026 com_backpatch(c, a);
1027 /* We jump here with an extra entry which we now pop */
1028 com_addbyte(c, POP_TOP);
1029 com_backpatch(c, anchor);
1030}
1031
1032static void
1033com_list_iter(struct compiling *c,
1034 node *p, /* parent of list_iter node */
1035 node *e, /* element expression node */
1036 char *t /* name of result list temp local */)
1037{
1038 /* list_iter is the last child in a listmaker, list_for, or list_if */
1039 node *n = CHILD(p, NCH(p)-1);
1040 if (TYPE(n) == list_iter) {
1041 n = CHILD(n, 0);
1042 switch (TYPE(n)) {
1043 case list_for:
1044 com_list_for(c, n, e, t);
1045 break;
1046 case list_if:
1047 com_list_if(c, n, e, t);
1048 break;
1049 default:
1050 com_error(c, PyExc_SystemError,
1051 "invalid list_iter node type");
1052 }
1053 }
1054 else {
1055 com_addopnamestr(c, LOAD_NAME, t);
1056 com_push(c, 1);
1057 com_node(c, e);
1058 com_addoparg(c, CALL_FUNCTION, 1);
1059 com_addbyte(c, POP_TOP);
1060 com_pop(c, 2);
1061 }
1062}
1063
1064static void
1065com_list_comprehension(struct compiling *c, node *n)
1066{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001067 /* listmaker: test list_for */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001068 char tmpname[12];
1069 sprintf(tmpname, "__%d__", ++c->c_tmpname);
1070 com_addoparg(c, BUILD_LIST, 0);
1071 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1072 com_push(c, 2);
1073 com_addopnamestr(c, LOAD_ATTR, "append");
1074 com_addopnamestr(c, STORE_NAME, tmpname);
1075 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001076 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001077 com_addopnamestr(c, DELETE_NAME, tmpname);
1078 --c->c_tmpname;
1079}
1080
1081static void
1082com_listmaker(struct compiling *c, node *n)
1083{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001084 /* listmaker: test ( list_for | (',' test)* [','] ) */
1085 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001086 com_list_comprehension(c, n);
1087 else {
1088 int len = 0;
1089 int i;
1090 for (i = 0; i < NCH(n); i += 2, len++)
1091 com_node(c, CHILD(n, i));
1092 com_addoparg(c, BUILD_LIST, len);
1093 com_pop(c, len-1);
1094 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001095}
1096
1097static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001098com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001099{
1100 int i;
1101 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1102 for (i = 0; i+2 < NCH(n); i += 4) {
1103 /* We must arrange things just right for STORE_SUBSCR.
1104 It wants the stack to look like (value) (dict) (key) */
1105 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001106 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001107 com_node(c, CHILD(n, i+2)); /* value */
1108 com_addbyte(c, ROT_TWO);
1109 com_node(c, CHILD(n, i)); /* key */
1110 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001111 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001112 }
1113}
1114
1115static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001116com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001117{
1118 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001119 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001120 int i;
1121 REQ(n, atom);
1122 ch = CHILD(n, 0);
1123 switch (TYPE(ch)) {
1124 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001125 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001126 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001127 com_push(c, 1);
1128 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001129 else
1130 com_node(c, CHILD(n, 1));
1131 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001132 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001133 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001134 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001135 com_push(c, 1);
1136 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001137 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001138 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001139 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001140 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001141 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001142 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001143 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001144 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001145 break;
1146 case BACKQUOTE:
1147 com_node(c, CHILD(n, 1));
1148 com_addbyte(c, UNARY_CONVERT);
1149 break;
1150 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001151 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001152 i = 255;
1153 }
1154 else {
1155 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001156 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001157 }
1158 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001159 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001160 break;
1161 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001162 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001163 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001164 c->c_errors++;
1165 i = 255;
1166 }
1167 else {
1168 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001169 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001170 }
1171 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001172 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001173 break;
1174 case NAME:
1175 com_addopname(c, LOAD_NAME, ch);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001176 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001177 break;
1178 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001179 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001180 com_error(c, PyExc_SystemError,
1181 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001182 }
1183}
1184
1185static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001186com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001187{
1188 if (NCH(n) == 1) {
1189 com_addbyte(c, op);
1190 }
1191 else if (NCH(n) == 2) {
1192 if (TYPE(CHILD(n, 0)) != COLON) {
1193 com_node(c, CHILD(n, 0));
1194 com_addbyte(c, op+1);
1195 }
1196 else {
1197 com_node(c, CHILD(n, 1));
1198 com_addbyte(c, op+2);
1199 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001200 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001201 }
1202 else {
1203 com_node(c, CHILD(n, 0));
1204 com_node(c, CHILD(n, 2));
1205 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001206 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001207 }
1208}
1209
Guido van Rossum635abd21997-01-06 22:56:52 +00001210static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001211com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1212{
1213 if (NCH(n) == 1) {
1214 com_addbyte(c, DUP_TOP);
1215 com_push(c, 1);
1216 com_addbyte(c, SLICE);
1217 com_node(c, augn);
1218 com_addbyte(c, opcode);
1219 com_pop(c, 1);
1220 com_addbyte(c, ROT_TWO);
1221 com_addbyte(c, STORE_SLICE);
1222 com_pop(c, 2);
1223 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1224 com_node(c, CHILD(n, 0));
1225 com_addoparg(c, DUP_TOPX, 2);
1226 com_push(c, 2);
1227 com_addbyte(c, SLICE+1);
1228 com_pop(c, 1);
1229 com_node(c, augn);
1230 com_addbyte(c, opcode);
1231 com_pop(c, 1);
1232 com_addbyte(c, ROT_THREE);
1233 com_addbyte(c, STORE_SLICE+1);
1234 com_pop(c, 3);
1235 } else if (NCH(n) == 2) {
1236 com_node(c, CHILD(n, 1));
1237 com_addoparg(c, DUP_TOPX, 2);
1238 com_push(c, 2);
1239 com_addbyte(c, SLICE+2);
1240 com_pop(c, 1);
1241 com_node(c, augn);
1242 com_addbyte(c, opcode);
1243 com_pop(c, 1);
1244 com_addbyte(c, ROT_THREE);
1245 com_addbyte(c, STORE_SLICE+2);
1246 com_pop(c, 3);
1247 } else {
1248 com_node(c, CHILD(n, 0));
1249 com_node(c, CHILD(n, 2));
1250 com_addoparg(c, DUP_TOPX, 3);
1251 com_push(c, 3);
1252 com_addbyte(c, SLICE+3);
1253 com_pop(c, 2);
1254 com_node(c, augn);
1255 com_addbyte(c, opcode);
1256 com_pop(c, 1);
1257 com_addbyte(c, ROT_FOUR);
1258 com_addbyte(c, STORE_SLICE+3);
1259 com_pop(c, 4);
1260 }
1261}
1262
1263static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001264com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001265{
1266 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001267 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001268 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001269 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001270 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001271 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001272 }
1273 else {
1274 com_node(c, CHILD(n, 0));
1275 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001276 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001277 }
1278 m = n;
1279 do {
1280 m = CHILD(m, 0);
1281 } while (NCH(m) == 1);
1282 if (TYPE(m) != NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001283 com_error(c, PyExc_SyntaxError,
1284 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001285 }
1286 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001287 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001288 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001289 *pkeywords = PyDict_New();
Guido van Rossum635abd21997-01-06 22:56:52 +00001290 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001291 c->c_errors++;
1292 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001293 if (PyDict_GetItem(*pkeywords, v) != NULL)
1294 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001295 "duplicate keyword argument");
1296 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001297 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001298 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001299 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001300 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001301 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001302 }
1303 }
1304 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001305}
1306
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001307static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001308com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001309{
1310 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001311 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001312 }
1313 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001314 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001315 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001316 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001317 int star_flag = 0;
1318 int starstar_flag = 0;
1319 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001320 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001321 na = 0;
1322 nk = 0;
1323 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001324 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001325 if (TYPE(ch) == STAR ||
1326 TYPE(ch) == DOUBLESTAR)
1327 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001328 if (ch->n_lineno != lineno) {
1329 lineno = ch->n_lineno;
1330 com_addoparg(c, SET_LINENO, lineno);
1331 }
1332 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001333 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001334 na++;
1335 else
1336 nk++;
1337 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001338 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001339 while (i < NCH(n)) {
1340 node *tok = CHILD(n, i);
1341 node *ch = CHILD(n, i+1);
1342 i += 3;
1343 switch (TYPE(tok)) {
1344 case STAR: star_flag = 1; break;
1345 case DOUBLESTAR: starstar_flag = 1; break;
1346 }
1347 com_node(c, ch);
1348 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001349 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001350 com_error(c, PyExc_SyntaxError,
1351 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001352 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001353 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001354 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001355 star_flag + (starstar_flag << 1);
1356 else
1357 opcode = CALL_FUNCTION;
1358 com_addoparg(c, opcode, na | (nk << 8));
1359 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001360 }
1361}
1362
1363static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001364com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001365{
1366 com_addopname(c, LOAD_ATTR, n);
1367}
1368
1369static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001370com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001371{
1372 int i=0;
1373 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001374 node *ch;
1375
1376 /* first argument */
1377 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001378 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001379 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001380 i++;
1381 }
1382 else {
1383 com_node(c, CHILD(n,i));
1384 i++;
1385 REQ(CHILD(n,i),COLON);
1386 i++;
1387 }
1388 /* second argument */
1389 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1390 com_node(c, CHILD(n,i));
1391 i++;
1392 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001393 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001394 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001395 com_push(c, 1);
1396 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001397 /* remaining arguments */
1398 for (; i < NCH(n); i++) {
1399 ns++;
1400 ch=CHILD(n,i);
1401 REQ(ch, sliceop);
1402 if (NCH(ch) == 1) {
1403 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001404 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001405 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001406 }
1407 else
1408 com_node(c, CHILD(ch,1));
1409 }
1410 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001411 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001412}
1413
1414static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001415com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001416{
1417 node *ch;
1418 REQ(n, subscript);
1419 ch = CHILD(n,0);
1420 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001421 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001422 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001423 com_push(c, 1);
1424 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001425 else {
1426 /* check for slice */
1427 if ((TYPE(ch) == COLON || NCH(n) > 1))
1428 com_sliceobj(c, n);
1429 else {
1430 REQ(ch, test);
1431 com_node(c, ch);
1432 }
1433 }
1434}
1435
1436static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001437com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001438{
1439 int i, op;
1440 REQ(n, subscriptlist);
1441 /* Check to make backward compatible slice behavior for '[i:j]' */
1442 if (NCH(n) == 1) {
1443 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001444 /* 'Basic' slice, should have exactly one colon. */
1445 if ((TYPE(CHILD(sub, 0)) == COLON
1446 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1447 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1448 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001449 switch (assigning) {
1450 case OP_DELETE:
1451 op = DELETE_SLICE;
1452 break;
1453 case OP_ASSIGN:
1454 op = STORE_SLICE;
1455 break;
1456 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001457 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001458 break;
1459 default:
1460 com_augassign_slice(c, sub, assigning, augn);
1461 return;
1462 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001463 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001464 if (op == STORE_SLICE)
1465 com_pop(c, 2);
1466 else if (op == DELETE_SLICE)
1467 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001468 return;
1469 }
1470 }
1471 /* Else normal subscriptlist. Compile each subscript. */
1472 for (i = 0; i < NCH(n); i += 2)
1473 com_subscript(c, CHILD(n, i));
1474 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001475 if (NCH(n) > 1) {
1476 i = (NCH(n)+1) / 2;
1477 com_addoparg(c, BUILD_TUPLE, i);
1478 com_pop(c, i-1);
1479 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001480 switch (assigning) {
1481 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001482 op = DELETE_SUBSCR;
1483 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001484 break;
1485 default:
1486 case OP_ASSIGN:
1487 op = STORE_SUBSCR;
1488 i = 3;
1489 break;
1490 case OP_APPLY:
1491 op = BINARY_SUBSCR;
1492 i = 1;
1493 break;
1494 }
1495 if (assigning > OP_APPLY) {
1496 com_addoparg(c, DUP_TOPX, 2);
1497 com_push(c, 2);
1498 com_addbyte(c, BINARY_SUBSCR);
1499 com_pop(c, 1);
1500 com_node(c, augn);
1501 com_addbyte(c, assigning);
1502 com_pop(c, 1);
1503 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001504 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001505 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001506 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001507}
1508
1509static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001510com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001511{
1512 REQ(n, trailer);
1513 switch (TYPE(CHILD(n, 0))) {
1514 case LPAR:
1515 com_call_function(c, CHILD(n, 1));
1516 break;
1517 case DOT:
1518 com_select_member(c, CHILD(n, 1));
1519 break;
1520 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00001521 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001522 break;
1523 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001524 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001525 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001526 }
1527}
1528
1529static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001530com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001531{
1532 int i;
1533 REQ(n, power);
1534 com_atom(c, CHILD(n, 0));
1535 for (i = 1; i < NCH(n); i++) {
1536 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1537 com_factor(c, CHILD(n, i+1));
1538 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001539 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001540 break;
1541 }
1542 else
1543 com_apply_trailer(c, CHILD(n, i));
1544 }
1545}
1546
1547static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001548com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001549{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001550 REQ(n, factor);
1551 if (TYPE(CHILD(n, 0)) == PLUS) {
1552 com_factor(c, CHILD(n, 1));
1553 com_addbyte(c, UNARY_POSITIVE);
1554 }
1555 else if (TYPE(CHILD(n, 0)) == MINUS) {
1556 com_factor(c, CHILD(n, 1));
1557 com_addbyte(c, UNARY_NEGATIVE);
1558 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001559 else if (TYPE(CHILD(n, 0)) == TILDE) {
1560 com_factor(c, CHILD(n, 1));
1561 com_addbyte(c, UNARY_INVERT);
1562 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001563 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001564 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001565 }
1566}
1567
1568static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001569com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001570{
1571 int i;
1572 int op;
1573 REQ(n, term);
1574 com_factor(c, CHILD(n, 0));
1575 for (i = 2; i < NCH(n); i += 2) {
1576 com_factor(c, CHILD(n, i));
1577 switch (TYPE(CHILD(n, i-1))) {
1578 case STAR:
1579 op = BINARY_MULTIPLY;
1580 break;
1581 case SLASH:
1582 op = BINARY_DIVIDE;
1583 break;
1584 case PERCENT:
1585 op = BINARY_MODULO;
1586 break;
1587 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001588 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001589 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001590 op = 255;
1591 }
1592 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001593 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001594 }
1595}
1596
1597static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001598com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001599{
1600 int i;
1601 int op;
1602 REQ(n, arith_expr);
1603 com_term(c, CHILD(n, 0));
1604 for (i = 2; i < NCH(n); i += 2) {
1605 com_term(c, CHILD(n, i));
1606 switch (TYPE(CHILD(n, i-1))) {
1607 case PLUS:
1608 op = BINARY_ADD;
1609 break;
1610 case MINUS:
1611 op = BINARY_SUBTRACT;
1612 break;
1613 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001614 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001615 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001616 op = 255;
1617 }
1618 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001619 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001620 }
1621}
1622
1623static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001624com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001625{
1626 int i;
1627 int op;
1628 REQ(n, shift_expr);
1629 com_arith_expr(c, CHILD(n, 0));
1630 for (i = 2; i < NCH(n); i += 2) {
1631 com_arith_expr(c, CHILD(n, i));
1632 switch (TYPE(CHILD(n, i-1))) {
1633 case LEFTSHIFT:
1634 op = BINARY_LSHIFT;
1635 break;
1636 case RIGHTSHIFT:
1637 op = BINARY_RSHIFT;
1638 break;
1639 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001640 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001641 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001642 op = 255;
1643 }
1644 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001645 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001646 }
1647}
1648
1649static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001650com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001651{
1652 int i;
1653 int op;
1654 REQ(n, and_expr);
1655 com_shift_expr(c, CHILD(n, 0));
1656 for (i = 2; i < NCH(n); i += 2) {
1657 com_shift_expr(c, CHILD(n, i));
1658 if (TYPE(CHILD(n, i-1)) == AMPER) {
1659 op = BINARY_AND;
1660 }
1661 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001662 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001663 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001664 op = 255;
1665 }
1666 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001667 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001668 }
1669}
1670
1671static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001672com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001673{
1674 int i;
1675 int op;
1676 REQ(n, xor_expr);
1677 com_and_expr(c, CHILD(n, 0));
1678 for (i = 2; i < NCH(n); i += 2) {
1679 com_and_expr(c, CHILD(n, i));
1680 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1681 op = BINARY_XOR;
1682 }
1683 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001684 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001685 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001686 op = 255;
1687 }
1688 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001689 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001690 }
1691}
1692
1693static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001694com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001695{
1696 int i;
1697 int op;
1698 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001699 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001700 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001701 com_xor_expr(c, CHILD(n, i));
1702 if (TYPE(CHILD(n, i-1)) == VBAR) {
1703 op = BINARY_OR;
1704 }
1705 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001706 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001707 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001708 op = 255;
1709 }
1710 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001711 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001712 }
1713}
1714
1715static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001716cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001717{
1718 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001719 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001720 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1721 if (NCH(n) == 1) {
1722 n = CHILD(n, 0);
1723 switch (TYPE(n)) {
1724 case LESS: return LT;
1725 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001726 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001727 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001728 case LESSEQUAL: return LE;
1729 case GREATEREQUAL: return GE;
1730 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001731 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1732 if (strcmp(STR(n), "is") == 0) return IS;
1733 }
1734 }
1735 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001736 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001737 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1738 return NOT_IN;
1739 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1740 return IS_NOT;
1741 }
1742 }
1743 return BAD;
1744}
1745
1746static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001747com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001748{
1749 int i;
1750 enum cmp_op op;
1751 int anchor;
1752 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1753 com_expr(c, CHILD(n, 0));
1754 if (NCH(n) == 1)
1755 return;
1756
1757 /****************************************************************
1758 The following code is generated for all but the last
1759 comparison in a chain:
1760
1761 label: on stack: opcode: jump to:
1762
1763 a <code to load b>
1764 a, b DUP_TOP
1765 a, b, b ROT_THREE
1766 b, a, b COMPARE_OP
1767 b, 0-or-1 JUMP_IF_FALSE L1
1768 b, 1 POP_TOP
1769 b
1770
1771 We are now ready to repeat this sequence for the next
1772 comparison in the chain.
1773
1774 For the last we generate:
1775
1776 b <code to load c>
1777 b, c COMPARE_OP
1778 0-or-1
1779
1780 If there were any jumps to L1 (i.e., there was more than one
1781 comparison), we generate:
1782
1783 0-or-1 JUMP_FORWARD L2
1784 L1: b, 0 ROT_TWO
1785 0, b POP_TOP
1786 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00001787 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001788 ****************************************************************/
1789
1790 anchor = 0;
1791
1792 for (i = 2; i < NCH(n); i += 2) {
1793 com_expr(c, CHILD(n, i));
1794 if (i+2 < NCH(n)) {
1795 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001796 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001797 com_addbyte(c, ROT_THREE);
1798 }
1799 op = cmp_type(CHILD(n, i-1));
1800 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001801 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001802 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001803 }
1804 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001805 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001806 if (i+2 < NCH(n)) {
1807 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1808 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001809 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001810 }
1811 }
1812
1813 if (anchor) {
1814 int anchor2 = 0;
1815 com_addfwref(c, JUMP_FORWARD, &anchor2);
1816 com_backpatch(c, anchor);
1817 com_addbyte(c, ROT_TWO);
1818 com_addbyte(c, POP_TOP);
1819 com_backpatch(c, anchor2);
1820 }
1821}
1822
1823static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001824com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001825{
1826 REQ(n, not_test); /* 'not' not_test | comparison */
1827 if (NCH(n) == 1) {
1828 com_comparison(c, CHILD(n, 0));
1829 }
1830 else {
1831 com_not_test(c, CHILD(n, 1));
1832 com_addbyte(c, UNARY_NOT);
1833 }
1834}
1835
1836static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001837com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001838{
1839 int i;
1840 int anchor;
1841 REQ(n, and_test); /* not_test ('and' not_test)* */
1842 anchor = 0;
1843 i = 0;
1844 for (;;) {
1845 com_not_test(c, CHILD(n, i));
1846 if ((i += 2) >= NCH(n))
1847 break;
1848 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1849 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001850 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001851 }
1852 if (anchor)
1853 com_backpatch(c, anchor);
1854}
1855
1856static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001857com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001858{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001859 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00001860 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001861 PyObject *v;
Guido van Rossum57531fe1993-11-30 14:57:42 +00001862 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001863 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001864 v = (PyObject *) icompile(CHILD(n, 0), c);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001865 if (v == NULL) {
1866 c->c_errors++;
1867 i = 255;
1868 }
1869 else {
1870 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001871 Py_DECREF(v);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001872 }
1873 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001874 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001875 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001876 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001877 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001878 else {
1879 int anchor = 0;
1880 int i = 0;
1881 for (;;) {
1882 com_and_test(c, CHILD(n, i));
1883 if ((i += 2) >= NCH(n))
1884 break;
1885 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1886 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001887 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001888 }
1889 if (anchor)
1890 com_backpatch(c, anchor);
1891 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001892}
1893
1894static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001895com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001896{
1897 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001898 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001899 com_node(c, CHILD(n, 0));
1900 }
1901 else {
1902 int i;
1903 int len;
1904 len = (NCH(n) + 1) / 2;
1905 for (i = 0; i < NCH(n); i += 2)
1906 com_node(c, CHILD(n, i));
1907 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001908 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001909 }
1910}
1911
1912
1913/* Begin of assignment compilation */
1914
Thomas Wouters434d0822000-08-24 20:11:32 +00001915
1916static void
1917com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
1918{
1919 com_addbyte(c, DUP_TOP);
1920 com_push(c, 1);
1921 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00001922 com_node(c, augn);
1923 com_addbyte(c, opcode);
1924 com_pop(c, 1);
1925 com_addbyte(c, ROT_TWO);
1926 com_addopname(c, STORE_ATTR, n);
1927 com_pop(c, 2);
1928}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001929
1930static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001931com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001932{
1933 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001934 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001935}
1936
1937static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001938com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001939{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001940 REQ(n, trailer);
1941 switch (TYPE(CHILD(n, 0))) {
1942 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001943 com_error(c, PyExc_SyntaxError,
1944 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001945 break;
1946 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00001947 if (assigning > OP_APPLY)
1948 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
1949 else
1950 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001951 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001952 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00001953 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001954 break;
1955 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001956 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001957 }
1958}
1959
1960static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001961com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001962{
1963 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00001964 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001965 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001966 if (assigning) {
1967 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001968 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001969 com_push(c, i-1);
1970 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001971 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00001972 com_assign(c, CHILD(n, i), assigning, NULL);
1973}
1974
1975static void
1976com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
1977{
1978 REQ(n, NAME);
1979 com_addopname(c, LOAD_NAME, n);
1980 com_push(c, 1);
1981 com_node(c, augn);
1982 com_addbyte(c, opcode);
1983 com_pop(c, 1);
1984 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001985}
1986
1987static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001988com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001989{
1990 REQ(n, NAME);
1991 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001992 if (assigning)
1993 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001994}
1995
1996static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001997com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001998{
1999 /* Loop to avoid trivial recursion */
2000 for (;;) {
2001 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002002
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002003 case exprlist:
2004 case testlist:
2005 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002006 if (assigning > OP_APPLY) {
2007 com_error(c, PyExc_SyntaxError,
2008 "augmented assign to tuple not possible");
2009 return;
2010 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002011 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002012 return;
2013 }
2014 n = CHILD(n, 0);
2015 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002016
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002017 case test:
2018 case and_test:
2019 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002020 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002021 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002022 case xor_expr:
2023 case and_expr:
2024 case shift_expr:
2025 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002026 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002027 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002028 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002029 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002030 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002031 return;
2032 }
2033 n = CHILD(n, 0);
2034 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002035
Guido van Rossum50564e81996-01-12 01:13:16 +00002036 case power: /* atom trailer* ('**' power)* */
2037/* ('+'|'-'|'~') factor | atom trailer* */
2038 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002039 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002040 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002041 return;
2042 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002043 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002044 int i;
2045 com_node(c, CHILD(n, 0));
2046 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002047 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002048 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002049 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002050 return;
2051 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002052 com_apply_trailer(c, CHILD(n, i));
2053 } /* NB i is still alive */
2054 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002055 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002056 return;
2057 }
2058 n = CHILD(n, 0);
2059 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002060
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002061 case atom:
2062 switch (TYPE(CHILD(n, 0))) {
2063 case LPAR:
2064 n = CHILD(n, 1);
2065 if (TYPE(n) == RPAR) {
2066 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002067 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002068 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002069 return;
2070 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002071 if (assigning > OP_APPLY) {
2072 com_error(c, PyExc_SyntaxError,
2073 "augmented assign to tuple not possible");
2074 return;
2075 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002076 break;
2077 case LSQB:
2078 n = CHILD(n, 1);
2079 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002080 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002081 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002082 return;
2083 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002084 if (assigning > OP_APPLY) {
2085 com_error(c, PyExc_SyntaxError,
2086 "augmented assign to list not possible");
2087 return;
2088 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002089 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002090 return;
2091 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002092 if (assigning > OP_APPLY)
2093 com_augassign_name(c, CHILD(n, 0),
2094 assigning, augn);
2095 else
2096 com_assign_name(c, CHILD(n, 0),
2097 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002098 return;
2099 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002100 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002101 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002102 return;
2103 }
2104 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002105
2106 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002107 com_error(c, PyExc_SyntaxError,
2108 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002109 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002110
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002111 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002112 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002113 com_error(c, PyExc_SystemError,
2114 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002115 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002116
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002117 }
2118 }
2119}
Guido van Rossum7c531111997-03-11 18:42:21 +00002120
Thomas Wouters434d0822000-08-24 20:11:32 +00002121static void
2122com_augassign(struct compiling *c, node *n)
2123{
2124 int opcode;
2125
2126 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2127 case '+': opcode = INPLACE_ADD; break;
2128 case '-': opcode = INPLACE_SUBTRACT; break;
2129 case '/': opcode = INPLACE_DIVIDE; break;
2130 case '%': opcode = INPLACE_MODULO; break;
2131 case '<': opcode = INPLACE_LSHIFT; break;
2132 case '>': opcode = INPLACE_RSHIFT; break;
2133 case '&': opcode = INPLACE_AND; break;
2134 case '^': opcode = INPLACE_XOR; break;
2135 case '|': opcode = INPLACE_OR; break;
2136 case '*':
2137 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2138 opcode = INPLACE_POWER;
2139 else
2140 opcode = INPLACE_MULTIPLY;
2141 break;
2142 default:
2143 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2144 return;
2145 }
2146 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2147}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002148
2149static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002150com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002151{
Thomas Wouters434d0822000-08-24 20:11:32 +00002152 REQ(n, expr_stmt);
2153 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002154 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002155 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002156 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002157 if (NCH(n) == 1) {
2158 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002159 if (c->c_interactive)
2160 com_addbyte(c, PRINT_EXPR);
2161 else
2162 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002163 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002164 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002165 else if (TYPE(CHILD(n,1)) == augassign)
2166 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002167 else {
2168 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002169 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002170 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002171 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002172 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002173 com_push(c, 1);
2174 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002175 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002176 }
2177 }
2178}
2179
2180static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002181com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002182{
2183 int a = 0, b = 0;
2184 int i;
2185 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2186 /* Generate code like for
2187
2188 if __debug__:
2189 if not <test>:
2190 raise AssertionError [, <message>]
2191
2192 where <message> is the second test, if present.
2193 */
2194 if (Py_OptimizeFlag)
2195 return;
2196 com_addopnamestr(c, LOAD_GLOBAL, "__debug__");
2197 com_push(c, 1);
2198 com_addfwref(c, JUMP_IF_FALSE, &a);
2199 com_addbyte(c, POP_TOP);
2200 com_pop(c, 1);
2201 com_node(c, CHILD(n, 1));
2202 com_addfwref(c, JUMP_IF_TRUE, &b);
2203 com_addbyte(c, POP_TOP);
2204 com_pop(c, 1);
2205 /* Raise that exception! */
2206 com_addopnamestr(c, LOAD_GLOBAL, "AssertionError");
2207 com_push(c, 1);
2208 i = NCH(n)/2; /* Either 2 or 4 */
2209 if (i > 1)
2210 com_node(c, CHILD(n, 3));
2211 com_addoparg(c, RAISE_VARARGS, i);
2212 com_pop(c, i);
2213 /* The interpreter does not fall through */
2214 /* All jumps converge here */
2215 com_backpatch(c, a);
2216 com_backpatch(c, b);
2217 com_addbyte(c, POP_TOP);
2218}
2219
2220static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002221com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002222{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002223 int i = 1;
2224 node* stream = NULL;
2225
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002226 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002227
2228 /* are we using the extended print form? */
2229 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2230 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002231 com_node(c, stream);
2232 /* stack: [...] => [... stream] */
2233 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002234 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2235 i = 4;
2236 else
2237 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002238 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002239 for (; i < NCH(n); i += 2) {
2240 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002241 com_addbyte(c, DUP_TOP);
2242 /* stack: [stream] => [stream stream] */
2243 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002244 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002245 /* stack: [stream stream] => [stream stream obj] */
2246 com_addbyte(c, ROT_TWO);
2247 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002248 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002249 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002250 com_pop(c, 2);
2251 }
2252 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002253 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002254 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002255 com_addbyte(c, PRINT_ITEM);
2256 com_pop(c, 1);
2257 }
2258 }
2259 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002260 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002261 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002262 /* must pop the extra stream object off the stack */
2263 com_addbyte(c, POP_TOP);
2264 /* stack: [... stream] => [...] */
2265 com_pop(c, 1);
2266 }
2267 }
2268 else {
2269 if (stream != NULL) {
2270 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002271 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002272 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002273 com_pop(c, 1);
2274 }
2275 else
2276 com_addbyte(c, PRINT_NEWLINE);
2277 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002278}
2279
2280static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002281com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002282{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002283 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002284 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002285 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002286 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002287 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002288 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002289 com_push(c, 1);
2290 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002291 else
2292 com_node(c, CHILD(n, 1));
2293 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002294 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002295}
2296
2297static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002298com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002299{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002300 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002301 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2302 if (NCH(n) > 1) {
2303 com_node(c, CHILD(n, 1));
2304 if (NCH(n) > 3) {
2305 com_node(c, CHILD(n, 3));
2306 if (NCH(n) > 5)
2307 com_node(c, CHILD(n, 5));
2308 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002309 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002310 i = NCH(n)/2;
2311 com_addoparg(c, RAISE_VARARGS, i);
2312 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002313}
2314
2315static void
Thomas Wouters52152252000-08-17 22:55:00 +00002316com_from_import(struct compiling *c, node *n)
2317{
2318 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2319 com_push(c, 1);
2320 if (NCH(n) > 1) {
2321 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2322 com_error(c, PyExc_SyntaxError, "invalid syntax");
2323 return;
2324 }
2325 com_addopname(c, STORE_NAME, CHILD(n, 2));
2326 } else
2327 com_addopname(c, STORE_NAME, CHILD(n, 0));
2328 com_pop(c, 1);
2329}
2330
2331static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002332com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002333{
2334 int i;
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002335 PyObject *tup;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002336 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002337 /* 'import' dotted_name (',' dotted_name)* |
2338 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002339 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002340 /* 'from' dotted_name 'import' ... */
2341 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002342
2343 if (TYPE(CHILD(n, 3)) == STAR) {
2344 tup = Py_BuildValue("(s)", "*");
2345 } else {
2346 tup = PyTuple_New((NCH(n) - 2)/2);
2347 for (i = 3; i < NCH(n); i += 2) {
2348 PyTuple_SET_ITEM(tup, (i-3)/2,
2349 PyString_FromString(STR(
2350 CHILD(CHILD(n, i), 0))));
2351 }
2352 }
2353 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002354 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002355 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002356 if (TYPE(CHILD(n, 3)) == STAR)
2357 com_addbyte(c, IMPORT_STAR);
2358 else {
2359 for (i = 3; i < NCH(n); i += 2)
2360 com_from_import(c, CHILD(n, i));
2361 com_addbyte(c, POP_TOP);
2362 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002363 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002364 }
2365 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002366 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002367 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002368 node *subn = CHILD(n, i);
2369 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002370 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002371 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002372 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00002373 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00002374 int j;
2375 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00002376 com_error(c, PyExc_SyntaxError,
2377 "invalid syntax");
2378 return;
2379 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00002380 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
2381 com_addopname(c, LOAD_ATTR,
2382 CHILD(CHILD(subn, 0), j));
Thomas Wouters52152252000-08-17 22:55:00 +00002383 com_addopname(c, STORE_NAME, CHILD(subn, 2));
2384 } else
2385 com_addopname(c, STORE_NAME,
2386 CHILD(CHILD(subn, 0),0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002387 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002388 }
2389 }
2390}
2391
2392static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002393com_global_stmt(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002394{
2395 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002396 REQ(n, global_stmt);
2397 /* 'global' NAME (',' NAME)* */
2398 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002399 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002400#ifdef PRIVATE_NAME_MANGLING
2401 char buffer[256];
2402 if (s != NULL && s[0] == '_' && s[1] == '_' &&
2403 c->c_private != NULL &&
Guido van Rossum582acec2000-06-28 22:07:35 +00002404 com_mangle(c, s, buffer, sizeof(buffer)))
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002405 s = buffer;
2406#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +00002407 if (PyDict_GetItemString(c->c_locals, s) != NULL) {
2408 com_error(c, PyExc_SyntaxError,
2409 "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002410 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002411 else if (PyDict_SetItemString(c->c_globals, s, Py_None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002412 c->c_errors++;
2413 }
2414}
2415
Guido van Rossum681d79a1995-07-18 14:51:37 +00002416static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002417com_newlocal_o(struct compiling *c, PyObject *nameval)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002418{
2419 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002420 PyObject *ival;
2421 if (PyList_Size(c->c_varnames) != c->c_nlocals) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002422 /* This is usually caused by an error on a previous call */
2423 if (c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002424 com_error(c, PyExc_SystemError,
2425 "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002426 }
2427 return 0;
2428 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002429 ival = PyInt_FromLong(i = c->c_nlocals++);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002430 if (ival == NULL)
2431 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002432 else if (PyDict_SetItem(c->c_locals, nameval, ival) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002433 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002434 else if (PyList_Append(c->c_varnames, nameval) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002435 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002436 Py_XDECREF(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002437 return i;
2438}
2439
2440static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002441com_addlocal_o(struct compiling *c, PyObject *nameval)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002442{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002443 PyObject *ival = PyDict_GetItem(c->c_locals, nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002444 if (ival != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002445 return PyInt_AsLong(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002446 return com_newlocal_o(c, nameval);
2447}
2448
2449static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002450com_newlocal(struct compiling *c, char *name)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002451{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002452 PyObject *nameval = PyString_InternFromString(name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002453 int i;
2454 if (nameval == NULL) {
2455 c->c_errors++;
2456 return 0;
2457 }
2458 i = com_newlocal_o(c, nameval);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002459 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002460 return i;
2461}
2462
Guido van Rossumc5e96291991-12-10 13:53:51 +00002463static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002464com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002465{
2466 REQ(n, exec_stmt);
2467 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2468 com_node(c, CHILD(n, 1));
2469 if (NCH(n) >= 4)
2470 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002471 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002472 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002473 com_push(c, 1);
2474 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002475 if (NCH(n) >= 6)
2476 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002477 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002478 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002479 com_push(c, 1);
2480 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002481 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002482 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002483}
2484
Guido van Rossum7c531111997-03-11 18:42:21 +00002485static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002486is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002487{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002488 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002489 int i;
2490
2491 /* Label to avoid tail recursion */
2492 next:
2493 switch (TYPE(n)) {
2494
2495 case suite:
2496 if (NCH(n) == 1) {
2497 n = CHILD(n, 0);
2498 goto next;
2499 }
2500 /* Fall through */
2501 case file_input:
2502 for (i = 0; i < NCH(n); i++) {
2503 node *ch = CHILD(n, i);
2504 if (TYPE(ch) == stmt) {
2505 n = ch;
2506 goto next;
2507 }
2508 }
2509 break;
2510
2511 case stmt:
2512 case simple_stmt:
2513 case small_stmt:
2514 n = CHILD(n, 0);
2515 goto next;
2516
2517 case expr_stmt:
2518 case testlist:
2519 case test:
2520 case and_test:
2521 case not_test:
2522 case comparison:
2523 case expr:
2524 case xor_expr:
2525 case and_expr:
2526 case shift_expr:
2527 case arith_expr:
2528 case term:
2529 case factor:
2530 case power:
2531 case atom:
2532 if (NCH(n) == 1) {
2533 n = CHILD(n, 0);
2534 goto next;
2535 }
2536 break;
2537
2538 case NAME:
2539 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2540 return 1;
2541 break;
2542
2543 case NUMBER:
2544 v = parsenumber(c, STR(n));
2545 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002546 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002547 break;
2548 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002549 i = PyObject_IsTrue(v);
2550 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002551 return i == 0;
2552
2553 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002554 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002555 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002556 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002557 break;
2558 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002559 i = PyObject_IsTrue(v);
2560 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002561 return i == 0;
2562
2563 }
2564 return 0;
2565}
2566
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002567static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002568com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002569{
2570 int i;
2571 int anchor = 0;
2572 REQ(n, if_stmt);
2573 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2574 for (i = 0; i+3 < NCH(n); i+=4) {
2575 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002576 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002577 if (is_constant_false(c, ch))
2578 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002579 if (i > 0)
2580 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002581 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002582 com_addfwref(c, JUMP_IF_FALSE, &a);
2583 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002584 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002585 com_node(c, CHILD(n, i+3));
2586 com_addfwref(c, JUMP_FORWARD, &anchor);
2587 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002588 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002589 com_addbyte(c, POP_TOP);
2590 }
2591 if (i+2 < NCH(n))
2592 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002593 if (anchor)
2594 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002595}
2596
2597static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002598com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002599{
2600 int break_anchor = 0;
2601 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002602 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002603 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2604 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002605 block_push(c, SETUP_LOOP);
2606 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002607 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002608 com_node(c, CHILD(n, 1));
2609 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2610 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002611 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002612 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002613 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002614 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002615 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2616 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002617 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002618 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002619 com_addbyte(c, POP_TOP);
2620 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002621 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002622 if (NCH(n) > 4)
2623 com_node(c, CHILD(n, 6));
2624 com_backpatch(c, break_anchor);
2625}
2626
2627static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002628com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002629{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002630 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002631 int break_anchor = 0;
2632 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002633 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002634 REQ(n, for_stmt);
2635 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2636 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002637 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002638 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002639 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002640 if (v == NULL)
2641 c->c_errors++;
2642 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002643 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002644 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002645 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002646 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002647 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002648 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00002649 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002650 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002651 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002652 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002653 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2654 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002655 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002656 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002657 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002658 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002659 if (NCH(n) > 8)
2660 com_node(c, CHILD(n, 8));
2661 com_backpatch(c, break_anchor);
2662}
2663
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002664/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002665
2666 SETUP_FINALLY L
2667 <code for S>
2668 POP_BLOCK
2669 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002670 L: <code for Sf>
2671 END_FINALLY
2672
2673 The special instructions use the block stack. Each block
2674 stack entry contains the instruction that created it (here
2675 SETUP_FINALLY), the level of the value stack at the time the
2676 block stack entry was created, and a label (here L).
2677
2678 SETUP_FINALLY:
2679 Pushes the current value stack level and the label
2680 onto the block stack.
2681 POP_BLOCK:
2682 Pops en entry from the block stack, and pops the value
2683 stack until its level is the same as indicated on the
2684 block stack. (The label is ignored.)
2685 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002686 Pops a variable number of entries from the *value* stack
2687 and re-raises the exception they specify. The number of
2688 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002689
2690 The block stack is unwound when an exception is raised:
2691 when a SETUP_FINALLY entry is found, the exception is pushed
2692 onto the value stack (and the exception condition is cleared),
2693 and the interpreter jumps to the label gotten from the block
2694 stack.
2695
2696 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002697 (The contents of the value stack is shown in [], with the top
2698 at the right; 'tb' is trace-back info, 'val' the exception's
2699 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002700
2701 Value stack Label Instruction Argument
2702 [] SETUP_EXCEPT L1
2703 [] <code for S>
2704 [] POP_BLOCK
2705 [] JUMP_FORWARD L0
2706
Guido van Rossum3f5da241990-12-20 15:06:42 +00002707 [tb, val, exc] L1: DUP )
2708 [tb, val, exc, exc] <evaluate E1> )
2709 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2710 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2711 [tb, val, exc, 1] POP )
2712 [tb, val, exc] POP
2713 [tb, val] <assign to V1> (or POP if no V1)
2714 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002715 [] <code for S1>
2716 JUMP_FORWARD L0
2717
Guido van Rossum3f5da241990-12-20 15:06:42 +00002718 [tb, val, exc, 0] L2: POP
2719 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002720 .............................etc.......................
2721
Guido van Rossum3f5da241990-12-20 15:06:42 +00002722 [tb, val, exc, 0] Ln+1: POP
2723 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002724
2725 [] L0: <next statement>
2726
2727 Of course, parts are not generated if Vi or Ei is not present.
2728*/
2729
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002730static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002731com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002732{
2733 int except_anchor = 0;
2734 int end_anchor = 0;
2735 int else_anchor = 0;
2736 int i;
2737 node *ch;
2738
2739 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2740 block_push(c, SETUP_EXCEPT);
2741 com_node(c, CHILD(n, 2));
2742 com_addbyte(c, POP_BLOCK);
2743 block_pop(c, SETUP_EXCEPT);
2744 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2745 com_backpatch(c, except_anchor);
2746 for (i = 3;
2747 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2748 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002749 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002750 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002751 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002752 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002753 break;
2754 }
2755 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002756 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002757 com_addoparg(c, SET_LINENO, ch->n_lineno);
2758 if (NCH(ch) > 1) {
2759 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002760 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002761 com_node(c, CHILD(ch, 1));
2762 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002763 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002764 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2765 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002766 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002767 }
2768 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002769 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002770 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00002771 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002772 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002773 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002774 com_pop(c, 1);
2775 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002776 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002777 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002778 com_node(c, CHILD(n, i+2));
2779 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2780 if (except_anchor) {
2781 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002782 /* We come in with [tb, val, exc, 0] on the
2783 stack; one pop and it's the same as
2784 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002785 com_addbyte(c, POP_TOP);
2786 }
2787 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002788 /* We actually come in here with [tb, val, exc] but the
2789 END_FINALLY will zap those and jump around.
2790 The c_stacklevel does not reflect them so we need not pop
2791 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002792 com_addbyte(c, END_FINALLY);
2793 com_backpatch(c, else_anchor);
2794 if (i < NCH(n))
2795 com_node(c, CHILD(n, i+2));
2796 com_backpatch(c, end_anchor);
2797}
2798
2799static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002800com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002801{
2802 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002803 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002804
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002805 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2806 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002807 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002808 com_addbyte(c, POP_BLOCK);
2809 block_pop(c, SETUP_FINALLY);
2810 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002811 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002812 /* While the generated code pushes only one item,
2813 the try-finally handling can enter here with
2814 up to three items. OK, here are the details:
2815 3 for an exception, 2 for RETURN, 1 for BREAK. */
2816 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002817 com_backpatch(c, finally_anchor);
2818 ch = CHILD(n, NCH(n)-1);
2819 com_addoparg(c, SET_LINENO, ch->n_lineno);
2820 com_node(c, ch);
2821 com_addbyte(c, END_FINALLY);
2822 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002823 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002824}
2825
2826static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002827com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002828{
2829 REQ(n, try_stmt);
2830 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2831 | 'try' ':' suite 'finally' ':' suite */
2832 if (TYPE(CHILD(n, 3)) != except_clause)
2833 com_try_finally(c, n);
2834 else
2835 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002836}
2837
Guido van Rossum8b993a91997-01-17 21:04:03 +00002838static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002839get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002840{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002841 int i;
2842
Guido van Rossum8b993a91997-01-17 21:04:03 +00002843 /* Label to avoid tail recursion */
2844 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002845 switch (TYPE(n)) {
2846
2847 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002848 if (NCH(n) == 1) {
2849 n = CHILD(n, 0);
2850 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002851 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002852 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002853 case file_input:
2854 for (i = 0; i < NCH(n); i++) {
2855 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002856 if (TYPE(ch) == stmt) {
2857 n = ch;
2858 goto next;
2859 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002860 }
2861 break;
2862
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002863 case stmt:
2864 case simple_stmt:
2865 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002866 n = CHILD(n, 0);
2867 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002868
2869 case expr_stmt:
2870 case testlist:
2871 case test:
2872 case and_test:
2873 case not_test:
2874 case comparison:
2875 case expr:
2876 case xor_expr:
2877 case and_expr:
2878 case shift_expr:
2879 case arith_expr:
2880 case term:
2881 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002882 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002883 if (NCH(n) == 1) {
2884 n = CHILD(n, 0);
2885 goto next;
2886 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002887 break;
2888
2889 case atom:
2890 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002891 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002892 break;
2893
2894 }
2895 return NULL;
2896}
2897
Guido van Rossum79f25d91997-04-29 20:08:16 +00002898static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002899get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002900{
Guido van Rossum541563e1999-01-28 15:08:09 +00002901 /* Don't generate doc-strings if run with -OO */
2902 if (Py_OptimizeFlag > 1)
2903 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002904 n = get_rawdocstring(n);
2905 if (n == NULL)
2906 return NULL;
2907 return parsestrplus(n);
2908}
2909
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002910static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002911com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002912{
2913 REQ(n, suite);
2914 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2915 if (NCH(n) == 1) {
2916 com_node(c, CHILD(n, 0));
2917 }
2918 else {
2919 int i;
2920 for (i = 0; i < NCH(n); i++) {
2921 node *ch = CHILD(n, i);
2922 if (TYPE(ch) == stmt)
2923 com_node(c, ch);
2924 }
2925 }
2926}
2927
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002928/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002929static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002930com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002931{
2932 int i = c->c_nblocks;
2933 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2934 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2935 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00002936 else if (i <= 0) {
2937 /* at the outer level */
2938 com_error(c, PyExc_SyntaxError,
2939 "'continue' not properly in loop");
2940 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002941 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00002942 int j;
2943 for (j = 0; j <= i; ++j) {
2944 if (c->c_block[j] == SETUP_LOOP)
2945 break;
2946 }
2947 if (j < i+1) {
2948 /* there is a loop, but something interferes */
2949 for (++j; j <= i; ++j) {
2950 if (c->c_block[i] == SETUP_EXCEPT
2951 || c->c_block[i] == SETUP_FINALLY) {
2952 com_error(c, PyExc_SyntaxError,
2953 "'continue' not supported inside 'try' clause");
2954 return;
2955 }
2956 }
2957 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002958 com_error(c, PyExc_SyntaxError,
2959 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002960 }
2961 /* XXX Could allow it inside a 'finally' clause
2962 XXX if we could pop the exception still on the stack */
2963}
2964
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002965static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002966com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002967{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002968 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002969 if (TYPE(n) == lambdef) {
2970 /* lambdef: 'lambda' [varargslist] ':' test */
2971 n = CHILD(n, 1);
2972 }
2973 else {
2974 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2975 n = CHILD(n, 2);
2976 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2977 n = CHILD(n, 1);
2978 }
2979 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002980 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002981 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002982 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002983 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2984 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002985 nargs = 0;
2986 ndefs = 0;
2987 for (i = 0; i < nch; i++) {
2988 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002989 if (TYPE(CHILD(n, i)) == STAR ||
2990 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002991 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002992 nargs++;
2993 i++;
2994 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002995 t = RPAR; /* Anything except EQUAL or COMMA */
2996 else
2997 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002998 if (t == EQUAL) {
2999 i++;
3000 ndefs++;
3001 com_node(c, CHILD(n, i));
3002 i++;
3003 if (i >= nch)
3004 break;
3005 t = TYPE(CHILD(n, i));
3006 }
3007 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003008 /* Treat "(a=1, b)" as an error */
3009 if (ndefs)
3010 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003011 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003012 }
3013 if (t != COMMA)
3014 break;
3015 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003016 return ndefs;
3017}
3018
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003019static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003020com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003021{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003022 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003023 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003024 v = (PyObject *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003025 if (v == NULL)
3026 c->c_errors++;
3027 else {
3028 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003029 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003030 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003031 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003032 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003033 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003034 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003035 com_pop(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003036 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003037 }
3038}
3039
3040static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003041com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003042{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003043 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003044 REQ(n, testlist);
3045 /* testlist: test (',' test)* [','] */
3046 for (i = 0; i < NCH(n); i += 2)
3047 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003048 i = (NCH(n)+1) / 2;
3049 com_addoparg(c, BUILD_TUPLE, i);
3050 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003051}
3052
3053static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003054com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003055{
Guido van Rossum25831651993-05-19 14:50:45 +00003056 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003057 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003058 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003059 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003060 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003061 c->c_errors++;
3062 return;
3063 }
3064 /* Push the class name on the stack */
3065 i = com_addconst(c, v);
3066 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003067 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003068 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003069 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003070 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003071 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003072 com_push(c, 1);
3073 }
Guido van Rossum25831651993-05-19 14:50:45 +00003074 else
3075 com_bases(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00003076 v = (PyObject *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003077 if (v == NULL)
3078 c->c_errors++;
3079 else {
Guido van Rossum25831651993-05-19 14:50:45 +00003080 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003081 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003082 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003083 com_addoparg(c, MAKE_FUNCTION, 0);
3084 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003085 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003086 com_pop(c, 2);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003087 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum79f25d91997-04-29 20:08:16 +00003088 Py_DECREF(v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003089 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003090}
3091
3092static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003093com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003094{
3095 switch (TYPE(n)) {
3096
3097 /* Definition nodes */
3098
3099 case funcdef:
3100 com_funcdef(c, n);
3101 break;
3102 case classdef:
3103 com_classdef(c, n);
3104 break;
3105
3106 /* Trivial parse tree nodes */
3107
3108 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003109 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003110 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003111 com_node(c, CHILD(n, 0));
3112 break;
3113
3114 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003115 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3116 com_addoparg(c, SET_LINENO, n->n_lineno);
3117 {
3118 int i;
3119 for (i = 0; i < NCH(n)-1; i += 2)
3120 com_node(c, CHILD(n, i));
3121 }
3122 break;
3123
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003124 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003125 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003126 com_node(c, CHILD(n, 0));
3127 break;
3128
3129 /* Statement nodes */
3130
3131 case expr_stmt:
3132 com_expr_stmt(c, n);
3133 break;
3134 case print_stmt:
3135 com_print_stmt(c, n);
3136 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003137 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003138 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003139 break;
3140 case pass_stmt:
3141 break;
3142 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003143 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003144 com_error(c, PyExc_SyntaxError,
3145 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003146 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003147 com_addbyte(c, BREAK_LOOP);
3148 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003149 case continue_stmt:
3150 com_continue_stmt(c, n);
3151 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003152 case return_stmt:
3153 com_return_stmt(c, n);
3154 break;
3155 case raise_stmt:
3156 com_raise_stmt(c, n);
3157 break;
3158 case import_stmt:
3159 com_import_stmt(c, n);
3160 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003161 case global_stmt:
3162 com_global_stmt(c, n);
3163 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003164 case exec_stmt:
3165 com_exec_stmt(c, n);
3166 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003167 case assert_stmt:
3168 com_assert_stmt(c, n);
3169 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003170 case if_stmt:
3171 com_if_stmt(c, n);
3172 break;
3173 case while_stmt:
3174 com_while_stmt(c, n);
3175 break;
3176 case for_stmt:
3177 com_for_stmt(c, n);
3178 break;
3179 case try_stmt:
3180 com_try_stmt(c, n);
3181 break;
3182 case suite:
3183 com_suite(c, n);
3184 break;
3185
3186 /* Expression nodes */
3187
3188 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003189 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003190 break;
3191 case test:
3192 com_test(c, n);
3193 break;
3194 case and_test:
3195 com_and_test(c, n);
3196 break;
3197 case not_test:
3198 com_not_test(c, n);
3199 break;
3200 case comparison:
3201 com_comparison(c, n);
3202 break;
3203 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003204 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003205 break;
3206 case expr:
3207 com_expr(c, n);
3208 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003209 case xor_expr:
3210 com_xor_expr(c, n);
3211 break;
3212 case and_expr:
3213 com_and_expr(c, n);
3214 break;
3215 case shift_expr:
3216 com_shift_expr(c, n);
3217 break;
3218 case arith_expr:
3219 com_arith_expr(c, n);
3220 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003221 case term:
3222 com_term(c, n);
3223 break;
3224 case factor:
3225 com_factor(c, n);
3226 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003227 case power:
3228 com_power(c, n);
3229 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003230 case atom:
3231 com_atom(c, n);
3232 break;
3233
3234 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003235 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003236 com_error(c, PyExc_SystemError,
3237 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003238 }
3239}
3240
Tim Petersdbd9ba62000-07-09 03:09:57 +00003241static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003242
3243static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003244com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003245{
3246 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3247 if (TYPE(CHILD(n, 0)) == LPAR)
3248 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003249 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003250 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003251 com_pop(c, 1);
3252 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003253}
3254
3255static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003256com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003257{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003258 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003259 if (NCH(n) == 1) {
3260 com_fpdef(c, CHILD(n, 0));
3261 }
3262 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003263 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003264 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003265 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003266 for (i = 0; i < NCH(n); i += 2)
3267 com_fpdef(c, CHILD(n, i));
3268 }
3269}
3270
3271static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003272com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003273{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003274 int nch, i;
3275 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003276 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003277 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003278 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003279 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003280 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003281 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003282 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003283 node *ch = CHILD(n, i);
3284 node *fp;
3285 char *name;
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003286 PyObject *nameval;
Guido van Rossum50564e81996-01-12 01:13:16 +00003287 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003288 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003289 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3290 fp = CHILD(ch, 0);
3291 if (TYPE(fp) == NAME)
3292 name = STR(fp);
3293 else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003294 name = nbuf;
3295 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003296 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003297 }
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003298 nameval = PyString_InternFromString(name);
3299 if (nameval == NULL) {
3300 c->c_errors++;
3301 }
Peter Schneider-Kamp9a5086c2000-07-13 06:24:29 +00003302 if (PyDict_GetItem(c->c_locals, nameval)) {
Fred Drakedcf08e02000-08-15 15:49:44 +00003303 com_error(c, PyExc_SyntaxError,
3304 "duplicate argument in function definition");
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003305 }
3306 com_newlocal_o(c, nameval);
3307 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003308 c->c_argcount++;
3309 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003310 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003311 ch = CHILD(n, i);
3312 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003313 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003314 else
3315 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003316 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003317 /* Handle *arguments */
3318 if (i < nch) {
3319 node *ch;
3320 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003321 if (TYPE(ch) != DOUBLESTAR) {
3322 REQ(ch, STAR);
3323 ch = CHILD(n, i+1);
3324 if (TYPE(ch) == NAME) {
3325 c->c_flags |= CO_VARARGS;
3326 i += 3;
3327 com_newlocal(c, STR(ch));
3328 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003329 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003330 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003331 /* Handle **keywords */
3332 if (i < nch) {
3333 node *ch;
3334 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003335 if (TYPE(ch) != DOUBLESTAR) {
3336 REQ(ch, STAR);
3337 ch = CHILD(n, i+1);
3338 REQ(ch, STAR);
3339 ch = CHILD(n, i+2);
3340 }
3341 else
3342 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003343 REQ(ch, NAME);
3344 c->c_flags |= CO_VARKEYWORDS;
3345 com_newlocal(c, STR(ch));
3346 }
3347 if (complex) {
3348 /* Generate code for complex arguments only after
3349 having counted the simple arguments */
3350 int ilocal = 0;
3351 for (i = 0; i < nch; i++) {
3352 node *ch = CHILD(n, i);
3353 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003354 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003355 break;
3356 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3357 fp = CHILD(ch, 0);
3358 if (TYPE(fp) != NAME) {
3359 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003360 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003361 com_fpdef(c, ch);
3362 }
3363 ilocal++;
3364 if (++i >= nch)
3365 break;
3366 ch = CHILD(n, i);
3367 if (TYPE(ch) == EQUAL)
3368 i += 2;
3369 else
3370 REQ(ch, COMMA);
3371 }
3372 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003373}
3374
3375static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003376com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003377{
3378 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003379 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003380 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003381 doc = get_docstring(n);
3382 if (doc != NULL) {
3383 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003384 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003385 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003386 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003387 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003388 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003389 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003390 for (i = 0; i < NCH(n); i++) {
3391 node *ch = CHILD(n, i);
3392 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3393 com_node(c, ch);
3394 }
3395}
3396
3397/* Top-level compile-node interface */
3398
3399static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003400compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003401{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003402 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003403 node *ch;
3404 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003405 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003406 doc = get_docstring(CHILD(n, 4));
3407 if (doc != NULL) {
3408 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003409 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003410 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003411 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003412 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003413 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3414 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003415 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003416 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003417 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003418 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003419 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003420 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003421 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003422 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003423 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003424}
3425
3426static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003427compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003428{
Guido van Rossum590baa41993-11-30 13:40:46 +00003429 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003430 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003431 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003432
3433 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003434 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003435 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003436 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003437 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003438 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003439 else
3440 ch = CHILD(n, 2);
3441 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003442 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003443 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003444}
3445
3446static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003447compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003448{
3449 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003450 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003451 REQ(n, classdef);
3452 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3453 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003454#ifdef PRIVATE_NAME_MANGLING
3455 c->c_private = c->c_name;
3456#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003457 ch = CHILD(n, NCH(n)-1); /* The suite */
3458 doc = get_docstring(ch);
3459 if (doc != NULL) {
3460 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003461 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003462 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003463 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003464 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003465 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003466 }
3467 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003468 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003469 com_node(c, ch);
3470 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003471 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003472 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003473 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003474}
3475
3476static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003477compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003478{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003479 com_addoparg(c, SET_LINENO, n->n_lineno);
3480
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003481 switch (TYPE(n)) {
3482
Guido van Rossum4c417781991-01-21 16:09:22 +00003483 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003484 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003485 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003486 n = CHILD(n, 0);
3487 if (TYPE(n) != NEWLINE)
3488 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003489 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003490 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003491 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003492 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003493 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003494 break;
3495
Guido van Rossum4c417781991-01-21 16:09:22 +00003496 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003497 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003498 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003499 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003500 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003501 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003502 break;
3503
Guido van Rossum590baa41993-11-30 13:40:46 +00003504 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003505 com_node(c, CHILD(n, 0));
3506 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003507 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003508 break;
3509
Guido van Rossum590baa41993-11-30 13:40:46 +00003510 case lambdef: /* anonymous function definition */
3511 compile_lambdef(c, n);
3512 break;
3513
Guido van Rossum4c417781991-01-21 16:09:22 +00003514 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003515 compile_funcdef(c, n);
3516 break;
3517
Guido van Rossum4c417781991-01-21 16:09:22 +00003518 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003519 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003520 break;
3521
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003522 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003523 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003524 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003525 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003526 }
3527}
3528
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003529/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00003530
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003531 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
3532 instructions that refer to local variables with LOAD_FAST etc.
3533 The latter instructions are much faster because they don't need to
3534 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003535
Guido van Rossum681d79a1995-07-18 14:51:37 +00003536 To find all local variables, we check all STORE_NAME, IMPORT_FROM
3537 and DELETE_NAME instructions. This yields all local variables,
3538 function definitions, class definitions and import statements.
3539 Argument names have already been entered into the list by the
3540 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003541
3542 All remaining LOAD_NAME instructions must refer to non-local (global
3543 or builtin) variables, so are replaced by LOAD_GLOBAL.
3544
3545 There are two problems: 'from foo import *' and 'exec' may introduce
3546 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00003547 case, we can still optimize bona fide locals (since those
3548 statements will be surrounded by fast_2_locals() and
3549 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003550
Guido van Rossum681d79a1995-07-18 14:51:37 +00003551 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00003552
3553static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003554optimize(struct compiling *c)
Guido van Rossum282914b1991-04-04 10:42:56 +00003555{
Guido van Rossum0a697f61991-04-16 08:39:12 +00003556 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00003557 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00003558 int oparg = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003559 PyObject *name;
3560 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003561
Guido van Rossum282914b1991-04-04 10:42:56 +00003562#define NEXTOP() (*next_instr++)
3563#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossum79f25d91997-04-29 20:08:16 +00003564#define GETITEM(v, i) (PyList_GetItem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003565#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
3566
Guido van Rossum79f25d91997-04-29 20:08:16 +00003567 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003568
3569 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00003570
Guido van Rossum79f25d91997-04-29 20:08:16 +00003571 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003572 for (;;) {
3573 opcode = NEXTOP();
3574 if (opcode == STOP_CODE)
3575 break;
3576 if (HAS_ARG(opcode))
3577 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +00003578 dispatch_opcode1:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003579 switch (opcode) {
3580 case STORE_NAME:
3581 case DELETE_NAME:
3582 case IMPORT_FROM:
3583 com_addlocal_o(c, GETNAMEOBJ(oparg));
3584 break;
Thomas Wouters52152252000-08-17 22:55:00 +00003585 case IMPORT_STAR:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003586 case EXEC_STMT:
3587 c->c_flags &= ~CO_OPTIMIZED;
3588 break;
Fred Drakeef8ace32000-08-24 00:32:09 +00003589 case EXTENDED_ARG:
3590 opcode = NEXTOP();
3591 oparg = oparg<<16 | NEXTARG();
3592 goto dispatch_opcode1;
3593 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00003594 }
3595 }
3596
Thomas Wouters52152252000-08-17 22:55:00 +00003597 /* TBD: Is this still necessary ? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003598 if (PyDict_GetItemString(c->c_locals, "*") != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003599 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003600
Guido van Rossum79f25d91997-04-29 20:08:16 +00003601 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003602 for (;;) {
3603 cur_instr = next_instr;
3604 opcode = NEXTOP();
3605 if (opcode == STOP_CODE)
3606 break;
3607 if (HAS_ARG(opcode))
3608 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +00003609 dispatch_opcode2:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003610 if (opcode == LOAD_NAME ||
3611 opcode == STORE_NAME ||
3612 opcode == DELETE_NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003613 PyObject *v;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003614 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00003615 name = GETNAMEOBJ(oparg);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003616 v = PyDict_GetItem(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003617 if (v == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003618 if (opcode == LOAD_NAME &&
3619 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003620 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003621 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00003622 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003623 i = PyInt_AsLong(v);
Fred Drakeef8ace32000-08-24 00:32:09 +00003624 if (i >> 16) /* too big for 2 bytes */
3625 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003626 switch (opcode) {
3627 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
3628 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
3629 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
3630 }
3631 cur_instr[1] = i & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +00003632 cur_instr[2] = i >> 8;
3633 }
3634 if (opcode == EXTENDED_ARG) {
3635 opcode = NEXTOP();
3636 oparg = oparg<<16 | NEXTARG();
3637 goto dispatch_opcode2;
Guido van Rossum282914b1991-04-04 10:42:56 +00003638 }
3639 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003640
Guido van Rossum681d79a1995-07-18 14:51:37 +00003641 if (c->c_errors == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00003642 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00003643}
3644
Guido van Rossum79f25d91997-04-29 20:08:16 +00003645PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003646PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003647{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003648 return jcompile(n, filename, NULL);
3649}
3650
Guido van Rossum79f25d91997-04-29 20:08:16 +00003651static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003652icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003653{
3654 return jcompile(n, base->c_filename, base);
3655}
3656
Guido van Rossum79f25d91997-04-29 20:08:16 +00003657static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003658jcompile(node *n, char *filename, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003659{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003660 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003661 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003662 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003663 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003664#ifdef PRIVATE_NAME_MANGLING
3665 if (base)
3666 sc.c_private = base->c_private;
3667 else
3668 sc.c_private = NULL;
3669#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003670 compile_node(&sc, n);
3671 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003672 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003673 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003674 sc.c_flags |= CO_NEWLOCALS;
3675 }
3676 else if (TYPE(n) == classdef)
3677 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00003678 co = NULL;
3679 if (sc.c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003680 PyObject *consts, *names, *varnames, *filename, *name;
3681 consts = PyList_AsTuple(sc.c_consts);
3682 names = PyList_AsTuple(sc.c_names);
3683 varnames = PyList_AsTuple(sc.c_varnames);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003684 filename = PyString_InternFromString(sc.c_filename);
3685 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003686 if (!PyErr_Occurred())
3687 co = PyCode_New(sc.c_argcount,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003688 sc.c_nlocals,
Guido van Rossum8b993a91997-01-17 21:04:03 +00003689 sc.c_maxstacklevel,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003690 sc.c_flags,
3691 sc.c_code,
3692 consts,
3693 names,
3694 varnames,
3695 filename,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003696 name,
3697 sc.c_firstlineno,
3698 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003699 Py_XDECREF(consts);
3700 Py_XDECREF(names);
3701 Py_XDECREF(varnames);
3702 Py_XDECREF(filename);
3703 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003704 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003705 else if (!PyErr_Occurred()) {
3706 /* This could happen if someone called PyErr_Clear() after an
3707 error was reported above. That's not supposed to happen,
3708 but I just plugged one case and I'm not sure there can't be
3709 others. In that case, raise SystemError so that at least
3710 it gets reported instead dumping core. */
3711 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3712 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003713 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003714 return co;
3715}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003716
3717int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003718PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003719{
3720 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003721 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003722 int line = co->co_firstlineno;
3723 int addr = 0;
3724 while (--size >= 0) {
3725 addr += *p++;
3726 if (addr > addrq)
3727 break;
3728 line += *p++;
3729 }
3730 return line;
3731}