blob: 15c46067de3146e4d178d1707dbca3fca0c1d98d [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 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000261 PyObject *c_code; /* string */
262 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 }
876 else if (rawmode || strchr(s, '\\') == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000877 return PyString_FromStringAndSize(s, len);
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000878 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000879 v = PyString_FromStringAndSize((char *)NULL, len);
880 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000881 end = s + len;
882 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000883 if (*s != '\\') {
884 *p++ = *s++;
885 continue;
886 }
887 s++;
888 switch (*s++) {
889 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000890 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000891 case '\\': *p++ = '\\'; break;
892 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000893 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000894 case 'b': *p++ = '\b'; break;
895 case 'f': *p++ = '\014'; break; /* FF */
896 case 't': *p++ = '\t'; break;
897 case 'n': *p++ = '\n'; break;
898 case 'r': *p++ = '\r'; break;
899 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000900 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
901 case '0': case '1': case '2': case '3':
902 case '4': case '5': case '6': case '7':
903 c = s[-1] - '0';
904 if ('0' <= *s && *s <= '7') {
905 c = (c<<3) + *s++ - '0';
906 if ('0' <= *s && *s <= '7')
907 c = (c<<3) + *s++ - '0';
908 }
909 *p++ = c;
910 break;
911 case 'x':
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000912 if (isxdigit(Py_CHARMASK(*s))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000913 unsigned int x = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000914 do {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000915 c = Py_CHARMASK(*s);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000916 s++;
Guido van Rossumed1100f1997-10-20 23:24:07 +0000917 x = (x<<4) & ~0xF;
918 if (isdigit(c))
919 x += c - '0';
920 else if (islower(c))
921 x += 10 + c - 'a';
922 else
923 x += 10 + c - 'A';
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000924 } while (isxdigit(Py_CHARMASK(*s)));
Guido van Rossumed1100f1997-10-20 23:24:07 +0000925 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000926 break;
927 }
928 /* FALLTHROUGH */
929 default: *p++ = '\\'; *p++ = s[-1]; break;
930 }
931 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000932 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000933 return v;
934}
935
Guido van Rossum79f25d91997-04-29 20:08:16 +0000936static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000937parsestrplus(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000938{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000939 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000940 int i;
941 REQ(CHILD(n, 0), STRING);
942 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
943 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +0000944 for (i = 1; i < NCH(n); i++) {
945 PyObject *s;
946 s = parsestr(STR(CHILD(n, i)));
947 if (s == NULL)
948 goto onError;
949 if (PyString_Check(v) && PyString_Check(s)) {
950 PyString_ConcatAndDel(&v, s);
951 if (v == NULL)
952 goto onError;
953 }
954 else {
955 PyObject *temp;
956 temp = PyUnicode_Concat(v, s);
957 Py_DECREF(s);
958 if (temp == NULL)
959 goto onError;
960 Py_DECREF(v);
961 v = temp;
962 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000963 }
964 }
965 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +0000966
967 onError:
968 Py_XDECREF(v);
969 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000970}
971
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000972static void
Skip Montanaro803d6e52000-08-12 18:09:51 +0000973com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000974{
Skip Montanaro803d6e52000-08-12 18:09:51 +0000975 PyObject *v;
976 int anchor = 0;
977 int save_begin = c->c_begin;
978
979 /* list_iter: for v in expr [list_iter] */
980 com_node(c, CHILD(n, 3)); /* expr */
981 v = PyInt_FromLong(0L);
982 if (v == NULL)
983 c->c_errors++;
984 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
985 com_push(c, 1);
986 Py_XDECREF(v);
987 c->c_begin = c->c_nexti;
988 com_addoparg(c, SET_LINENO, n->n_lineno);
989 com_addfwref(c, FOR_LOOP, &anchor);
990 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +0000991 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000992 c->c_loops++;
993 com_list_iter(c, n, e, t);
994 c->c_loops--;
995 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
996 c->c_begin = save_begin;
997 com_backpatch(c, anchor);
998 com_pop(c, 2); /* FOR_LOOP has popped these */
999}
1000
1001static void
1002com_list_if(struct compiling *c, node *n, node *e, char *t)
1003{
1004 int anchor = 0;
1005 int a = 0;
1006 /* list_iter: 'if' test [list_iter] */
1007 com_addoparg(c, SET_LINENO, n->n_lineno);
1008 com_node(c, CHILD(n, 1));
1009 com_addfwref(c, JUMP_IF_FALSE, &a);
1010 com_addbyte(c, POP_TOP);
1011 com_pop(c, 1);
1012 com_list_iter(c, n, e, t);
1013 com_addfwref(c, JUMP_FORWARD, &anchor);
1014 com_backpatch(c, a);
1015 /* We jump here with an extra entry which we now pop */
1016 com_addbyte(c, POP_TOP);
1017 com_backpatch(c, anchor);
1018}
1019
1020static void
1021com_list_iter(struct compiling *c,
1022 node *p, /* parent of list_iter node */
1023 node *e, /* element expression node */
1024 char *t /* name of result list temp local */)
1025{
1026 /* list_iter is the last child in a listmaker, list_for, or list_if */
1027 node *n = CHILD(p, NCH(p)-1);
1028 if (TYPE(n) == list_iter) {
1029 n = CHILD(n, 0);
1030 switch (TYPE(n)) {
1031 case list_for:
1032 com_list_for(c, n, e, t);
1033 break;
1034 case list_if:
1035 com_list_if(c, n, e, t);
1036 break;
1037 default:
1038 com_error(c, PyExc_SystemError,
1039 "invalid list_iter node type");
1040 }
1041 }
1042 else {
1043 com_addopnamestr(c, LOAD_NAME, t);
1044 com_push(c, 1);
1045 com_node(c, e);
1046 com_addoparg(c, CALL_FUNCTION, 1);
1047 com_addbyte(c, POP_TOP);
1048 com_pop(c, 2);
1049 }
1050}
1051
1052static void
1053com_list_comprehension(struct compiling *c, node *n)
1054{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001055 /* listmaker: test list_for */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001056 char tmpname[12];
1057 sprintf(tmpname, "__%d__", ++c->c_tmpname);
1058 com_addoparg(c, BUILD_LIST, 0);
1059 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1060 com_push(c, 2);
1061 com_addopnamestr(c, LOAD_ATTR, "append");
1062 com_addopnamestr(c, STORE_NAME, tmpname);
1063 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001064 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001065 com_addopnamestr(c, DELETE_NAME, tmpname);
1066 --c->c_tmpname;
1067}
1068
1069static void
1070com_listmaker(struct compiling *c, node *n)
1071{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001072 /* listmaker: test ( list_for | (',' test)* [','] ) */
1073 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001074 com_list_comprehension(c, n);
1075 else {
1076 int len = 0;
1077 int i;
1078 for (i = 0; i < NCH(n); i += 2, len++)
1079 com_node(c, CHILD(n, i));
1080 com_addoparg(c, BUILD_LIST, len);
1081 com_pop(c, len-1);
1082 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001083}
1084
1085static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001086com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001087{
1088 int i;
1089 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1090 for (i = 0; i+2 < NCH(n); i += 4) {
1091 /* We must arrange things just right for STORE_SUBSCR.
1092 It wants the stack to look like (value) (dict) (key) */
1093 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001094 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001095 com_node(c, CHILD(n, i+2)); /* value */
1096 com_addbyte(c, ROT_TWO);
1097 com_node(c, CHILD(n, i)); /* key */
1098 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001099 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001100 }
1101}
1102
1103static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001104com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001105{
1106 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001107 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001108 int i;
1109 REQ(n, atom);
1110 ch = CHILD(n, 0);
1111 switch (TYPE(ch)) {
1112 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001113 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001114 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001115 com_push(c, 1);
1116 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001117 else
1118 com_node(c, CHILD(n, 1));
1119 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001120 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001121 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001122 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001123 com_push(c, 1);
1124 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001125 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001126 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001127 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001128 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001129 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001130 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001131 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001132 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001133 break;
1134 case BACKQUOTE:
1135 com_node(c, CHILD(n, 1));
1136 com_addbyte(c, UNARY_CONVERT);
1137 break;
1138 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001139 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001140 i = 255;
1141 }
1142 else {
1143 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001144 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001145 }
1146 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001147 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001148 break;
1149 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001150 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001151 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001152 c->c_errors++;
1153 i = 255;
1154 }
1155 else {
1156 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001157 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001158 }
1159 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001160 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001161 break;
1162 case NAME:
1163 com_addopname(c, LOAD_NAME, ch);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001164 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001165 break;
1166 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001167 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001168 com_error(c, PyExc_SystemError,
1169 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001170 }
1171}
1172
1173static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001174com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001175{
1176 if (NCH(n) == 1) {
1177 com_addbyte(c, op);
1178 }
1179 else if (NCH(n) == 2) {
1180 if (TYPE(CHILD(n, 0)) != COLON) {
1181 com_node(c, CHILD(n, 0));
1182 com_addbyte(c, op+1);
1183 }
1184 else {
1185 com_node(c, CHILD(n, 1));
1186 com_addbyte(c, op+2);
1187 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001188 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001189 }
1190 else {
1191 com_node(c, CHILD(n, 0));
1192 com_node(c, CHILD(n, 2));
1193 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001194 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001195 }
1196}
1197
Guido van Rossum635abd21997-01-06 22:56:52 +00001198static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001199com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1200{
1201 if (NCH(n) == 1) {
1202 com_addbyte(c, DUP_TOP);
1203 com_push(c, 1);
1204 com_addbyte(c, SLICE);
1205 com_node(c, augn);
1206 com_addbyte(c, opcode);
1207 com_pop(c, 1);
1208 com_addbyte(c, ROT_TWO);
1209 com_addbyte(c, STORE_SLICE);
1210 com_pop(c, 2);
1211 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1212 com_node(c, CHILD(n, 0));
1213 com_addoparg(c, DUP_TOPX, 2);
1214 com_push(c, 2);
1215 com_addbyte(c, SLICE+1);
1216 com_pop(c, 1);
1217 com_node(c, augn);
1218 com_addbyte(c, opcode);
1219 com_pop(c, 1);
1220 com_addbyte(c, ROT_THREE);
1221 com_addbyte(c, STORE_SLICE+1);
1222 com_pop(c, 3);
1223 } else if (NCH(n) == 2) {
1224 com_node(c, CHILD(n, 1));
1225 com_addoparg(c, DUP_TOPX, 2);
1226 com_push(c, 2);
1227 com_addbyte(c, SLICE+2);
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+2);
1234 com_pop(c, 3);
1235 } else {
1236 com_node(c, CHILD(n, 0));
1237 com_node(c, CHILD(n, 2));
1238 com_addoparg(c, DUP_TOPX, 3);
1239 com_push(c, 3);
1240 com_addbyte(c, SLICE+3);
1241 com_pop(c, 2);
1242 com_node(c, augn);
1243 com_addbyte(c, opcode);
1244 com_pop(c, 1);
1245 com_addbyte(c, ROT_FOUR);
1246 com_addbyte(c, STORE_SLICE+3);
1247 com_pop(c, 4);
1248 }
1249}
1250
1251static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001252com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001253{
1254 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001255 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001256 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001257 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001258 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001259 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001260 }
1261 else {
1262 com_node(c, CHILD(n, 0));
1263 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001264 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001265 }
1266 m = n;
1267 do {
1268 m = CHILD(m, 0);
1269 } while (NCH(m) == 1);
1270 if (TYPE(m) != NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001271 com_error(c, PyExc_SyntaxError,
1272 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001273 }
1274 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001275 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001276 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001277 *pkeywords = PyDict_New();
Guido van Rossum635abd21997-01-06 22:56:52 +00001278 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001279 c->c_errors++;
1280 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001281 if (PyDict_GetItem(*pkeywords, v) != NULL)
1282 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001283 "duplicate keyword argument");
1284 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001285 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001286 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001287 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001288 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001289 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001290 }
1291 }
1292 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001293}
1294
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001295static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001296com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001297{
1298 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001299 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001300 }
1301 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001302 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001303 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001304 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001305 int star_flag = 0;
1306 int starstar_flag = 0;
1307 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001308 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001309 na = 0;
1310 nk = 0;
1311 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001312 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001313 if (TYPE(ch) == STAR ||
1314 TYPE(ch) == DOUBLESTAR)
1315 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001316 if (ch->n_lineno != lineno) {
1317 lineno = ch->n_lineno;
1318 com_addoparg(c, SET_LINENO, lineno);
1319 }
1320 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001321 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001322 na++;
1323 else
1324 nk++;
1325 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001326 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001327 while (i < NCH(n)) {
1328 node *tok = CHILD(n, i);
1329 node *ch = CHILD(n, i+1);
1330 i += 3;
1331 switch (TYPE(tok)) {
1332 case STAR: star_flag = 1; break;
1333 case DOUBLESTAR: starstar_flag = 1; break;
1334 }
1335 com_node(c, ch);
1336 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001337 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001338 com_error(c, PyExc_SyntaxError,
1339 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001340 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001341 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001342 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001343 star_flag + (starstar_flag << 1);
1344 else
1345 opcode = CALL_FUNCTION;
1346 com_addoparg(c, opcode, na | (nk << 8));
1347 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001348 }
1349}
1350
1351static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001352com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001353{
1354 com_addopname(c, LOAD_ATTR, n);
1355}
1356
1357static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001358com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001359{
1360 int i=0;
1361 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001362 node *ch;
1363
1364 /* first argument */
1365 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001366 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001367 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001368 i++;
1369 }
1370 else {
1371 com_node(c, CHILD(n,i));
1372 i++;
1373 REQ(CHILD(n,i),COLON);
1374 i++;
1375 }
1376 /* second argument */
1377 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1378 com_node(c, CHILD(n,i));
1379 i++;
1380 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001381 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001382 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001383 com_push(c, 1);
1384 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001385 /* remaining arguments */
1386 for (; i < NCH(n); i++) {
1387 ns++;
1388 ch=CHILD(n,i);
1389 REQ(ch, sliceop);
1390 if (NCH(ch) == 1) {
1391 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001392 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001393 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001394 }
1395 else
1396 com_node(c, CHILD(ch,1));
1397 }
1398 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001399 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001400}
1401
1402static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001403com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001404{
1405 node *ch;
1406 REQ(n, subscript);
1407 ch = CHILD(n,0);
1408 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001409 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001410 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001411 com_push(c, 1);
1412 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001413 else {
1414 /* check for slice */
1415 if ((TYPE(ch) == COLON || NCH(n) > 1))
1416 com_sliceobj(c, n);
1417 else {
1418 REQ(ch, test);
1419 com_node(c, ch);
1420 }
1421 }
1422}
1423
1424static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001425com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001426{
1427 int i, op;
1428 REQ(n, subscriptlist);
1429 /* Check to make backward compatible slice behavior for '[i:j]' */
1430 if (NCH(n) == 1) {
1431 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001432 /* 'Basic' slice, should have exactly one colon. */
1433 if ((TYPE(CHILD(sub, 0)) == COLON
1434 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1435 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1436 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001437 switch (assigning) {
1438 case OP_DELETE:
1439 op = DELETE_SLICE;
1440 break;
1441 case OP_ASSIGN:
1442 op = STORE_SLICE;
1443 break;
1444 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001445 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001446 break;
1447 default:
1448 com_augassign_slice(c, sub, assigning, augn);
1449 return;
1450 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001451 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001452 if (op == STORE_SLICE)
1453 com_pop(c, 2);
1454 else if (op == DELETE_SLICE)
1455 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001456 return;
1457 }
1458 }
1459 /* Else normal subscriptlist. Compile each subscript. */
1460 for (i = 0; i < NCH(n); i += 2)
1461 com_subscript(c, CHILD(n, i));
1462 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001463 if (NCH(n) > 1) {
1464 i = (NCH(n)+1) / 2;
1465 com_addoparg(c, BUILD_TUPLE, i);
1466 com_pop(c, i-1);
1467 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001468 switch (assigning) {
1469 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001470 op = DELETE_SUBSCR;
1471 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001472 break;
1473 default:
1474 case OP_ASSIGN:
1475 op = STORE_SUBSCR;
1476 i = 3;
1477 break;
1478 case OP_APPLY:
1479 op = BINARY_SUBSCR;
1480 i = 1;
1481 break;
1482 }
1483 if (assigning > OP_APPLY) {
1484 com_addoparg(c, DUP_TOPX, 2);
1485 com_push(c, 2);
1486 com_addbyte(c, BINARY_SUBSCR);
1487 com_pop(c, 1);
1488 com_node(c, augn);
1489 com_addbyte(c, assigning);
1490 com_pop(c, 1);
1491 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001492 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001493 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001494 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001495}
1496
1497static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001498com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001499{
1500 REQ(n, trailer);
1501 switch (TYPE(CHILD(n, 0))) {
1502 case LPAR:
1503 com_call_function(c, CHILD(n, 1));
1504 break;
1505 case DOT:
1506 com_select_member(c, CHILD(n, 1));
1507 break;
1508 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00001509 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001510 break;
1511 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001512 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001513 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001514 }
1515}
1516
1517static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001518com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001519{
1520 int i;
1521 REQ(n, power);
1522 com_atom(c, CHILD(n, 0));
1523 for (i = 1; i < NCH(n); i++) {
1524 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1525 com_factor(c, CHILD(n, i+1));
1526 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001527 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001528 break;
1529 }
1530 else
1531 com_apply_trailer(c, CHILD(n, i));
1532 }
1533}
1534
1535static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001536com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001537{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001538 REQ(n, factor);
1539 if (TYPE(CHILD(n, 0)) == PLUS) {
1540 com_factor(c, CHILD(n, 1));
1541 com_addbyte(c, UNARY_POSITIVE);
1542 }
1543 else if (TYPE(CHILD(n, 0)) == MINUS) {
1544 com_factor(c, CHILD(n, 1));
1545 com_addbyte(c, UNARY_NEGATIVE);
1546 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001547 else if (TYPE(CHILD(n, 0)) == TILDE) {
1548 com_factor(c, CHILD(n, 1));
1549 com_addbyte(c, UNARY_INVERT);
1550 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001551 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001552 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001553 }
1554}
1555
1556static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001557com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001558{
1559 int i;
1560 int op;
1561 REQ(n, term);
1562 com_factor(c, CHILD(n, 0));
1563 for (i = 2; i < NCH(n); i += 2) {
1564 com_factor(c, CHILD(n, i));
1565 switch (TYPE(CHILD(n, i-1))) {
1566 case STAR:
1567 op = BINARY_MULTIPLY;
1568 break;
1569 case SLASH:
1570 op = BINARY_DIVIDE;
1571 break;
1572 case PERCENT:
1573 op = BINARY_MODULO;
1574 break;
1575 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001576 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001577 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001578 op = 255;
1579 }
1580 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001581 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001582 }
1583}
1584
1585static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001586com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001587{
1588 int i;
1589 int op;
1590 REQ(n, arith_expr);
1591 com_term(c, CHILD(n, 0));
1592 for (i = 2; i < NCH(n); i += 2) {
1593 com_term(c, CHILD(n, i));
1594 switch (TYPE(CHILD(n, i-1))) {
1595 case PLUS:
1596 op = BINARY_ADD;
1597 break;
1598 case MINUS:
1599 op = BINARY_SUBTRACT;
1600 break;
1601 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001602 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001603 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001604 op = 255;
1605 }
1606 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001607 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001608 }
1609}
1610
1611static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001612com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001613{
1614 int i;
1615 int op;
1616 REQ(n, shift_expr);
1617 com_arith_expr(c, CHILD(n, 0));
1618 for (i = 2; i < NCH(n); i += 2) {
1619 com_arith_expr(c, CHILD(n, i));
1620 switch (TYPE(CHILD(n, i-1))) {
1621 case LEFTSHIFT:
1622 op = BINARY_LSHIFT;
1623 break;
1624 case RIGHTSHIFT:
1625 op = BINARY_RSHIFT;
1626 break;
1627 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001628 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001629 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001630 op = 255;
1631 }
1632 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001633 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001634 }
1635}
1636
1637static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001638com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001639{
1640 int i;
1641 int op;
1642 REQ(n, and_expr);
1643 com_shift_expr(c, CHILD(n, 0));
1644 for (i = 2; i < NCH(n); i += 2) {
1645 com_shift_expr(c, CHILD(n, i));
1646 if (TYPE(CHILD(n, i-1)) == AMPER) {
1647 op = BINARY_AND;
1648 }
1649 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001650 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001651 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001652 op = 255;
1653 }
1654 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001655 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001656 }
1657}
1658
1659static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001660com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001661{
1662 int i;
1663 int op;
1664 REQ(n, xor_expr);
1665 com_and_expr(c, CHILD(n, 0));
1666 for (i = 2; i < NCH(n); i += 2) {
1667 com_and_expr(c, CHILD(n, i));
1668 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1669 op = BINARY_XOR;
1670 }
1671 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001672 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001673 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001674 op = 255;
1675 }
1676 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001677 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001678 }
1679}
1680
1681static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001682com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001683{
1684 int i;
1685 int op;
1686 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001687 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001688 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001689 com_xor_expr(c, CHILD(n, i));
1690 if (TYPE(CHILD(n, i-1)) == VBAR) {
1691 op = BINARY_OR;
1692 }
1693 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001694 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001695 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001696 op = 255;
1697 }
1698 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001699 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001700 }
1701}
1702
1703static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001704cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001705{
1706 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001707 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001708 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1709 if (NCH(n) == 1) {
1710 n = CHILD(n, 0);
1711 switch (TYPE(n)) {
1712 case LESS: return LT;
1713 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001714 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001715 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001716 case LESSEQUAL: return LE;
1717 case GREATEREQUAL: return GE;
1718 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001719 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1720 if (strcmp(STR(n), "is") == 0) return IS;
1721 }
1722 }
1723 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001724 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001725 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1726 return NOT_IN;
1727 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1728 return IS_NOT;
1729 }
1730 }
1731 return BAD;
1732}
1733
1734static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001735com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001736{
1737 int i;
1738 enum cmp_op op;
1739 int anchor;
1740 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1741 com_expr(c, CHILD(n, 0));
1742 if (NCH(n) == 1)
1743 return;
1744
1745 /****************************************************************
1746 The following code is generated for all but the last
1747 comparison in a chain:
1748
1749 label: on stack: opcode: jump to:
1750
1751 a <code to load b>
1752 a, b DUP_TOP
1753 a, b, b ROT_THREE
1754 b, a, b COMPARE_OP
1755 b, 0-or-1 JUMP_IF_FALSE L1
1756 b, 1 POP_TOP
1757 b
1758
1759 We are now ready to repeat this sequence for the next
1760 comparison in the chain.
1761
1762 For the last we generate:
1763
1764 b <code to load c>
1765 b, c COMPARE_OP
1766 0-or-1
1767
1768 If there were any jumps to L1 (i.e., there was more than one
1769 comparison), we generate:
1770
1771 0-or-1 JUMP_FORWARD L2
1772 L1: b, 0 ROT_TWO
1773 0, b POP_TOP
1774 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00001775 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001776 ****************************************************************/
1777
1778 anchor = 0;
1779
1780 for (i = 2; i < NCH(n); i += 2) {
1781 com_expr(c, CHILD(n, i));
1782 if (i+2 < NCH(n)) {
1783 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001784 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001785 com_addbyte(c, ROT_THREE);
1786 }
1787 op = cmp_type(CHILD(n, i-1));
1788 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001789 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001790 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001791 }
1792 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001793 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001794 if (i+2 < NCH(n)) {
1795 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1796 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001797 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001798 }
1799 }
1800
1801 if (anchor) {
1802 int anchor2 = 0;
1803 com_addfwref(c, JUMP_FORWARD, &anchor2);
1804 com_backpatch(c, anchor);
1805 com_addbyte(c, ROT_TWO);
1806 com_addbyte(c, POP_TOP);
1807 com_backpatch(c, anchor2);
1808 }
1809}
1810
1811static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001812com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001813{
1814 REQ(n, not_test); /* 'not' not_test | comparison */
1815 if (NCH(n) == 1) {
1816 com_comparison(c, CHILD(n, 0));
1817 }
1818 else {
1819 com_not_test(c, CHILD(n, 1));
1820 com_addbyte(c, UNARY_NOT);
1821 }
1822}
1823
1824static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001825com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001826{
1827 int i;
1828 int anchor;
1829 REQ(n, and_test); /* not_test ('and' not_test)* */
1830 anchor = 0;
1831 i = 0;
1832 for (;;) {
1833 com_not_test(c, CHILD(n, i));
1834 if ((i += 2) >= NCH(n))
1835 break;
1836 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1837 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001838 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001839 }
1840 if (anchor)
1841 com_backpatch(c, anchor);
1842}
1843
1844static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001845com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001846{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001847 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00001848 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001849 PyObject *v;
Guido van Rossum57531fe1993-11-30 14:57:42 +00001850 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001851 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001852 v = (PyObject *) icompile(CHILD(n, 0), c);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001853 if (v == NULL) {
1854 c->c_errors++;
1855 i = 255;
1856 }
1857 else {
1858 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001859 Py_DECREF(v);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001860 }
1861 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001862 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001863 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001864 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001865 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001866 else {
1867 int anchor = 0;
1868 int i = 0;
1869 for (;;) {
1870 com_and_test(c, CHILD(n, i));
1871 if ((i += 2) >= NCH(n))
1872 break;
1873 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1874 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001875 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001876 }
1877 if (anchor)
1878 com_backpatch(c, anchor);
1879 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001880}
1881
1882static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001883com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001884{
1885 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001886 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001887 com_node(c, CHILD(n, 0));
1888 }
1889 else {
1890 int i;
1891 int len;
1892 len = (NCH(n) + 1) / 2;
1893 for (i = 0; i < NCH(n); i += 2)
1894 com_node(c, CHILD(n, i));
1895 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001896 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001897 }
1898}
1899
1900
1901/* Begin of assignment compilation */
1902
Thomas Wouters434d0822000-08-24 20:11:32 +00001903
1904static void
1905com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
1906{
1907 com_addbyte(c, DUP_TOP);
1908 com_push(c, 1);
1909 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00001910 com_node(c, augn);
1911 com_addbyte(c, opcode);
1912 com_pop(c, 1);
1913 com_addbyte(c, ROT_TWO);
1914 com_addopname(c, STORE_ATTR, n);
1915 com_pop(c, 2);
1916}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001917
1918static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001919com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001920{
1921 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001922 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001923}
1924
1925static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001926com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001927{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001928 REQ(n, trailer);
1929 switch (TYPE(CHILD(n, 0))) {
1930 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001931 com_error(c, PyExc_SyntaxError,
1932 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001933 break;
1934 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00001935 if (assigning > OP_APPLY)
1936 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
1937 else
1938 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001939 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001940 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00001941 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001942 break;
1943 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001944 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001945 }
1946}
1947
1948static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001949com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001950{
1951 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00001952 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001953 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001954 if (assigning) {
1955 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001956 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001957 com_push(c, i-1);
1958 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001959 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00001960 com_assign(c, CHILD(n, i), assigning, NULL);
1961}
1962
1963static void
1964com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
1965{
1966 REQ(n, NAME);
1967 com_addopname(c, LOAD_NAME, n);
1968 com_push(c, 1);
1969 com_node(c, augn);
1970 com_addbyte(c, opcode);
1971 com_pop(c, 1);
1972 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001973}
1974
1975static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001976com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001977{
1978 REQ(n, NAME);
1979 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001980 if (assigning)
1981 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001982}
1983
1984static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001985com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001986{
1987 /* Loop to avoid trivial recursion */
1988 for (;;) {
1989 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001990
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001991 case exprlist:
1992 case testlist:
1993 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001994 if (assigning > OP_APPLY) {
1995 com_error(c, PyExc_SyntaxError,
1996 "augmented assign to tuple not possible");
1997 return;
1998 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001999 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002000 return;
2001 }
2002 n = CHILD(n, 0);
2003 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002004
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002005 case test:
2006 case and_test:
2007 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002008 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002009 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002010 case xor_expr:
2011 case and_expr:
2012 case shift_expr:
2013 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002014 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002015 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002016 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002017 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002018 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002019 return;
2020 }
2021 n = CHILD(n, 0);
2022 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002023
Guido van Rossum50564e81996-01-12 01:13:16 +00002024 case power: /* atom trailer* ('**' power)* */
2025/* ('+'|'-'|'~') factor | atom trailer* */
2026 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002027 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002028 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002029 return;
2030 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002031 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002032 int i;
2033 com_node(c, CHILD(n, 0));
2034 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002035 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002036 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002037 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002038 return;
2039 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002040 com_apply_trailer(c, CHILD(n, i));
2041 } /* NB i is still alive */
2042 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002043 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002044 return;
2045 }
2046 n = CHILD(n, 0);
2047 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002048
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002049 case atom:
2050 switch (TYPE(CHILD(n, 0))) {
2051 case LPAR:
2052 n = CHILD(n, 1);
2053 if (TYPE(n) == RPAR) {
2054 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002055 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002056 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002057 return;
2058 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002059 if (assigning > OP_APPLY) {
2060 com_error(c, PyExc_SyntaxError,
2061 "augmented assign to tuple not possible");
2062 return;
2063 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002064 break;
2065 case LSQB:
2066 n = CHILD(n, 1);
2067 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002068 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002069 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002070 return;
2071 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002072 if (assigning > OP_APPLY) {
2073 com_error(c, PyExc_SyntaxError,
2074 "augmented assign to list not possible");
2075 return;
2076 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002077 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002078 return;
2079 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002080 if (assigning > OP_APPLY)
2081 com_augassign_name(c, CHILD(n, 0),
2082 assigning, augn);
2083 else
2084 com_assign_name(c, CHILD(n, 0),
2085 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002086 return;
2087 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002088 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002089 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002090 return;
2091 }
2092 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002093
2094 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002095 com_error(c, PyExc_SyntaxError,
2096 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002097 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002098
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002099 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002100 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002101 com_error(c, PyExc_SystemError,
2102 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002103 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002104
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002105 }
2106 }
2107}
Guido van Rossum7c531111997-03-11 18:42:21 +00002108
Thomas Wouters434d0822000-08-24 20:11:32 +00002109static void
2110com_augassign(struct compiling *c, node *n)
2111{
2112 int opcode;
2113
2114 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2115 case '+': opcode = INPLACE_ADD; break;
2116 case '-': opcode = INPLACE_SUBTRACT; break;
2117 case '/': opcode = INPLACE_DIVIDE; break;
2118 case '%': opcode = INPLACE_MODULO; break;
2119 case '<': opcode = INPLACE_LSHIFT; break;
2120 case '>': opcode = INPLACE_RSHIFT; break;
2121 case '&': opcode = INPLACE_AND; break;
2122 case '^': opcode = INPLACE_XOR; break;
2123 case '|': opcode = INPLACE_OR; break;
2124 case '*':
2125 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2126 opcode = INPLACE_POWER;
2127 else
2128 opcode = INPLACE_MULTIPLY;
2129 break;
2130 default:
2131 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2132 return;
2133 }
2134 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2135}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002136
2137static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002138com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002139{
Thomas Wouters434d0822000-08-24 20:11:32 +00002140 REQ(n, expr_stmt);
2141 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002142 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002143 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002144 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002145 if (NCH(n) == 1) {
2146 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002147 if (c->c_interactive)
2148 com_addbyte(c, PRINT_EXPR);
2149 else
2150 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002151 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002152 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002153 else if (TYPE(CHILD(n,1)) == augassign)
2154 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002155 else {
2156 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002157 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002158 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002159 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002160 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002161 com_push(c, 1);
2162 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002163 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002164 }
2165 }
2166}
2167
2168static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002169com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002170{
2171 int a = 0, b = 0;
2172 int i;
2173 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2174 /* Generate code like for
2175
2176 if __debug__:
2177 if not <test>:
2178 raise AssertionError [, <message>]
2179
2180 where <message> is the second test, if present.
2181 */
2182 if (Py_OptimizeFlag)
2183 return;
2184 com_addopnamestr(c, LOAD_GLOBAL, "__debug__");
2185 com_push(c, 1);
2186 com_addfwref(c, JUMP_IF_FALSE, &a);
2187 com_addbyte(c, POP_TOP);
2188 com_pop(c, 1);
2189 com_node(c, CHILD(n, 1));
2190 com_addfwref(c, JUMP_IF_TRUE, &b);
2191 com_addbyte(c, POP_TOP);
2192 com_pop(c, 1);
2193 /* Raise that exception! */
2194 com_addopnamestr(c, LOAD_GLOBAL, "AssertionError");
2195 com_push(c, 1);
2196 i = NCH(n)/2; /* Either 2 or 4 */
2197 if (i > 1)
2198 com_node(c, CHILD(n, 3));
2199 com_addoparg(c, RAISE_VARARGS, i);
2200 com_pop(c, i);
2201 /* The interpreter does not fall through */
2202 /* All jumps converge here */
2203 com_backpatch(c, a);
2204 com_backpatch(c, b);
2205 com_addbyte(c, POP_TOP);
2206}
2207
2208static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002209com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002210{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002211 int i = 1;
2212 node* stream = NULL;
2213
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002214 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002215
2216 /* are we using the extended print form? */
2217 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2218 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002219 com_node(c, stream);
2220 /* stack: [...] => [... stream] */
2221 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002222 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2223 i = 4;
2224 else
2225 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002226 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002227 for (; i < NCH(n); i += 2) {
2228 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002229 com_addbyte(c, DUP_TOP);
2230 /* stack: [stream] => [stream stream] */
2231 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002232 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002233 /* stack: [stream stream] => [stream stream obj] */
2234 com_addbyte(c, ROT_TWO);
2235 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002236 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002237 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002238 com_pop(c, 2);
2239 }
2240 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002241 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002242 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002243 com_addbyte(c, PRINT_ITEM);
2244 com_pop(c, 1);
2245 }
2246 }
2247 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002248 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002249 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002250 /* must pop the extra stream object off the stack */
2251 com_addbyte(c, POP_TOP);
2252 /* stack: [... stream] => [...] */
2253 com_pop(c, 1);
2254 }
2255 }
2256 else {
2257 if (stream != NULL) {
2258 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002259 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002260 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002261 com_pop(c, 1);
2262 }
2263 else
2264 com_addbyte(c, PRINT_NEWLINE);
2265 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002266}
2267
2268static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002269com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002270{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002271 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002272 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002273 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002274 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002275 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002276 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002277 com_push(c, 1);
2278 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002279 else
2280 com_node(c, CHILD(n, 1));
2281 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002282 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002283}
2284
2285static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002286com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002287{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002288 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002289 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2290 if (NCH(n) > 1) {
2291 com_node(c, CHILD(n, 1));
2292 if (NCH(n) > 3) {
2293 com_node(c, CHILD(n, 3));
2294 if (NCH(n) > 5)
2295 com_node(c, CHILD(n, 5));
2296 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002297 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002298 i = NCH(n)/2;
2299 com_addoparg(c, RAISE_VARARGS, i);
2300 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002301}
2302
2303static void
Thomas Wouters52152252000-08-17 22:55:00 +00002304com_from_import(struct compiling *c, node *n)
2305{
2306 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2307 com_push(c, 1);
2308 if (NCH(n) > 1) {
2309 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2310 com_error(c, PyExc_SyntaxError, "invalid syntax");
2311 return;
2312 }
2313 com_addopname(c, STORE_NAME, CHILD(n, 2));
2314 } else
2315 com_addopname(c, STORE_NAME, CHILD(n, 0));
2316 com_pop(c, 1);
2317}
2318
2319static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002320com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002321{
2322 int i;
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002323 PyObject *tup;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002324 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002325 /* 'import' dotted_name (',' dotted_name)* |
2326 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002327 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002328 /* 'from' dotted_name 'import' ... */
2329 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002330
2331 if (TYPE(CHILD(n, 3)) == STAR) {
2332 tup = Py_BuildValue("(s)", "*");
2333 } else {
2334 tup = PyTuple_New((NCH(n) - 2)/2);
2335 for (i = 3; i < NCH(n); i += 2) {
2336 PyTuple_SET_ITEM(tup, (i-3)/2,
2337 PyString_FromString(STR(
2338 CHILD(CHILD(n, i), 0))));
2339 }
2340 }
2341 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002342 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002343 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002344 if (TYPE(CHILD(n, 3)) == STAR)
2345 com_addbyte(c, IMPORT_STAR);
2346 else {
2347 for (i = 3; i < NCH(n); i += 2)
2348 com_from_import(c, CHILD(n, i));
2349 com_addbyte(c, POP_TOP);
2350 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002351 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002352 }
2353 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002354 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002355 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002356 node *subn = CHILD(n, i);
2357 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002358 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002359 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002360 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00002361 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00002362 int j;
2363 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00002364 com_error(c, PyExc_SyntaxError,
2365 "invalid syntax");
2366 return;
2367 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00002368 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
2369 com_addopname(c, LOAD_ATTR,
2370 CHILD(CHILD(subn, 0), j));
Thomas Wouters52152252000-08-17 22:55:00 +00002371 com_addopname(c, STORE_NAME, CHILD(subn, 2));
2372 } else
2373 com_addopname(c, STORE_NAME,
2374 CHILD(CHILD(subn, 0),0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002375 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002376 }
2377 }
2378}
2379
2380static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002381com_global_stmt(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002382{
2383 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002384 REQ(n, global_stmt);
2385 /* 'global' NAME (',' NAME)* */
2386 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002387 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002388#ifdef PRIVATE_NAME_MANGLING
2389 char buffer[256];
2390 if (s != NULL && s[0] == '_' && s[1] == '_' &&
2391 c->c_private != NULL &&
Guido van Rossum582acec2000-06-28 22:07:35 +00002392 com_mangle(c, s, buffer, sizeof(buffer)))
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002393 s = buffer;
2394#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +00002395 if (PyDict_GetItemString(c->c_locals, s) != NULL) {
2396 com_error(c, PyExc_SyntaxError,
2397 "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002398 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002399 else if (PyDict_SetItemString(c->c_globals, s, Py_None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002400 c->c_errors++;
2401 }
2402}
2403
Guido van Rossum681d79a1995-07-18 14:51:37 +00002404static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002405com_newlocal_o(struct compiling *c, PyObject *nameval)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002406{
2407 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002408 PyObject *ival;
2409 if (PyList_Size(c->c_varnames) != c->c_nlocals) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002410 /* This is usually caused by an error on a previous call */
2411 if (c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002412 com_error(c, PyExc_SystemError,
2413 "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002414 }
2415 return 0;
2416 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002417 ival = PyInt_FromLong(i = c->c_nlocals++);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002418 if (ival == NULL)
2419 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002420 else if (PyDict_SetItem(c->c_locals, nameval, ival) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002421 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002422 else if (PyList_Append(c->c_varnames, nameval) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002423 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002424 Py_XDECREF(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002425 return i;
2426}
2427
2428static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002429com_addlocal_o(struct compiling *c, PyObject *nameval)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002430{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002431 PyObject *ival = PyDict_GetItem(c->c_locals, nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002432 if (ival != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002433 return PyInt_AsLong(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002434 return com_newlocal_o(c, nameval);
2435}
2436
2437static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002438com_newlocal(struct compiling *c, char *name)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002439{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002440 PyObject *nameval = PyString_InternFromString(name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002441 int i;
2442 if (nameval == NULL) {
2443 c->c_errors++;
2444 return 0;
2445 }
2446 i = com_newlocal_o(c, nameval);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002447 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002448 return i;
2449}
2450
Guido van Rossumc5e96291991-12-10 13:53:51 +00002451static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002452com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002453{
2454 REQ(n, exec_stmt);
2455 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2456 com_node(c, CHILD(n, 1));
2457 if (NCH(n) >= 4)
2458 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002459 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002460 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002461 com_push(c, 1);
2462 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002463 if (NCH(n) >= 6)
2464 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002465 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002466 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002467 com_push(c, 1);
2468 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002469 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002470 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002471}
2472
Guido van Rossum7c531111997-03-11 18:42:21 +00002473static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002474is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002475{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002476 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002477 int i;
2478
2479 /* Label to avoid tail recursion */
2480 next:
2481 switch (TYPE(n)) {
2482
2483 case suite:
2484 if (NCH(n) == 1) {
2485 n = CHILD(n, 0);
2486 goto next;
2487 }
2488 /* Fall through */
2489 case file_input:
2490 for (i = 0; i < NCH(n); i++) {
2491 node *ch = CHILD(n, i);
2492 if (TYPE(ch) == stmt) {
2493 n = ch;
2494 goto next;
2495 }
2496 }
2497 break;
2498
2499 case stmt:
2500 case simple_stmt:
2501 case small_stmt:
2502 n = CHILD(n, 0);
2503 goto next;
2504
2505 case expr_stmt:
2506 case testlist:
2507 case test:
2508 case and_test:
2509 case not_test:
2510 case comparison:
2511 case expr:
2512 case xor_expr:
2513 case and_expr:
2514 case shift_expr:
2515 case arith_expr:
2516 case term:
2517 case factor:
2518 case power:
2519 case atom:
2520 if (NCH(n) == 1) {
2521 n = CHILD(n, 0);
2522 goto next;
2523 }
2524 break;
2525
2526 case NAME:
2527 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2528 return 1;
2529 break;
2530
2531 case NUMBER:
2532 v = parsenumber(c, STR(n));
2533 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002534 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002535 break;
2536 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002537 i = PyObject_IsTrue(v);
2538 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002539 return i == 0;
2540
2541 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002542 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002543 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002544 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002545 break;
2546 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002547 i = PyObject_IsTrue(v);
2548 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002549 return i == 0;
2550
2551 }
2552 return 0;
2553}
2554
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002555static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002556com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002557{
2558 int i;
2559 int anchor = 0;
2560 REQ(n, if_stmt);
2561 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2562 for (i = 0; i+3 < NCH(n); i+=4) {
2563 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002564 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002565 if (is_constant_false(c, ch))
2566 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002567 if (i > 0)
2568 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002569 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002570 com_addfwref(c, JUMP_IF_FALSE, &a);
2571 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002572 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002573 com_node(c, CHILD(n, i+3));
2574 com_addfwref(c, JUMP_FORWARD, &anchor);
2575 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002576 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002577 com_addbyte(c, POP_TOP);
2578 }
2579 if (i+2 < NCH(n))
2580 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002581 if (anchor)
2582 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002583}
2584
2585static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002586com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002587{
2588 int break_anchor = 0;
2589 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002590 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002591 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2592 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002593 block_push(c, SETUP_LOOP);
2594 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002595 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002596 com_node(c, CHILD(n, 1));
2597 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2598 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002599 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002600 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002601 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002602 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002603 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2604 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002605 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002606 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002607 com_addbyte(c, POP_TOP);
2608 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002609 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002610 if (NCH(n) > 4)
2611 com_node(c, CHILD(n, 6));
2612 com_backpatch(c, break_anchor);
2613}
2614
2615static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002616com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002617{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002618 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002619 int break_anchor = 0;
2620 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002621 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002622 REQ(n, for_stmt);
2623 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2624 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002625 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002626 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002627 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002628 if (v == NULL)
2629 c->c_errors++;
2630 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002631 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002632 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002633 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002634 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002635 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002636 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00002637 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002638 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002639 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002640 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002641 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2642 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002643 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002644 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002645 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002646 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002647 if (NCH(n) > 8)
2648 com_node(c, CHILD(n, 8));
2649 com_backpatch(c, break_anchor);
2650}
2651
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002652/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002653
2654 SETUP_FINALLY L
2655 <code for S>
2656 POP_BLOCK
2657 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002658 L: <code for Sf>
2659 END_FINALLY
2660
2661 The special instructions use the block stack. Each block
2662 stack entry contains the instruction that created it (here
2663 SETUP_FINALLY), the level of the value stack at the time the
2664 block stack entry was created, and a label (here L).
2665
2666 SETUP_FINALLY:
2667 Pushes the current value stack level and the label
2668 onto the block stack.
2669 POP_BLOCK:
2670 Pops en entry from the block stack, and pops the value
2671 stack until its level is the same as indicated on the
2672 block stack. (The label is ignored.)
2673 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002674 Pops a variable number of entries from the *value* stack
2675 and re-raises the exception they specify. The number of
2676 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002677
2678 The block stack is unwound when an exception is raised:
2679 when a SETUP_FINALLY entry is found, the exception is pushed
2680 onto the value stack (and the exception condition is cleared),
2681 and the interpreter jumps to the label gotten from the block
2682 stack.
2683
2684 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002685 (The contents of the value stack is shown in [], with the top
2686 at the right; 'tb' is trace-back info, 'val' the exception's
2687 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002688
2689 Value stack Label Instruction Argument
2690 [] SETUP_EXCEPT L1
2691 [] <code for S>
2692 [] POP_BLOCK
2693 [] JUMP_FORWARD L0
2694
Guido van Rossum3f5da241990-12-20 15:06:42 +00002695 [tb, val, exc] L1: DUP )
2696 [tb, val, exc, exc] <evaluate E1> )
2697 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2698 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2699 [tb, val, exc, 1] POP )
2700 [tb, val, exc] POP
2701 [tb, val] <assign to V1> (or POP if no V1)
2702 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002703 [] <code for S1>
2704 JUMP_FORWARD L0
2705
Guido van Rossum3f5da241990-12-20 15:06:42 +00002706 [tb, val, exc, 0] L2: POP
2707 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002708 .............................etc.......................
2709
Guido van Rossum3f5da241990-12-20 15:06:42 +00002710 [tb, val, exc, 0] Ln+1: POP
2711 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002712
2713 [] L0: <next statement>
2714
2715 Of course, parts are not generated if Vi or Ei is not present.
2716*/
2717
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002718static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002719com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002720{
2721 int except_anchor = 0;
2722 int end_anchor = 0;
2723 int else_anchor = 0;
2724 int i;
2725 node *ch;
2726
2727 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2728 block_push(c, SETUP_EXCEPT);
2729 com_node(c, CHILD(n, 2));
2730 com_addbyte(c, POP_BLOCK);
2731 block_pop(c, SETUP_EXCEPT);
2732 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2733 com_backpatch(c, except_anchor);
2734 for (i = 3;
2735 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2736 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002737 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002738 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002739 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002740 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002741 break;
2742 }
2743 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002744 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002745 com_addoparg(c, SET_LINENO, ch->n_lineno);
2746 if (NCH(ch) > 1) {
2747 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002748 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002749 com_node(c, CHILD(ch, 1));
2750 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002751 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002752 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2753 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002754 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002755 }
2756 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002757 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002758 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00002759 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002760 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002761 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002762 com_pop(c, 1);
2763 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002764 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002765 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002766 com_node(c, CHILD(n, i+2));
2767 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2768 if (except_anchor) {
2769 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002770 /* We come in with [tb, val, exc, 0] on the
2771 stack; one pop and it's the same as
2772 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002773 com_addbyte(c, POP_TOP);
2774 }
2775 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002776 /* We actually come in here with [tb, val, exc] but the
2777 END_FINALLY will zap those and jump around.
2778 The c_stacklevel does not reflect them so we need not pop
2779 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002780 com_addbyte(c, END_FINALLY);
2781 com_backpatch(c, else_anchor);
2782 if (i < NCH(n))
2783 com_node(c, CHILD(n, i+2));
2784 com_backpatch(c, end_anchor);
2785}
2786
2787static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002788com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002789{
2790 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002791 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002792
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002793 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2794 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002795 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002796 com_addbyte(c, POP_BLOCK);
2797 block_pop(c, SETUP_FINALLY);
2798 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002799 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002800 /* While the generated code pushes only one item,
2801 the try-finally handling can enter here with
2802 up to three items. OK, here are the details:
2803 3 for an exception, 2 for RETURN, 1 for BREAK. */
2804 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002805 com_backpatch(c, finally_anchor);
2806 ch = CHILD(n, NCH(n)-1);
2807 com_addoparg(c, SET_LINENO, ch->n_lineno);
2808 com_node(c, ch);
2809 com_addbyte(c, END_FINALLY);
2810 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002811 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002812}
2813
2814static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002815com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002816{
2817 REQ(n, try_stmt);
2818 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2819 | 'try' ':' suite 'finally' ':' suite */
2820 if (TYPE(CHILD(n, 3)) != except_clause)
2821 com_try_finally(c, n);
2822 else
2823 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002824}
2825
Guido van Rossum8b993a91997-01-17 21:04:03 +00002826static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002827get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002828{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002829 int i;
2830
Guido van Rossum8b993a91997-01-17 21:04:03 +00002831 /* Label to avoid tail recursion */
2832 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002833 switch (TYPE(n)) {
2834
2835 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002836 if (NCH(n) == 1) {
2837 n = CHILD(n, 0);
2838 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002839 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002840 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002841 case file_input:
2842 for (i = 0; i < NCH(n); i++) {
2843 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002844 if (TYPE(ch) == stmt) {
2845 n = ch;
2846 goto next;
2847 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002848 }
2849 break;
2850
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002851 case stmt:
2852 case simple_stmt:
2853 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002854 n = CHILD(n, 0);
2855 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002856
2857 case expr_stmt:
2858 case testlist:
2859 case test:
2860 case and_test:
2861 case not_test:
2862 case comparison:
2863 case expr:
2864 case xor_expr:
2865 case and_expr:
2866 case shift_expr:
2867 case arith_expr:
2868 case term:
2869 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002870 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002871 if (NCH(n) == 1) {
2872 n = CHILD(n, 0);
2873 goto next;
2874 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002875 break;
2876
2877 case atom:
2878 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002879 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002880 break;
2881
2882 }
2883 return NULL;
2884}
2885
Guido van Rossum79f25d91997-04-29 20:08:16 +00002886static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002887get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002888{
Guido van Rossum541563e1999-01-28 15:08:09 +00002889 /* Don't generate doc-strings if run with -OO */
2890 if (Py_OptimizeFlag > 1)
2891 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002892 n = get_rawdocstring(n);
2893 if (n == NULL)
2894 return NULL;
2895 return parsestrplus(n);
2896}
2897
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002898static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002899com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002900{
2901 REQ(n, suite);
2902 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2903 if (NCH(n) == 1) {
2904 com_node(c, CHILD(n, 0));
2905 }
2906 else {
2907 int i;
2908 for (i = 0; i < NCH(n); i++) {
2909 node *ch = CHILD(n, i);
2910 if (TYPE(ch) == stmt)
2911 com_node(c, ch);
2912 }
2913 }
2914}
2915
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002916/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002917static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002918com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002919{
2920 int i = c->c_nblocks;
2921 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2922 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2923 }
2924 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002925 com_error(c, PyExc_SyntaxError,
2926 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002927 }
2928 /* XXX Could allow it inside a 'finally' clause
2929 XXX if we could pop the exception still on the stack */
2930}
2931
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002932static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002933com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002934{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002935 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002936 if (TYPE(n) == lambdef) {
2937 /* lambdef: 'lambda' [varargslist] ':' test */
2938 n = CHILD(n, 1);
2939 }
2940 else {
2941 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2942 n = CHILD(n, 2);
2943 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2944 n = CHILD(n, 1);
2945 }
2946 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002947 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002948 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002949 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002950 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2951 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002952 nargs = 0;
2953 ndefs = 0;
2954 for (i = 0; i < nch; i++) {
2955 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002956 if (TYPE(CHILD(n, i)) == STAR ||
2957 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002958 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002959 nargs++;
2960 i++;
2961 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002962 t = RPAR; /* Anything except EQUAL or COMMA */
2963 else
2964 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002965 if (t == EQUAL) {
2966 i++;
2967 ndefs++;
2968 com_node(c, CHILD(n, i));
2969 i++;
2970 if (i >= nch)
2971 break;
2972 t = TYPE(CHILD(n, i));
2973 }
2974 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00002975 /* Treat "(a=1, b)" as an error */
2976 if (ndefs)
2977 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00002978 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002979 }
2980 if (t != COMMA)
2981 break;
2982 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002983 return ndefs;
2984}
2985
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002986static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002987com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002988{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002989 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002990 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002991 v = (PyObject *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002992 if (v == NULL)
2993 c->c_errors++;
2994 else {
2995 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002996 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002997 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002998 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002999 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003000 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003001 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003002 com_pop(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003003 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003004 }
3005}
3006
3007static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003008com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003009{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003010 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003011 REQ(n, testlist);
3012 /* testlist: test (',' test)* [','] */
3013 for (i = 0; i < NCH(n); i += 2)
3014 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003015 i = (NCH(n)+1) / 2;
3016 com_addoparg(c, BUILD_TUPLE, i);
3017 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003018}
3019
3020static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003021com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003022{
Guido van Rossum25831651993-05-19 14:50:45 +00003023 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003024 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003025 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003026 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003027 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003028 c->c_errors++;
3029 return;
3030 }
3031 /* Push the class name on the stack */
3032 i = com_addconst(c, v);
3033 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003034 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003035 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003036 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003037 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003038 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003039 com_push(c, 1);
3040 }
Guido van Rossum25831651993-05-19 14:50:45 +00003041 else
3042 com_bases(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00003043 v = (PyObject *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003044 if (v == NULL)
3045 c->c_errors++;
3046 else {
Guido van Rossum25831651993-05-19 14:50:45 +00003047 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003048 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003049 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003050 com_addoparg(c, MAKE_FUNCTION, 0);
3051 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003052 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003053 com_pop(c, 2);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003054 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum79f25d91997-04-29 20:08:16 +00003055 Py_DECREF(v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003056 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003057}
3058
3059static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003060com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003061{
3062 switch (TYPE(n)) {
3063
3064 /* Definition nodes */
3065
3066 case funcdef:
3067 com_funcdef(c, n);
3068 break;
3069 case classdef:
3070 com_classdef(c, n);
3071 break;
3072
3073 /* Trivial parse tree nodes */
3074
3075 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003076 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003077 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003078 com_node(c, CHILD(n, 0));
3079 break;
3080
3081 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003082 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3083 com_addoparg(c, SET_LINENO, n->n_lineno);
3084 {
3085 int i;
3086 for (i = 0; i < NCH(n)-1; i += 2)
3087 com_node(c, CHILD(n, i));
3088 }
3089 break;
3090
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003091 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003092 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003093 com_node(c, CHILD(n, 0));
3094 break;
3095
3096 /* Statement nodes */
3097
3098 case expr_stmt:
3099 com_expr_stmt(c, n);
3100 break;
3101 case print_stmt:
3102 com_print_stmt(c, n);
3103 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003104 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003105 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003106 break;
3107 case pass_stmt:
3108 break;
3109 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003110 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003111 com_error(c, PyExc_SyntaxError,
3112 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003113 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003114 com_addbyte(c, BREAK_LOOP);
3115 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003116 case continue_stmt:
3117 com_continue_stmt(c, n);
3118 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003119 case return_stmt:
3120 com_return_stmt(c, n);
3121 break;
3122 case raise_stmt:
3123 com_raise_stmt(c, n);
3124 break;
3125 case import_stmt:
3126 com_import_stmt(c, n);
3127 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003128 case global_stmt:
3129 com_global_stmt(c, n);
3130 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003131 case exec_stmt:
3132 com_exec_stmt(c, n);
3133 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003134 case assert_stmt:
3135 com_assert_stmt(c, n);
3136 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003137 case if_stmt:
3138 com_if_stmt(c, n);
3139 break;
3140 case while_stmt:
3141 com_while_stmt(c, n);
3142 break;
3143 case for_stmt:
3144 com_for_stmt(c, n);
3145 break;
3146 case try_stmt:
3147 com_try_stmt(c, n);
3148 break;
3149 case suite:
3150 com_suite(c, n);
3151 break;
3152
3153 /* Expression nodes */
3154
3155 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003156 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003157 break;
3158 case test:
3159 com_test(c, n);
3160 break;
3161 case and_test:
3162 com_and_test(c, n);
3163 break;
3164 case not_test:
3165 com_not_test(c, n);
3166 break;
3167 case comparison:
3168 com_comparison(c, n);
3169 break;
3170 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003171 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003172 break;
3173 case expr:
3174 com_expr(c, n);
3175 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003176 case xor_expr:
3177 com_xor_expr(c, n);
3178 break;
3179 case and_expr:
3180 com_and_expr(c, n);
3181 break;
3182 case shift_expr:
3183 com_shift_expr(c, n);
3184 break;
3185 case arith_expr:
3186 com_arith_expr(c, n);
3187 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003188 case term:
3189 com_term(c, n);
3190 break;
3191 case factor:
3192 com_factor(c, n);
3193 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003194 case power:
3195 com_power(c, n);
3196 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003197 case atom:
3198 com_atom(c, n);
3199 break;
3200
3201 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003202 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003203 com_error(c, PyExc_SystemError,
3204 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003205 }
3206}
3207
Tim Petersdbd9ba62000-07-09 03:09:57 +00003208static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003209
3210static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003211com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003212{
3213 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3214 if (TYPE(CHILD(n, 0)) == LPAR)
3215 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003216 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003217 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003218 com_pop(c, 1);
3219 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003220}
3221
3222static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003223com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003224{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003225 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003226 if (NCH(n) == 1) {
3227 com_fpdef(c, CHILD(n, 0));
3228 }
3229 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003230 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003231 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003232 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003233 for (i = 0; i < NCH(n); i += 2)
3234 com_fpdef(c, CHILD(n, i));
3235 }
3236}
3237
3238static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003239com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003240{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003241 int nch, i;
3242 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003243 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003244 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003245 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003246 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003247 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003248 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003249 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003250 node *ch = CHILD(n, i);
3251 node *fp;
3252 char *name;
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003253 PyObject *nameval;
Guido van Rossum50564e81996-01-12 01:13:16 +00003254 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003255 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003256 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3257 fp = CHILD(ch, 0);
3258 if (TYPE(fp) == NAME)
3259 name = STR(fp);
3260 else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003261 name = nbuf;
3262 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003263 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003264 }
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003265 nameval = PyString_InternFromString(name);
3266 if (nameval == NULL) {
3267 c->c_errors++;
3268 }
Peter Schneider-Kamp9a5086c2000-07-13 06:24:29 +00003269 if (PyDict_GetItem(c->c_locals, nameval)) {
Fred Drakedcf08e02000-08-15 15:49:44 +00003270 com_error(c, PyExc_SyntaxError,
3271 "duplicate argument in function definition");
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003272 }
3273 com_newlocal_o(c, nameval);
3274 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003275 c->c_argcount++;
3276 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003277 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003278 ch = CHILD(n, i);
3279 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003280 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003281 else
3282 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003283 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003284 /* Handle *arguments */
3285 if (i < nch) {
3286 node *ch;
3287 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003288 if (TYPE(ch) != DOUBLESTAR) {
3289 REQ(ch, STAR);
3290 ch = CHILD(n, i+1);
3291 if (TYPE(ch) == NAME) {
3292 c->c_flags |= CO_VARARGS;
3293 i += 3;
3294 com_newlocal(c, STR(ch));
3295 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003296 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003297 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003298 /* Handle **keywords */
3299 if (i < nch) {
3300 node *ch;
3301 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003302 if (TYPE(ch) != DOUBLESTAR) {
3303 REQ(ch, STAR);
3304 ch = CHILD(n, i+1);
3305 REQ(ch, STAR);
3306 ch = CHILD(n, i+2);
3307 }
3308 else
3309 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003310 REQ(ch, NAME);
3311 c->c_flags |= CO_VARKEYWORDS;
3312 com_newlocal(c, STR(ch));
3313 }
3314 if (complex) {
3315 /* Generate code for complex arguments only after
3316 having counted the simple arguments */
3317 int ilocal = 0;
3318 for (i = 0; i < nch; i++) {
3319 node *ch = CHILD(n, i);
3320 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003321 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003322 break;
3323 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3324 fp = CHILD(ch, 0);
3325 if (TYPE(fp) != NAME) {
3326 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003327 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003328 com_fpdef(c, ch);
3329 }
3330 ilocal++;
3331 if (++i >= nch)
3332 break;
3333 ch = CHILD(n, i);
3334 if (TYPE(ch) == EQUAL)
3335 i += 2;
3336 else
3337 REQ(ch, COMMA);
3338 }
3339 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003340}
3341
3342static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003343com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003344{
3345 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003346 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003347 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003348 doc = get_docstring(n);
3349 if (doc != NULL) {
3350 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003351 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003352 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003353 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003354 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003355 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003356 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003357 for (i = 0; i < NCH(n); i++) {
3358 node *ch = CHILD(n, i);
3359 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3360 com_node(c, ch);
3361 }
3362}
3363
3364/* Top-level compile-node interface */
3365
3366static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003367compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003368{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003369 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003370 node *ch;
3371 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003372 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003373 doc = get_docstring(CHILD(n, 4));
3374 if (doc != NULL) {
3375 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003376 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003377 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003378 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003379 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003380 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3381 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003382 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003383 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003384 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003385 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003386 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003387 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003388 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003389 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003390 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003391}
3392
3393static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003394compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003395{
Guido van Rossum590baa41993-11-30 13:40:46 +00003396 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003397 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003398 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003399
3400 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003401 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003402 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003403 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003404 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003405 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003406 else
3407 ch = CHILD(n, 2);
3408 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003409 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003410 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003411}
3412
3413static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003414compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003415{
3416 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003417 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003418 REQ(n, classdef);
3419 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3420 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003421#ifdef PRIVATE_NAME_MANGLING
3422 c->c_private = c->c_name;
3423#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003424 ch = CHILD(n, NCH(n)-1); /* The suite */
3425 doc = get_docstring(ch);
3426 if (doc != NULL) {
3427 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003428 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003429 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003430 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003431 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003432 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003433 }
3434 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003435 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003436 com_node(c, ch);
3437 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003438 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003439 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003440 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003441}
3442
3443static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003444compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003445{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003446 com_addoparg(c, SET_LINENO, n->n_lineno);
3447
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003448 switch (TYPE(n)) {
3449
Guido van Rossum4c417781991-01-21 16:09:22 +00003450 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003451 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003452 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003453 n = CHILD(n, 0);
3454 if (TYPE(n) != NEWLINE)
3455 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003456 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003457 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003458 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003459 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003460 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003461 break;
3462
Guido van Rossum4c417781991-01-21 16:09:22 +00003463 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003464 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003465 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003466 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003467 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003468 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003469 break;
3470
Guido van Rossum590baa41993-11-30 13:40:46 +00003471 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003472 com_node(c, CHILD(n, 0));
3473 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003474 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003475 break;
3476
Guido van Rossum590baa41993-11-30 13:40:46 +00003477 case lambdef: /* anonymous function definition */
3478 compile_lambdef(c, n);
3479 break;
3480
Guido van Rossum4c417781991-01-21 16:09:22 +00003481 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003482 compile_funcdef(c, n);
3483 break;
3484
Guido van Rossum4c417781991-01-21 16:09:22 +00003485 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003486 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003487 break;
3488
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003489 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003490 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003491 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003492 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003493 }
3494}
3495
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003496/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00003497
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003498 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
3499 instructions that refer to local variables with LOAD_FAST etc.
3500 The latter instructions are much faster because they don't need to
3501 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003502
Guido van Rossum681d79a1995-07-18 14:51:37 +00003503 To find all local variables, we check all STORE_NAME, IMPORT_FROM
3504 and DELETE_NAME instructions. This yields all local variables,
3505 function definitions, class definitions and import statements.
3506 Argument names have already been entered into the list by the
3507 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003508
3509 All remaining LOAD_NAME instructions must refer to non-local (global
3510 or builtin) variables, so are replaced by LOAD_GLOBAL.
3511
3512 There are two problems: 'from foo import *' and 'exec' may introduce
3513 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00003514 case, we can still optimize bona fide locals (since those
3515 statements will be surrounded by fast_2_locals() and
3516 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003517
Guido van Rossum681d79a1995-07-18 14:51:37 +00003518 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00003519
3520static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003521optimize(struct compiling *c)
Guido van Rossum282914b1991-04-04 10:42:56 +00003522{
Guido van Rossum0a697f61991-04-16 08:39:12 +00003523 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00003524 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00003525 int oparg = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003526 PyObject *name;
3527 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003528
Guido van Rossum282914b1991-04-04 10:42:56 +00003529#define NEXTOP() (*next_instr++)
3530#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossum79f25d91997-04-29 20:08:16 +00003531#define GETITEM(v, i) (PyList_GetItem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003532#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
3533
Guido van Rossum79f25d91997-04-29 20:08:16 +00003534 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003535
3536 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00003537
Guido van Rossum79f25d91997-04-29 20:08:16 +00003538 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003539 for (;;) {
3540 opcode = NEXTOP();
3541 if (opcode == STOP_CODE)
3542 break;
3543 if (HAS_ARG(opcode))
3544 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +00003545 dispatch_opcode1:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003546 switch (opcode) {
3547 case STORE_NAME:
3548 case DELETE_NAME:
3549 case IMPORT_FROM:
3550 com_addlocal_o(c, GETNAMEOBJ(oparg));
3551 break;
Thomas Wouters52152252000-08-17 22:55:00 +00003552 case IMPORT_STAR:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003553 case EXEC_STMT:
3554 c->c_flags &= ~CO_OPTIMIZED;
3555 break;
Fred Drakeef8ace32000-08-24 00:32:09 +00003556 case EXTENDED_ARG:
3557 opcode = NEXTOP();
3558 oparg = oparg<<16 | NEXTARG();
3559 goto dispatch_opcode1;
3560 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00003561 }
3562 }
3563
Thomas Wouters52152252000-08-17 22:55:00 +00003564 /* TBD: Is this still necessary ? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003565 if (PyDict_GetItemString(c->c_locals, "*") != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003566 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003567
Guido van Rossum79f25d91997-04-29 20:08:16 +00003568 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003569 for (;;) {
3570 cur_instr = next_instr;
3571 opcode = NEXTOP();
3572 if (opcode == STOP_CODE)
3573 break;
3574 if (HAS_ARG(opcode))
3575 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +00003576 dispatch_opcode2:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003577 if (opcode == LOAD_NAME ||
3578 opcode == STORE_NAME ||
3579 opcode == DELETE_NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003580 PyObject *v;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003581 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00003582 name = GETNAMEOBJ(oparg);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003583 v = PyDict_GetItem(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003584 if (v == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003585 if (opcode == LOAD_NAME &&
3586 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003587 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003588 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00003589 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003590 i = PyInt_AsLong(v);
Fred Drakeef8ace32000-08-24 00:32:09 +00003591 if (i >> 16) /* too big for 2 bytes */
3592 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003593 switch (opcode) {
3594 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
3595 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
3596 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
3597 }
3598 cur_instr[1] = i & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +00003599 cur_instr[2] = i >> 8;
3600 }
3601 if (opcode == EXTENDED_ARG) {
3602 opcode = NEXTOP();
3603 oparg = oparg<<16 | NEXTARG();
3604 goto dispatch_opcode2;
Guido van Rossum282914b1991-04-04 10:42:56 +00003605 }
3606 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003607
Guido van Rossum681d79a1995-07-18 14:51:37 +00003608 if (c->c_errors == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00003609 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00003610}
3611
Guido van Rossum79f25d91997-04-29 20:08:16 +00003612PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003613PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003614{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003615 return jcompile(n, filename, NULL);
3616}
3617
Guido van Rossum79f25d91997-04-29 20:08:16 +00003618static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003619icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003620{
3621 return jcompile(n, base->c_filename, base);
3622}
3623
Guido van Rossum79f25d91997-04-29 20:08:16 +00003624static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003625jcompile(node *n, char *filename, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003626{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003627 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003628 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003629 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003630 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003631#ifdef PRIVATE_NAME_MANGLING
3632 if (base)
3633 sc.c_private = base->c_private;
3634 else
3635 sc.c_private = NULL;
3636#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003637 compile_node(&sc, n);
3638 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003639 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003640 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003641 sc.c_flags |= CO_NEWLOCALS;
3642 }
3643 else if (TYPE(n) == classdef)
3644 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00003645 co = NULL;
3646 if (sc.c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003647 PyObject *consts, *names, *varnames, *filename, *name;
3648 consts = PyList_AsTuple(sc.c_consts);
3649 names = PyList_AsTuple(sc.c_names);
3650 varnames = PyList_AsTuple(sc.c_varnames);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003651 filename = PyString_InternFromString(sc.c_filename);
3652 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003653 if (!PyErr_Occurred())
3654 co = PyCode_New(sc.c_argcount,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003655 sc.c_nlocals,
Guido van Rossum8b993a91997-01-17 21:04:03 +00003656 sc.c_maxstacklevel,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003657 sc.c_flags,
3658 sc.c_code,
3659 consts,
3660 names,
3661 varnames,
3662 filename,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003663 name,
3664 sc.c_firstlineno,
3665 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003666 Py_XDECREF(consts);
3667 Py_XDECREF(names);
3668 Py_XDECREF(varnames);
3669 Py_XDECREF(filename);
3670 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003671 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003672 else if (!PyErr_Occurred()) {
3673 /* This could happen if someone called PyErr_Clear() after an
3674 error was reported above. That's not supposed to happen,
3675 but I just plugged one case and I'm not sure there can't be
3676 others. In that case, raise SystemError so that at least
3677 it gets reported instead dumping core. */
3678 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3679 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003680 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003681 return co;
3682}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003683
3684int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003685PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003686{
3687 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003688 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003689 int line = co->co_firstlineno;
3690 int addr = 0;
3691 while (--size >= 0) {
3692 addr += *p++;
3693 if (addr > addrq)
3694 break;
3695 line += *p++;
3696 }
3697 return line;
3698}