blob: 155761fd0f32d3889b43043107e8b520dcea6b89 [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 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +0000876 if (rawmode || strchr(s, '\\') == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000877 return PyString_FromStringAndSize(s, len);
878 v = PyString_FromStringAndSize((char *)NULL, len);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +0000879 if (v == NULL)
880 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000881 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000882 end = s + len;
883 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000884 if (*s != '\\') {
885 *p++ = *s++;
886 continue;
887 }
888 s++;
889 switch (*s++) {
890 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000891 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000892 case '\\': *p++ = '\\'; break;
893 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000894 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000895 case 'b': *p++ = '\b'; break;
896 case 'f': *p++ = '\014'; break; /* FF */
897 case 't': *p++ = '\t'; break;
898 case 'n': *p++ = '\n'; break;
899 case 'r': *p++ = '\r'; break;
900 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000901 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
902 case '0': case '1': case '2': case '3':
903 case '4': case '5': case '6': case '7':
904 c = s[-1] - '0';
905 if ('0' <= *s && *s <= '7') {
906 c = (c<<3) + *s++ - '0';
907 if ('0' <= *s && *s <= '7')
908 c = (c<<3) + *s++ - '0';
909 }
910 *p++ = c;
911 break;
912 case 'x':
Fredrik Lundh1fa0b892000-09-02 20:11:27 +0000913 if (isxdigit(Py_CHARMASK(s[0])) && isxdigit(Py_CHARMASK(s[1]))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000914 unsigned int x = 0;
Fredrik Lundh1fa0b892000-09-02 20:11:27 +0000915 c = Py_CHARMASK(*s);
916 s++;
917 if (isdigit(c))
918 x = c - '0';
919 else if (islower(c))
920 x = 10 + c - 'a';
921 else
922 x = 10 + c - 'A';
923 x = x << 4;
924 c = Py_CHARMASK(*s);
925 s++;
926 if (isdigit(c))
927 x += c - '0';
928 else if (islower(c))
929 x += 10 + c - 'a';
930 else
931 x += 10 + c - 'A';
Guido van Rossumed1100f1997-10-20 23:24:07 +0000932 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000933 break;
934 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +0000935 PyErr_SetString(PyExc_ValueError, "invalid \\x escape");
936 Py_DECREF(v);
937 return NULL;
938 default:
939 *p++ = '\\';
940 *p++ = s[-1];
941 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000942 }
943 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000944 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000945 return v;
946}
947
Guido van Rossum79f25d91997-04-29 20:08:16 +0000948static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000949parsestrplus(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000950{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000951 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000952 int i;
953 REQ(CHILD(n, 0), STRING);
954 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
955 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +0000956 for (i = 1; i < NCH(n); i++) {
957 PyObject *s;
958 s = parsestr(STR(CHILD(n, i)));
959 if (s == NULL)
960 goto onError;
961 if (PyString_Check(v) && PyString_Check(s)) {
962 PyString_ConcatAndDel(&v, s);
963 if (v == NULL)
964 goto onError;
965 }
966 else {
967 PyObject *temp;
968 temp = PyUnicode_Concat(v, s);
969 Py_DECREF(s);
970 if (temp == NULL)
971 goto onError;
972 Py_DECREF(v);
973 v = temp;
974 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000975 }
976 }
977 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +0000978
979 onError:
980 Py_XDECREF(v);
981 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000982}
983
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000984static void
Skip Montanaro803d6e52000-08-12 18:09:51 +0000985com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000986{
Skip Montanaro803d6e52000-08-12 18:09:51 +0000987 PyObject *v;
988 int anchor = 0;
989 int save_begin = c->c_begin;
990
991 /* list_iter: for v in expr [list_iter] */
992 com_node(c, CHILD(n, 3)); /* expr */
993 v = PyInt_FromLong(0L);
994 if (v == NULL)
995 c->c_errors++;
996 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
997 com_push(c, 1);
998 Py_XDECREF(v);
999 c->c_begin = c->c_nexti;
1000 com_addoparg(c, SET_LINENO, n->n_lineno);
1001 com_addfwref(c, FOR_LOOP, &anchor);
1002 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001003 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001004 c->c_loops++;
1005 com_list_iter(c, n, e, t);
1006 c->c_loops--;
1007 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1008 c->c_begin = save_begin;
1009 com_backpatch(c, anchor);
1010 com_pop(c, 2); /* FOR_LOOP has popped these */
1011}
1012
1013static void
1014com_list_if(struct compiling *c, node *n, node *e, char *t)
1015{
1016 int anchor = 0;
1017 int a = 0;
1018 /* list_iter: 'if' test [list_iter] */
1019 com_addoparg(c, SET_LINENO, n->n_lineno);
1020 com_node(c, CHILD(n, 1));
1021 com_addfwref(c, JUMP_IF_FALSE, &a);
1022 com_addbyte(c, POP_TOP);
1023 com_pop(c, 1);
1024 com_list_iter(c, n, e, t);
1025 com_addfwref(c, JUMP_FORWARD, &anchor);
1026 com_backpatch(c, a);
1027 /* We jump here with an extra entry which we now pop */
1028 com_addbyte(c, POP_TOP);
1029 com_backpatch(c, anchor);
1030}
1031
1032static void
1033com_list_iter(struct compiling *c,
1034 node *p, /* parent of list_iter node */
1035 node *e, /* element expression node */
1036 char *t /* name of result list temp local */)
1037{
1038 /* list_iter is the last child in a listmaker, list_for, or list_if */
1039 node *n = CHILD(p, NCH(p)-1);
1040 if (TYPE(n) == list_iter) {
1041 n = CHILD(n, 0);
1042 switch (TYPE(n)) {
1043 case list_for:
1044 com_list_for(c, n, e, t);
1045 break;
1046 case list_if:
1047 com_list_if(c, n, e, t);
1048 break;
1049 default:
1050 com_error(c, PyExc_SystemError,
1051 "invalid list_iter node type");
1052 }
1053 }
1054 else {
1055 com_addopnamestr(c, LOAD_NAME, t);
1056 com_push(c, 1);
1057 com_node(c, e);
1058 com_addoparg(c, CALL_FUNCTION, 1);
1059 com_addbyte(c, POP_TOP);
1060 com_pop(c, 2);
1061 }
1062}
1063
1064static void
1065com_list_comprehension(struct compiling *c, node *n)
1066{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001067 /* listmaker: test list_for */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001068 char tmpname[12];
1069 sprintf(tmpname, "__%d__", ++c->c_tmpname);
1070 com_addoparg(c, BUILD_LIST, 0);
1071 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1072 com_push(c, 2);
1073 com_addopnamestr(c, LOAD_ATTR, "append");
1074 com_addopnamestr(c, STORE_NAME, tmpname);
1075 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001076 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001077 com_addopnamestr(c, DELETE_NAME, tmpname);
1078 --c->c_tmpname;
1079}
1080
1081static void
1082com_listmaker(struct compiling *c, node *n)
1083{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001084 /* listmaker: test ( list_for | (',' test)* [','] ) */
1085 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001086 com_list_comprehension(c, n);
1087 else {
1088 int len = 0;
1089 int i;
1090 for (i = 0; i < NCH(n); i += 2, len++)
1091 com_node(c, CHILD(n, i));
1092 com_addoparg(c, BUILD_LIST, len);
1093 com_pop(c, len-1);
1094 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001095}
1096
1097static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001098com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001099{
1100 int i;
1101 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1102 for (i = 0; i+2 < NCH(n); i += 4) {
1103 /* We must arrange things just right for STORE_SUBSCR.
1104 It wants the stack to look like (value) (dict) (key) */
1105 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001106 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001107 com_node(c, CHILD(n, i+2)); /* value */
1108 com_addbyte(c, ROT_TWO);
1109 com_node(c, CHILD(n, i)); /* key */
1110 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001111 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001112 }
1113}
1114
1115static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001116com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001117{
1118 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001119 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001120 int i;
1121 REQ(n, atom);
1122 ch = CHILD(n, 0);
1123 switch (TYPE(ch)) {
1124 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001125 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001126 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001127 com_push(c, 1);
1128 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001129 else
1130 com_node(c, CHILD(n, 1));
1131 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001132 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001133 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001134 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001135 com_push(c, 1);
1136 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001137 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001138 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001139 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001140 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001141 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001142 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001143 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001144 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001145 break;
1146 case BACKQUOTE:
1147 com_node(c, CHILD(n, 1));
1148 com_addbyte(c, UNARY_CONVERT);
1149 break;
1150 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001151 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001152 i = 255;
1153 }
1154 else {
1155 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001156 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001157 }
1158 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001159 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001160 break;
1161 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001162 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001163 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001164 c->c_errors++;
1165 i = 255;
1166 }
1167 else {
1168 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001169 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001170 }
1171 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001172 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001173 break;
1174 case NAME:
1175 com_addopname(c, LOAD_NAME, ch);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001176 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001177 break;
1178 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001179 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001180 com_error(c, PyExc_SystemError,
1181 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001182 }
1183}
1184
1185static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001186com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001187{
1188 if (NCH(n) == 1) {
1189 com_addbyte(c, op);
1190 }
1191 else if (NCH(n) == 2) {
1192 if (TYPE(CHILD(n, 0)) != COLON) {
1193 com_node(c, CHILD(n, 0));
1194 com_addbyte(c, op+1);
1195 }
1196 else {
1197 com_node(c, CHILD(n, 1));
1198 com_addbyte(c, op+2);
1199 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001200 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001201 }
1202 else {
1203 com_node(c, CHILD(n, 0));
1204 com_node(c, CHILD(n, 2));
1205 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001206 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001207 }
1208}
1209
Guido van Rossum635abd21997-01-06 22:56:52 +00001210static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001211com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1212{
1213 if (NCH(n) == 1) {
1214 com_addbyte(c, DUP_TOP);
1215 com_push(c, 1);
1216 com_addbyte(c, SLICE);
1217 com_node(c, augn);
1218 com_addbyte(c, opcode);
1219 com_pop(c, 1);
1220 com_addbyte(c, ROT_TWO);
1221 com_addbyte(c, STORE_SLICE);
1222 com_pop(c, 2);
1223 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1224 com_node(c, CHILD(n, 0));
1225 com_addoparg(c, DUP_TOPX, 2);
1226 com_push(c, 2);
1227 com_addbyte(c, SLICE+1);
1228 com_pop(c, 1);
1229 com_node(c, augn);
1230 com_addbyte(c, opcode);
1231 com_pop(c, 1);
1232 com_addbyte(c, ROT_THREE);
1233 com_addbyte(c, STORE_SLICE+1);
1234 com_pop(c, 3);
1235 } else if (NCH(n) == 2) {
1236 com_node(c, CHILD(n, 1));
1237 com_addoparg(c, DUP_TOPX, 2);
1238 com_push(c, 2);
1239 com_addbyte(c, SLICE+2);
1240 com_pop(c, 1);
1241 com_node(c, augn);
1242 com_addbyte(c, opcode);
1243 com_pop(c, 1);
1244 com_addbyte(c, ROT_THREE);
1245 com_addbyte(c, STORE_SLICE+2);
1246 com_pop(c, 3);
1247 } else {
1248 com_node(c, CHILD(n, 0));
1249 com_node(c, CHILD(n, 2));
1250 com_addoparg(c, DUP_TOPX, 3);
1251 com_push(c, 3);
1252 com_addbyte(c, SLICE+3);
1253 com_pop(c, 2);
1254 com_node(c, augn);
1255 com_addbyte(c, opcode);
1256 com_pop(c, 1);
1257 com_addbyte(c, ROT_FOUR);
1258 com_addbyte(c, STORE_SLICE+3);
1259 com_pop(c, 4);
1260 }
1261}
1262
1263static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001264com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001265{
1266 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001267 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001268 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001269 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001270 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001271 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001272 }
1273 else {
1274 com_node(c, CHILD(n, 0));
1275 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001276 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001277 }
1278 m = n;
1279 do {
1280 m = CHILD(m, 0);
1281 } while (NCH(m) == 1);
1282 if (TYPE(m) != NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001283 com_error(c, PyExc_SyntaxError,
1284 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001285 }
1286 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001287 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001288 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001289 *pkeywords = PyDict_New();
Guido van Rossum635abd21997-01-06 22:56:52 +00001290 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001291 c->c_errors++;
1292 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001293 if (PyDict_GetItem(*pkeywords, v) != NULL)
1294 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001295 "duplicate keyword argument");
1296 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001297 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001298 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001299 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001300 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001301 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001302 }
1303 }
1304 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001305}
1306
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001307static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001308com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001309{
1310 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001311 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001312 }
1313 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001314 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001315 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001316 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001317 int star_flag = 0;
1318 int starstar_flag = 0;
1319 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001320 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001321 na = 0;
1322 nk = 0;
1323 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001324 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001325 if (TYPE(ch) == STAR ||
1326 TYPE(ch) == DOUBLESTAR)
1327 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001328 if (ch->n_lineno != lineno) {
1329 lineno = ch->n_lineno;
1330 com_addoparg(c, SET_LINENO, lineno);
1331 }
1332 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001333 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001334 na++;
1335 else
1336 nk++;
1337 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001338 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001339 while (i < NCH(n)) {
1340 node *tok = CHILD(n, i);
1341 node *ch = CHILD(n, i+1);
1342 i += 3;
1343 switch (TYPE(tok)) {
1344 case STAR: star_flag = 1; break;
1345 case DOUBLESTAR: starstar_flag = 1; break;
1346 }
1347 com_node(c, ch);
1348 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001349 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001350 com_error(c, PyExc_SyntaxError,
1351 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001352 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001353 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001354 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001355 star_flag + (starstar_flag << 1);
1356 else
1357 opcode = CALL_FUNCTION;
1358 com_addoparg(c, opcode, na | (nk << 8));
1359 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001360 }
1361}
1362
1363static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001364com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001365{
1366 com_addopname(c, LOAD_ATTR, n);
1367}
1368
1369static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001370com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001371{
1372 int i=0;
1373 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001374 node *ch;
1375
1376 /* first argument */
1377 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001378 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001379 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001380 i++;
1381 }
1382 else {
1383 com_node(c, CHILD(n,i));
1384 i++;
1385 REQ(CHILD(n,i),COLON);
1386 i++;
1387 }
1388 /* second argument */
1389 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1390 com_node(c, CHILD(n,i));
1391 i++;
1392 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001393 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001394 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001395 com_push(c, 1);
1396 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001397 /* remaining arguments */
1398 for (; i < NCH(n); i++) {
1399 ns++;
1400 ch=CHILD(n,i);
1401 REQ(ch, sliceop);
1402 if (NCH(ch) == 1) {
1403 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001404 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001405 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001406 }
1407 else
1408 com_node(c, CHILD(ch,1));
1409 }
1410 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001411 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001412}
1413
1414static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001415com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001416{
1417 node *ch;
1418 REQ(n, subscript);
1419 ch = CHILD(n,0);
1420 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001421 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001422 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001423 com_push(c, 1);
1424 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001425 else {
1426 /* check for slice */
1427 if ((TYPE(ch) == COLON || NCH(n) > 1))
1428 com_sliceobj(c, n);
1429 else {
1430 REQ(ch, test);
1431 com_node(c, ch);
1432 }
1433 }
1434}
1435
1436static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001437com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001438{
1439 int i, op;
1440 REQ(n, subscriptlist);
1441 /* Check to make backward compatible slice behavior for '[i:j]' */
1442 if (NCH(n) == 1) {
1443 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001444 /* 'Basic' slice, should have exactly one colon. */
1445 if ((TYPE(CHILD(sub, 0)) == COLON
1446 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1447 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1448 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001449 switch (assigning) {
1450 case OP_DELETE:
1451 op = DELETE_SLICE;
1452 break;
1453 case OP_ASSIGN:
1454 op = STORE_SLICE;
1455 break;
1456 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001457 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001458 break;
1459 default:
1460 com_augassign_slice(c, sub, assigning, augn);
1461 return;
1462 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001463 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001464 if (op == STORE_SLICE)
1465 com_pop(c, 2);
1466 else if (op == DELETE_SLICE)
1467 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001468 return;
1469 }
1470 }
1471 /* Else normal subscriptlist. Compile each subscript. */
1472 for (i = 0; i < NCH(n); i += 2)
1473 com_subscript(c, CHILD(n, i));
1474 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001475 if (NCH(n) > 1) {
1476 i = (NCH(n)+1) / 2;
1477 com_addoparg(c, BUILD_TUPLE, i);
1478 com_pop(c, i-1);
1479 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001480 switch (assigning) {
1481 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001482 op = DELETE_SUBSCR;
1483 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001484 break;
1485 default:
1486 case OP_ASSIGN:
1487 op = STORE_SUBSCR;
1488 i = 3;
1489 break;
1490 case OP_APPLY:
1491 op = BINARY_SUBSCR;
1492 i = 1;
1493 break;
1494 }
1495 if (assigning > OP_APPLY) {
1496 com_addoparg(c, DUP_TOPX, 2);
1497 com_push(c, 2);
1498 com_addbyte(c, BINARY_SUBSCR);
1499 com_pop(c, 1);
1500 com_node(c, augn);
1501 com_addbyte(c, assigning);
1502 com_pop(c, 1);
1503 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001504 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001505 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001506 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001507}
1508
1509static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001510com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001511{
1512 REQ(n, trailer);
1513 switch (TYPE(CHILD(n, 0))) {
1514 case LPAR:
1515 com_call_function(c, CHILD(n, 1));
1516 break;
1517 case DOT:
1518 com_select_member(c, CHILD(n, 1));
1519 break;
1520 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00001521 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001522 break;
1523 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001524 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001525 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001526 }
1527}
1528
1529static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001530com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001531{
1532 int i;
1533 REQ(n, power);
1534 com_atom(c, CHILD(n, 0));
1535 for (i = 1; i < NCH(n); i++) {
1536 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1537 com_factor(c, CHILD(n, i+1));
1538 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001539 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001540 break;
1541 }
1542 else
1543 com_apply_trailer(c, CHILD(n, i));
1544 }
1545}
1546
1547static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001548com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001549{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001550 REQ(n, factor);
1551 if (TYPE(CHILD(n, 0)) == PLUS) {
1552 com_factor(c, CHILD(n, 1));
1553 com_addbyte(c, UNARY_POSITIVE);
1554 }
1555 else if (TYPE(CHILD(n, 0)) == MINUS) {
1556 com_factor(c, CHILD(n, 1));
1557 com_addbyte(c, UNARY_NEGATIVE);
1558 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001559 else if (TYPE(CHILD(n, 0)) == TILDE) {
1560 com_factor(c, CHILD(n, 1));
1561 com_addbyte(c, UNARY_INVERT);
1562 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001563 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001564 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001565 }
1566}
1567
1568static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001569com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001570{
1571 int i;
1572 int op;
1573 REQ(n, term);
1574 com_factor(c, CHILD(n, 0));
1575 for (i = 2; i < NCH(n); i += 2) {
1576 com_factor(c, CHILD(n, i));
1577 switch (TYPE(CHILD(n, i-1))) {
1578 case STAR:
1579 op = BINARY_MULTIPLY;
1580 break;
1581 case SLASH:
1582 op = BINARY_DIVIDE;
1583 break;
1584 case PERCENT:
1585 op = BINARY_MODULO;
1586 break;
1587 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001588 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001589 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001590 op = 255;
1591 }
1592 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001593 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001594 }
1595}
1596
1597static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001598com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001599{
1600 int i;
1601 int op;
1602 REQ(n, arith_expr);
1603 com_term(c, CHILD(n, 0));
1604 for (i = 2; i < NCH(n); i += 2) {
1605 com_term(c, CHILD(n, i));
1606 switch (TYPE(CHILD(n, i-1))) {
1607 case PLUS:
1608 op = BINARY_ADD;
1609 break;
1610 case MINUS:
1611 op = BINARY_SUBTRACT;
1612 break;
1613 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001614 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001615 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001616 op = 255;
1617 }
1618 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001619 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001620 }
1621}
1622
1623static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001624com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001625{
1626 int i;
1627 int op;
1628 REQ(n, shift_expr);
1629 com_arith_expr(c, CHILD(n, 0));
1630 for (i = 2; i < NCH(n); i += 2) {
1631 com_arith_expr(c, CHILD(n, i));
1632 switch (TYPE(CHILD(n, i-1))) {
1633 case LEFTSHIFT:
1634 op = BINARY_LSHIFT;
1635 break;
1636 case RIGHTSHIFT:
1637 op = BINARY_RSHIFT;
1638 break;
1639 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001640 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001641 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001642 op = 255;
1643 }
1644 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001645 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001646 }
1647}
1648
1649static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001650com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001651{
1652 int i;
1653 int op;
1654 REQ(n, and_expr);
1655 com_shift_expr(c, CHILD(n, 0));
1656 for (i = 2; i < NCH(n); i += 2) {
1657 com_shift_expr(c, CHILD(n, i));
1658 if (TYPE(CHILD(n, i-1)) == AMPER) {
1659 op = BINARY_AND;
1660 }
1661 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001662 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001663 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001664 op = 255;
1665 }
1666 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001667 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001668 }
1669}
1670
1671static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001672com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001673{
1674 int i;
1675 int op;
1676 REQ(n, xor_expr);
1677 com_and_expr(c, CHILD(n, 0));
1678 for (i = 2; i < NCH(n); i += 2) {
1679 com_and_expr(c, CHILD(n, i));
1680 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1681 op = BINARY_XOR;
1682 }
1683 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001684 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001685 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001686 op = 255;
1687 }
1688 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001689 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001690 }
1691}
1692
1693static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001694com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001695{
1696 int i;
1697 int op;
1698 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001699 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001700 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001701 com_xor_expr(c, CHILD(n, i));
1702 if (TYPE(CHILD(n, i-1)) == VBAR) {
1703 op = BINARY_OR;
1704 }
1705 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001706 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001707 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001708 op = 255;
1709 }
1710 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001711 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001712 }
1713}
1714
1715static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001716cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001717{
1718 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001719 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001720 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1721 if (NCH(n) == 1) {
1722 n = CHILD(n, 0);
1723 switch (TYPE(n)) {
1724 case LESS: return LT;
1725 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001726 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001727 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001728 case LESSEQUAL: return LE;
1729 case GREATEREQUAL: return GE;
1730 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001731 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1732 if (strcmp(STR(n), "is") == 0) return IS;
1733 }
1734 }
1735 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001736 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001737 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1738 return NOT_IN;
1739 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1740 return IS_NOT;
1741 }
1742 }
1743 return BAD;
1744}
1745
1746static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001747com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001748{
1749 int i;
1750 enum cmp_op op;
1751 int anchor;
1752 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1753 com_expr(c, CHILD(n, 0));
1754 if (NCH(n) == 1)
1755 return;
1756
1757 /****************************************************************
1758 The following code is generated for all but the last
1759 comparison in a chain:
1760
1761 label: on stack: opcode: jump to:
1762
1763 a <code to load b>
1764 a, b DUP_TOP
1765 a, b, b ROT_THREE
1766 b, a, b COMPARE_OP
1767 b, 0-or-1 JUMP_IF_FALSE L1
1768 b, 1 POP_TOP
1769 b
1770
1771 We are now ready to repeat this sequence for the next
1772 comparison in the chain.
1773
1774 For the last we generate:
1775
1776 b <code to load c>
1777 b, c COMPARE_OP
1778 0-or-1
1779
1780 If there were any jumps to L1 (i.e., there was more than one
1781 comparison), we generate:
1782
1783 0-or-1 JUMP_FORWARD L2
1784 L1: b, 0 ROT_TWO
1785 0, b POP_TOP
1786 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00001787 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001788 ****************************************************************/
1789
1790 anchor = 0;
1791
1792 for (i = 2; i < NCH(n); i += 2) {
1793 com_expr(c, CHILD(n, i));
1794 if (i+2 < NCH(n)) {
1795 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001796 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001797 com_addbyte(c, ROT_THREE);
1798 }
1799 op = cmp_type(CHILD(n, i-1));
1800 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001801 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001802 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001803 }
1804 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001805 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001806 if (i+2 < NCH(n)) {
1807 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1808 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001809 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001810 }
1811 }
1812
1813 if (anchor) {
1814 int anchor2 = 0;
1815 com_addfwref(c, JUMP_FORWARD, &anchor2);
1816 com_backpatch(c, anchor);
1817 com_addbyte(c, ROT_TWO);
1818 com_addbyte(c, POP_TOP);
1819 com_backpatch(c, anchor2);
1820 }
1821}
1822
1823static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001824com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001825{
1826 REQ(n, not_test); /* 'not' not_test | comparison */
1827 if (NCH(n) == 1) {
1828 com_comparison(c, CHILD(n, 0));
1829 }
1830 else {
1831 com_not_test(c, CHILD(n, 1));
1832 com_addbyte(c, UNARY_NOT);
1833 }
1834}
1835
1836static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001837com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001838{
1839 int i;
1840 int anchor;
1841 REQ(n, and_test); /* not_test ('and' not_test)* */
1842 anchor = 0;
1843 i = 0;
1844 for (;;) {
1845 com_not_test(c, CHILD(n, i));
1846 if ((i += 2) >= NCH(n))
1847 break;
1848 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1849 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001850 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001851 }
1852 if (anchor)
1853 com_backpatch(c, anchor);
1854}
1855
1856static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001857com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001858{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001859 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00001860 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001861 PyObject *v;
Guido van Rossum57531fe1993-11-30 14:57:42 +00001862 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001863 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001864 v = (PyObject *) icompile(CHILD(n, 0), c);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001865 if (v == NULL) {
1866 c->c_errors++;
1867 i = 255;
1868 }
1869 else {
1870 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001871 Py_DECREF(v);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001872 }
1873 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001874 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001875 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001876 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001877 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001878 else {
1879 int anchor = 0;
1880 int i = 0;
1881 for (;;) {
1882 com_and_test(c, CHILD(n, i));
1883 if ((i += 2) >= NCH(n))
1884 break;
1885 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1886 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001887 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001888 }
1889 if (anchor)
1890 com_backpatch(c, anchor);
1891 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001892}
1893
1894static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001895com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001896{
1897 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001898 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001899 com_node(c, CHILD(n, 0));
1900 }
1901 else {
1902 int i;
1903 int len;
1904 len = (NCH(n) + 1) / 2;
1905 for (i = 0; i < NCH(n); i += 2)
1906 com_node(c, CHILD(n, i));
1907 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001908 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001909 }
1910}
1911
1912
1913/* Begin of assignment compilation */
1914
Thomas Wouters434d0822000-08-24 20:11:32 +00001915
1916static void
1917com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
1918{
1919 com_addbyte(c, DUP_TOP);
1920 com_push(c, 1);
1921 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00001922 com_node(c, augn);
1923 com_addbyte(c, opcode);
1924 com_pop(c, 1);
1925 com_addbyte(c, ROT_TWO);
1926 com_addopname(c, STORE_ATTR, n);
1927 com_pop(c, 2);
1928}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001929
1930static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001931com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001932{
1933 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001934 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001935}
1936
1937static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001938com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001939{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001940 REQ(n, trailer);
1941 switch (TYPE(CHILD(n, 0))) {
1942 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001943 com_error(c, PyExc_SyntaxError,
1944 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001945 break;
1946 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00001947 if (assigning > OP_APPLY)
1948 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
1949 else
1950 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001951 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001952 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00001953 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001954 break;
1955 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001956 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001957 }
1958}
1959
1960static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001961com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001962{
1963 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00001964 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001965 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001966 if (assigning) {
1967 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001968 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001969 com_push(c, i-1);
1970 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001971 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00001972 com_assign(c, CHILD(n, i), assigning, NULL);
1973}
1974
1975static void
1976com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
1977{
1978 REQ(n, NAME);
1979 com_addopname(c, LOAD_NAME, n);
1980 com_push(c, 1);
1981 com_node(c, augn);
1982 com_addbyte(c, opcode);
1983 com_pop(c, 1);
1984 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001985}
1986
1987static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001988com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001989{
1990 REQ(n, NAME);
1991 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001992 if (assigning)
1993 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001994}
1995
1996static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001997com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001998{
1999 /* Loop to avoid trivial recursion */
2000 for (;;) {
2001 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002002
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002003 case exprlist:
2004 case testlist:
2005 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002006 if (assigning > OP_APPLY) {
2007 com_error(c, PyExc_SyntaxError,
2008 "augmented assign to tuple not possible");
2009 return;
2010 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002011 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002012 return;
2013 }
2014 n = CHILD(n, 0);
2015 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002016
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002017 case test:
2018 case and_test:
2019 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002020 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002021 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002022 case xor_expr:
2023 case and_expr:
2024 case shift_expr:
2025 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002026 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002027 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002028 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002029 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002030 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002031 return;
2032 }
2033 n = CHILD(n, 0);
2034 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002035
Guido van Rossum50564e81996-01-12 01:13:16 +00002036 case power: /* atom trailer* ('**' power)* */
2037/* ('+'|'-'|'~') factor | atom trailer* */
2038 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002039 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002040 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002041 return;
2042 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002043 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002044 int i;
2045 com_node(c, CHILD(n, 0));
2046 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002047 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002048 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002049 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002050 return;
2051 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002052 com_apply_trailer(c, CHILD(n, i));
2053 } /* NB i is still alive */
2054 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002055 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002056 return;
2057 }
2058 n = CHILD(n, 0);
2059 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002060
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002061 case atom:
2062 switch (TYPE(CHILD(n, 0))) {
2063 case LPAR:
2064 n = CHILD(n, 1);
2065 if (TYPE(n) == RPAR) {
2066 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002067 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002068 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002069 return;
2070 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002071 if (assigning > OP_APPLY) {
2072 com_error(c, PyExc_SyntaxError,
2073 "augmented assign to tuple not possible");
2074 return;
2075 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002076 break;
2077 case LSQB:
2078 n = CHILD(n, 1);
2079 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002080 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002081 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002082 return;
2083 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002084 if (assigning > OP_APPLY) {
2085 com_error(c, PyExc_SyntaxError,
2086 "augmented assign to list not possible");
2087 return;
2088 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002089 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002090 return;
2091 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002092 if (assigning > OP_APPLY)
2093 com_augassign_name(c, CHILD(n, 0),
2094 assigning, augn);
2095 else
2096 com_assign_name(c, CHILD(n, 0),
2097 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002098 return;
2099 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002100 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002101 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002102 return;
2103 }
2104 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002105
2106 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002107 com_error(c, PyExc_SyntaxError,
2108 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002109 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002110
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002111 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002112 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002113 com_error(c, PyExc_SystemError,
2114 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002115 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002116
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002117 }
2118 }
2119}
Guido van Rossum7c531111997-03-11 18:42:21 +00002120
Thomas Wouters434d0822000-08-24 20:11:32 +00002121static void
2122com_augassign(struct compiling *c, node *n)
2123{
2124 int opcode;
2125
2126 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2127 case '+': opcode = INPLACE_ADD; break;
2128 case '-': opcode = INPLACE_SUBTRACT; break;
2129 case '/': opcode = INPLACE_DIVIDE; break;
2130 case '%': opcode = INPLACE_MODULO; break;
2131 case '<': opcode = INPLACE_LSHIFT; break;
2132 case '>': opcode = INPLACE_RSHIFT; break;
2133 case '&': opcode = INPLACE_AND; break;
2134 case '^': opcode = INPLACE_XOR; break;
2135 case '|': opcode = INPLACE_OR; break;
2136 case '*':
2137 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2138 opcode = INPLACE_POWER;
2139 else
2140 opcode = INPLACE_MULTIPLY;
2141 break;
2142 default:
2143 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2144 return;
2145 }
2146 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2147}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002148
2149static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002150com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002151{
Thomas Wouters434d0822000-08-24 20:11:32 +00002152 REQ(n, expr_stmt);
2153 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002154 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002155 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002156 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002157 if (NCH(n) == 1) {
2158 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002159 if (c->c_interactive)
2160 com_addbyte(c, PRINT_EXPR);
2161 else
2162 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002163 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002164 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002165 else if (TYPE(CHILD(n,1)) == augassign)
2166 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002167 else {
2168 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002169 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002170 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002171 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002172 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002173 com_push(c, 1);
2174 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002175 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002176 }
2177 }
2178}
2179
2180static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002181com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002182{
2183 int a = 0, b = 0;
2184 int i;
2185 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2186 /* Generate code like for
2187
2188 if __debug__:
2189 if not <test>:
2190 raise AssertionError [, <message>]
2191
2192 where <message> is the second test, if present.
2193 */
2194 if (Py_OptimizeFlag)
2195 return;
2196 com_addopnamestr(c, LOAD_GLOBAL, "__debug__");
2197 com_push(c, 1);
2198 com_addfwref(c, JUMP_IF_FALSE, &a);
2199 com_addbyte(c, POP_TOP);
2200 com_pop(c, 1);
2201 com_node(c, CHILD(n, 1));
2202 com_addfwref(c, JUMP_IF_TRUE, &b);
2203 com_addbyte(c, POP_TOP);
2204 com_pop(c, 1);
2205 /* Raise that exception! */
2206 com_addopnamestr(c, LOAD_GLOBAL, "AssertionError");
2207 com_push(c, 1);
2208 i = NCH(n)/2; /* Either 2 or 4 */
2209 if (i > 1)
2210 com_node(c, CHILD(n, 3));
2211 com_addoparg(c, RAISE_VARARGS, i);
2212 com_pop(c, i);
2213 /* The interpreter does not fall through */
2214 /* All jumps converge here */
2215 com_backpatch(c, a);
2216 com_backpatch(c, b);
2217 com_addbyte(c, POP_TOP);
2218}
2219
2220static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002221com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002222{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002223 int i = 1;
2224 node* stream = NULL;
2225
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002226 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002227
2228 /* are we using the extended print form? */
2229 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2230 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002231 com_node(c, stream);
2232 /* stack: [...] => [... stream] */
2233 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002234 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2235 i = 4;
2236 else
2237 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002238 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002239 for (; i < NCH(n); i += 2) {
2240 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002241 com_addbyte(c, DUP_TOP);
2242 /* stack: [stream] => [stream stream] */
2243 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002244 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002245 /* stack: [stream stream] => [stream stream obj] */
2246 com_addbyte(c, ROT_TWO);
2247 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002248 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002249 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002250 com_pop(c, 2);
2251 }
2252 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002253 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002254 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002255 com_addbyte(c, PRINT_ITEM);
2256 com_pop(c, 1);
2257 }
2258 }
2259 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002260 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002261 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002262 /* must pop the extra stream object off the stack */
2263 com_addbyte(c, POP_TOP);
2264 /* stack: [... stream] => [...] */
2265 com_pop(c, 1);
2266 }
2267 }
2268 else {
2269 if (stream != NULL) {
2270 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002271 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002272 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002273 com_pop(c, 1);
2274 }
2275 else
2276 com_addbyte(c, PRINT_NEWLINE);
2277 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002278}
2279
2280static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002281com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002282{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002283 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002284 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002285 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002286 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002287 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002288 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002289 com_push(c, 1);
2290 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002291 else
2292 com_node(c, CHILD(n, 1));
2293 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002294 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002295}
2296
2297static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002298com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002299{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002300 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002301 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2302 if (NCH(n) > 1) {
2303 com_node(c, CHILD(n, 1));
2304 if (NCH(n) > 3) {
2305 com_node(c, CHILD(n, 3));
2306 if (NCH(n) > 5)
2307 com_node(c, CHILD(n, 5));
2308 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002309 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002310 i = NCH(n)/2;
2311 com_addoparg(c, RAISE_VARARGS, i);
2312 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002313}
2314
2315static void
Thomas Wouters52152252000-08-17 22:55:00 +00002316com_from_import(struct compiling *c, node *n)
2317{
2318 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2319 com_push(c, 1);
2320 if (NCH(n) > 1) {
2321 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2322 com_error(c, PyExc_SyntaxError, "invalid syntax");
2323 return;
2324 }
2325 com_addopname(c, STORE_NAME, CHILD(n, 2));
2326 } else
2327 com_addopname(c, STORE_NAME, CHILD(n, 0));
2328 com_pop(c, 1);
2329}
2330
2331static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002332com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002333{
2334 int i;
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002335 PyObject *tup;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002336 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002337 /* 'import' dotted_name (',' dotted_name)* |
2338 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002339 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002340 /* 'from' dotted_name 'import' ... */
2341 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002342
2343 if (TYPE(CHILD(n, 3)) == STAR) {
2344 tup = Py_BuildValue("(s)", "*");
2345 } else {
2346 tup = PyTuple_New((NCH(n) - 2)/2);
2347 for (i = 3; i < NCH(n); i += 2) {
2348 PyTuple_SET_ITEM(tup, (i-3)/2,
2349 PyString_FromString(STR(
2350 CHILD(CHILD(n, i), 0))));
2351 }
2352 }
2353 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002354 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002355 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002356 if (TYPE(CHILD(n, 3)) == STAR)
2357 com_addbyte(c, IMPORT_STAR);
2358 else {
2359 for (i = 3; i < NCH(n); i += 2)
2360 com_from_import(c, CHILD(n, i));
2361 com_addbyte(c, POP_TOP);
2362 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002363 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002364 }
2365 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002366 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002367 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002368 node *subn = CHILD(n, i);
2369 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002370 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002371 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002372 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00002373 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00002374 int j;
2375 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00002376 com_error(c, PyExc_SyntaxError,
2377 "invalid syntax");
2378 return;
2379 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00002380 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
2381 com_addopname(c, LOAD_ATTR,
2382 CHILD(CHILD(subn, 0), j));
Thomas Wouters52152252000-08-17 22:55:00 +00002383 com_addopname(c, STORE_NAME, CHILD(subn, 2));
2384 } else
2385 com_addopname(c, STORE_NAME,
2386 CHILD(CHILD(subn, 0),0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002387 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002388 }
2389 }
2390}
2391
2392static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002393com_global_stmt(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002394{
2395 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002396 REQ(n, global_stmt);
2397 /* 'global' NAME (',' NAME)* */
2398 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002399 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002400#ifdef PRIVATE_NAME_MANGLING
2401 char buffer[256];
2402 if (s != NULL && s[0] == '_' && s[1] == '_' &&
2403 c->c_private != NULL &&
Guido van Rossum582acec2000-06-28 22:07:35 +00002404 com_mangle(c, s, buffer, sizeof(buffer)))
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002405 s = buffer;
2406#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +00002407 if (PyDict_GetItemString(c->c_locals, s) != NULL) {
2408 com_error(c, PyExc_SyntaxError,
2409 "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002410 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002411 else if (PyDict_SetItemString(c->c_globals, s, Py_None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002412 c->c_errors++;
2413 }
2414}
2415
Guido van Rossum681d79a1995-07-18 14:51:37 +00002416static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002417com_newlocal_o(struct compiling *c, PyObject *nameval)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002418{
2419 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002420 PyObject *ival;
2421 if (PyList_Size(c->c_varnames) != c->c_nlocals) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002422 /* This is usually caused by an error on a previous call */
2423 if (c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002424 com_error(c, PyExc_SystemError,
2425 "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002426 }
2427 return 0;
2428 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002429 ival = PyInt_FromLong(i = c->c_nlocals++);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002430 if (ival == NULL)
2431 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002432 else if (PyDict_SetItem(c->c_locals, nameval, ival) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002433 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002434 else if (PyList_Append(c->c_varnames, nameval) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002435 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002436 Py_XDECREF(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002437 return i;
2438}
2439
2440static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002441com_addlocal_o(struct compiling *c, PyObject *nameval)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002442{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002443 PyObject *ival = PyDict_GetItem(c->c_locals, nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002444 if (ival != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002445 return PyInt_AsLong(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002446 return com_newlocal_o(c, nameval);
2447}
2448
2449static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002450com_newlocal(struct compiling *c, char *name)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002451{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002452 PyObject *nameval = PyString_InternFromString(name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002453 int i;
2454 if (nameval == NULL) {
2455 c->c_errors++;
2456 return 0;
2457 }
2458 i = com_newlocal_o(c, nameval);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002459 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002460 return i;
2461}
2462
Guido van Rossumc5e96291991-12-10 13:53:51 +00002463static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002464com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002465{
2466 REQ(n, exec_stmt);
2467 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2468 com_node(c, CHILD(n, 1));
2469 if (NCH(n) >= 4)
2470 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002471 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002472 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002473 com_push(c, 1);
2474 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002475 if (NCH(n) >= 6)
2476 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002477 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002478 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002479 com_push(c, 1);
2480 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002481 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002482 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002483}
2484
Guido van Rossum7c531111997-03-11 18:42:21 +00002485static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002486is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002487{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002488 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002489 int i;
2490
2491 /* Label to avoid tail recursion */
2492 next:
2493 switch (TYPE(n)) {
2494
2495 case suite:
2496 if (NCH(n) == 1) {
2497 n = CHILD(n, 0);
2498 goto next;
2499 }
2500 /* Fall through */
2501 case file_input:
2502 for (i = 0; i < NCH(n); i++) {
2503 node *ch = CHILD(n, i);
2504 if (TYPE(ch) == stmt) {
2505 n = ch;
2506 goto next;
2507 }
2508 }
2509 break;
2510
2511 case stmt:
2512 case simple_stmt:
2513 case small_stmt:
2514 n = CHILD(n, 0);
2515 goto next;
2516
2517 case expr_stmt:
2518 case testlist:
2519 case test:
2520 case and_test:
2521 case not_test:
2522 case comparison:
2523 case expr:
2524 case xor_expr:
2525 case and_expr:
2526 case shift_expr:
2527 case arith_expr:
2528 case term:
2529 case factor:
2530 case power:
2531 case atom:
2532 if (NCH(n) == 1) {
2533 n = CHILD(n, 0);
2534 goto next;
2535 }
2536 break;
2537
2538 case NAME:
2539 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2540 return 1;
2541 break;
2542
2543 case NUMBER:
2544 v = parsenumber(c, STR(n));
2545 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002546 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002547 break;
2548 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002549 i = PyObject_IsTrue(v);
2550 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002551 return i == 0;
2552
2553 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002554 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002555 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002556 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002557 break;
2558 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002559 i = PyObject_IsTrue(v);
2560 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002561 return i == 0;
2562
2563 }
2564 return 0;
2565}
2566
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002567static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002568com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002569{
2570 int i;
2571 int anchor = 0;
2572 REQ(n, if_stmt);
2573 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2574 for (i = 0; i+3 < NCH(n); i+=4) {
2575 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002576 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002577 if (is_constant_false(c, ch))
2578 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002579 if (i > 0)
2580 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002581 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002582 com_addfwref(c, JUMP_IF_FALSE, &a);
2583 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002584 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002585 com_node(c, CHILD(n, i+3));
2586 com_addfwref(c, JUMP_FORWARD, &anchor);
2587 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002588 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002589 com_addbyte(c, POP_TOP);
2590 }
2591 if (i+2 < NCH(n))
2592 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002593 if (anchor)
2594 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002595}
2596
2597static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002598com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002599{
2600 int break_anchor = 0;
2601 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002602 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002603 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2604 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002605 block_push(c, SETUP_LOOP);
2606 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002607 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002608 com_node(c, CHILD(n, 1));
2609 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2610 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002611 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002612 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002613 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002614 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002615 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2616 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002617 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002618 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002619 com_addbyte(c, POP_TOP);
2620 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002621 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002622 if (NCH(n) > 4)
2623 com_node(c, CHILD(n, 6));
2624 com_backpatch(c, break_anchor);
2625}
2626
2627static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002628com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002629{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002630 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002631 int break_anchor = 0;
2632 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002633 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002634 REQ(n, for_stmt);
2635 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2636 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002637 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002638 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002639 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002640 if (v == NULL)
2641 c->c_errors++;
2642 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002643 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002644 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002645 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002646 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002647 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002648 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00002649 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002650 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002651 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002652 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002653 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2654 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002655 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002656 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002657 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002658 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002659 if (NCH(n) > 8)
2660 com_node(c, CHILD(n, 8));
2661 com_backpatch(c, break_anchor);
2662}
2663
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002664/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002665
2666 SETUP_FINALLY L
2667 <code for S>
2668 POP_BLOCK
2669 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002670 L: <code for Sf>
2671 END_FINALLY
2672
2673 The special instructions use the block stack. Each block
2674 stack entry contains the instruction that created it (here
2675 SETUP_FINALLY), the level of the value stack at the time the
2676 block stack entry was created, and a label (here L).
2677
2678 SETUP_FINALLY:
2679 Pushes the current value stack level and the label
2680 onto the block stack.
2681 POP_BLOCK:
2682 Pops en entry from the block stack, and pops the value
2683 stack until its level is the same as indicated on the
2684 block stack. (The label is ignored.)
2685 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002686 Pops a variable number of entries from the *value* stack
2687 and re-raises the exception they specify. The number of
2688 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002689
2690 The block stack is unwound when an exception is raised:
2691 when a SETUP_FINALLY entry is found, the exception is pushed
2692 onto the value stack (and the exception condition is cleared),
2693 and the interpreter jumps to the label gotten from the block
2694 stack.
2695
2696 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002697 (The contents of the value stack is shown in [], with the top
2698 at the right; 'tb' is trace-back info, 'val' the exception's
2699 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002700
2701 Value stack Label Instruction Argument
2702 [] SETUP_EXCEPT L1
2703 [] <code for S>
2704 [] POP_BLOCK
2705 [] JUMP_FORWARD L0
2706
Guido van Rossum3f5da241990-12-20 15:06:42 +00002707 [tb, val, exc] L1: DUP )
2708 [tb, val, exc, exc] <evaluate E1> )
2709 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2710 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2711 [tb, val, exc, 1] POP )
2712 [tb, val, exc] POP
2713 [tb, val] <assign to V1> (or POP if no V1)
2714 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002715 [] <code for S1>
2716 JUMP_FORWARD L0
2717
Guido van Rossum3f5da241990-12-20 15:06:42 +00002718 [tb, val, exc, 0] L2: POP
2719 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002720 .............................etc.......................
2721
Guido van Rossum3f5da241990-12-20 15:06:42 +00002722 [tb, val, exc, 0] Ln+1: POP
2723 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002724
2725 [] L0: <next statement>
2726
2727 Of course, parts are not generated if Vi or Ei is not present.
2728*/
2729
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002730static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002731com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002732{
2733 int except_anchor = 0;
2734 int end_anchor = 0;
2735 int else_anchor = 0;
2736 int i;
2737 node *ch;
2738
2739 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2740 block_push(c, SETUP_EXCEPT);
2741 com_node(c, CHILD(n, 2));
2742 com_addbyte(c, POP_BLOCK);
2743 block_pop(c, SETUP_EXCEPT);
2744 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2745 com_backpatch(c, except_anchor);
2746 for (i = 3;
2747 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2748 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002749 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002750 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002751 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002752 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002753 break;
2754 }
2755 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002756 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002757 com_addoparg(c, SET_LINENO, ch->n_lineno);
2758 if (NCH(ch) > 1) {
2759 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002760 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002761 com_node(c, CHILD(ch, 1));
2762 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002763 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002764 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2765 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002766 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002767 }
2768 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002769 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002770 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00002771 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002772 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002773 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002774 com_pop(c, 1);
2775 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002776 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002777 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002778 com_node(c, CHILD(n, i+2));
2779 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2780 if (except_anchor) {
2781 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002782 /* We come in with [tb, val, exc, 0] on the
2783 stack; one pop and it's the same as
2784 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002785 com_addbyte(c, POP_TOP);
2786 }
2787 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002788 /* We actually come in here with [tb, val, exc] but the
2789 END_FINALLY will zap those and jump around.
2790 The c_stacklevel does not reflect them so we need not pop
2791 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002792 com_addbyte(c, END_FINALLY);
2793 com_backpatch(c, else_anchor);
2794 if (i < NCH(n))
2795 com_node(c, CHILD(n, i+2));
2796 com_backpatch(c, end_anchor);
2797}
2798
2799static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002800com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002801{
2802 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002803 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002804
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002805 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2806 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002807 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002808 com_addbyte(c, POP_BLOCK);
2809 block_pop(c, SETUP_FINALLY);
2810 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002811 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002812 /* While the generated code pushes only one item,
2813 the try-finally handling can enter here with
2814 up to three items. OK, here are the details:
2815 3 for an exception, 2 for RETURN, 1 for BREAK. */
2816 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002817 com_backpatch(c, finally_anchor);
2818 ch = CHILD(n, NCH(n)-1);
2819 com_addoparg(c, SET_LINENO, ch->n_lineno);
2820 com_node(c, ch);
2821 com_addbyte(c, END_FINALLY);
2822 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002823 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002824}
2825
2826static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002827com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002828{
2829 REQ(n, try_stmt);
2830 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2831 | 'try' ':' suite 'finally' ':' suite */
2832 if (TYPE(CHILD(n, 3)) != except_clause)
2833 com_try_finally(c, n);
2834 else
2835 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002836}
2837
Guido van Rossum8b993a91997-01-17 21:04:03 +00002838static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002839get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002840{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002841 int i;
2842
Guido van Rossum8b993a91997-01-17 21:04:03 +00002843 /* Label to avoid tail recursion */
2844 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002845 switch (TYPE(n)) {
2846
2847 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002848 if (NCH(n) == 1) {
2849 n = CHILD(n, 0);
2850 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002851 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002852 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002853 case file_input:
2854 for (i = 0; i < NCH(n); i++) {
2855 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002856 if (TYPE(ch) == stmt) {
2857 n = ch;
2858 goto next;
2859 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002860 }
2861 break;
2862
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002863 case stmt:
2864 case simple_stmt:
2865 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002866 n = CHILD(n, 0);
2867 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002868
2869 case expr_stmt:
2870 case testlist:
2871 case test:
2872 case and_test:
2873 case not_test:
2874 case comparison:
2875 case expr:
2876 case xor_expr:
2877 case and_expr:
2878 case shift_expr:
2879 case arith_expr:
2880 case term:
2881 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002882 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002883 if (NCH(n) == 1) {
2884 n = CHILD(n, 0);
2885 goto next;
2886 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002887 break;
2888
2889 case atom:
2890 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002891 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002892 break;
2893
2894 }
2895 return NULL;
2896}
2897
Guido van Rossum79f25d91997-04-29 20:08:16 +00002898static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002899get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002900{
Guido van Rossum541563e1999-01-28 15:08:09 +00002901 /* Don't generate doc-strings if run with -OO */
2902 if (Py_OptimizeFlag > 1)
2903 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002904 n = get_rawdocstring(n);
2905 if (n == NULL)
2906 return NULL;
2907 return parsestrplus(n);
2908}
2909
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002910static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002911com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002912{
2913 REQ(n, suite);
2914 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2915 if (NCH(n) == 1) {
2916 com_node(c, CHILD(n, 0));
2917 }
2918 else {
2919 int i;
2920 for (i = 0; i < NCH(n); i++) {
2921 node *ch = CHILD(n, i);
2922 if (TYPE(ch) == stmt)
2923 com_node(c, ch);
2924 }
2925 }
2926}
2927
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002928/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002929static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002930com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002931{
2932 int i = c->c_nblocks;
2933 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2934 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2935 }
2936 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002937 com_error(c, PyExc_SyntaxError,
2938 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002939 }
2940 /* XXX Could allow it inside a 'finally' clause
2941 XXX if we could pop the exception still on the stack */
2942}
2943
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002944static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002945com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002946{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002947 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002948 if (TYPE(n) == lambdef) {
2949 /* lambdef: 'lambda' [varargslist] ':' test */
2950 n = CHILD(n, 1);
2951 }
2952 else {
2953 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2954 n = CHILD(n, 2);
2955 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2956 n = CHILD(n, 1);
2957 }
2958 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002959 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002960 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002961 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002962 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2963 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002964 nargs = 0;
2965 ndefs = 0;
2966 for (i = 0; i < nch; i++) {
2967 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002968 if (TYPE(CHILD(n, i)) == STAR ||
2969 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002970 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002971 nargs++;
2972 i++;
2973 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002974 t = RPAR; /* Anything except EQUAL or COMMA */
2975 else
2976 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002977 if (t == EQUAL) {
2978 i++;
2979 ndefs++;
2980 com_node(c, CHILD(n, i));
2981 i++;
2982 if (i >= nch)
2983 break;
2984 t = TYPE(CHILD(n, i));
2985 }
2986 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00002987 /* Treat "(a=1, b)" as an error */
2988 if (ndefs)
2989 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00002990 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002991 }
2992 if (t != COMMA)
2993 break;
2994 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002995 return ndefs;
2996}
2997
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002998static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002999com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003000{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003001 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003002 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003003 v = (PyObject *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003004 if (v == NULL)
3005 c->c_errors++;
3006 else {
3007 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003008 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003009 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003010 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003011 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003012 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003013 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003014 com_pop(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003015 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003016 }
3017}
3018
3019static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003020com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003021{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003022 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003023 REQ(n, testlist);
3024 /* testlist: test (',' test)* [','] */
3025 for (i = 0; i < NCH(n); i += 2)
3026 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003027 i = (NCH(n)+1) / 2;
3028 com_addoparg(c, BUILD_TUPLE, i);
3029 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003030}
3031
3032static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003033com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003034{
Guido van Rossum25831651993-05-19 14:50:45 +00003035 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003036 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003037 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003038 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003039 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003040 c->c_errors++;
3041 return;
3042 }
3043 /* Push the class name on the stack */
3044 i = com_addconst(c, v);
3045 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003046 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003047 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003048 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003049 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003050 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003051 com_push(c, 1);
3052 }
Guido van Rossum25831651993-05-19 14:50:45 +00003053 else
3054 com_bases(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00003055 v = (PyObject *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003056 if (v == NULL)
3057 c->c_errors++;
3058 else {
Guido van Rossum25831651993-05-19 14:50:45 +00003059 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003060 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003061 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003062 com_addoparg(c, MAKE_FUNCTION, 0);
3063 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003064 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003065 com_pop(c, 2);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003066 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum79f25d91997-04-29 20:08:16 +00003067 Py_DECREF(v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003068 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003069}
3070
3071static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003072com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003073{
3074 switch (TYPE(n)) {
3075
3076 /* Definition nodes */
3077
3078 case funcdef:
3079 com_funcdef(c, n);
3080 break;
3081 case classdef:
3082 com_classdef(c, n);
3083 break;
3084
3085 /* Trivial parse tree nodes */
3086
3087 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003088 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003089 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003090 com_node(c, CHILD(n, 0));
3091 break;
3092
3093 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003094 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3095 com_addoparg(c, SET_LINENO, n->n_lineno);
3096 {
3097 int i;
3098 for (i = 0; i < NCH(n)-1; i += 2)
3099 com_node(c, CHILD(n, i));
3100 }
3101 break;
3102
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003103 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003104 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003105 com_node(c, CHILD(n, 0));
3106 break;
3107
3108 /* Statement nodes */
3109
3110 case expr_stmt:
3111 com_expr_stmt(c, n);
3112 break;
3113 case print_stmt:
3114 com_print_stmt(c, n);
3115 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003116 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003117 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003118 break;
3119 case pass_stmt:
3120 break;
3121 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003122 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003123 com_error(c, PyExc_SyntaxError,
3124 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003125 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003126 com_addbyte(c, BREAK_LOOP);
3127 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003128 case continue_stmt:
3129 com_continue_stmt(c, n);
3130 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003131 case return_stmt:
3132 com_return_stmt(c, n);
3133 break;
3134 case raise_stmt:
3135 com_raise_stmt(c, n);
3136 break;
3137 case import_stmt:
3138 com_import_stmt(c, n);
3139 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003140 case global_stmt:
3141 com_global_stmt(c, n);
3142 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003143 case exec_stmt:
3144 com_exec_stmt(c, n);
3145 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003146 case assert_stmt:
3147 com_assert_stmt(c, n);
3148 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003149 case if_stmt:
3150 com_if_stmt(c, n);
3151 break;
3152 case while_stmt:
3153 com_while_stmt(c, n);
3154 break;
3155 case for_stmt:
3156 com_for_stmt(c, n);
3157 break;
3158 case try_stmt:
3159 com_try_stmt(c, n);
3160 break;
3161 case suite:
3162 com_suite(c, n);
3163 break;
3164
3165 /* Expression nodes */
3166
3167 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003168 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003169 break;
3170 case test:
3171 com_test(c, n);
3172 break;
3173 case and_test:
3174 com_and_test(c, n);
3175 break;
3176 case not_test:
3177 com_not_test(c, n);
3178 break;
3179 case comparison:
3180 com_comparison(c, n);
3181 break;
3182 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003183 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003184 break;
3185 case expr:
3186 com_expr(c, n);
3187 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003188 case xor_expr:
3189 com_xor_expr(c, n);
3190 break;
3191 case and_expr:
3192 com_and_expr(c, n);
3193 break;
3194 case shift_expr:
3195 com_shift_expr(c, n);
3196 break;
3197 case arith_expr:
3198 com_arith_expr(c, n);
3199 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003200 case term:
3201 com_term(c, n);
3202 break;
3203 case factor:
3204 com_factor(c, n);
3205 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003206 case power:
3207 com_power(c, n);
3208 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003209 case atom:
3210 com_atom(c, n);
3211 break;
3212
3213 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003214 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003215 com_error(c, PyExc_SystemError,
3216 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003217 }
3218}
3219
Tim Petersdbd9ba62000-07-09 03:09:57 +00003220static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003221
3222static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003223com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003224{
3225 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3226 if (TYPE(CHILD(n, 0)) == LPAR)
3227 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003228 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003229 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003230 com_pop(c, 1);
3231 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003232}
3233
3234static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003235com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003236{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003237 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003238 if (NCH(n) == 1) {
3239 com_fpdef(c, CHILD(n, 0));
3240 }
3241 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003242 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003243 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003244 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003245 for (i = 0; i < NCH(n); i += 2)
3246 com_fpdef(c, CHILD(n, i));
3247 }
3248}
3249
3250static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003251com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003252{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003253 int nch, i;
3254 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003255 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003256 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003257 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003258 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003259 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003260 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003261 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003262 node *ch = CHILD(n, i);
3263 node *fp;
3264 char *name;
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003265 PyObject *nameval;
Guido van Rossum50564e81996-01-12 01:13:16 +00003266 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003267 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003268 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3269 fp = CHILD(ch, 0);
3270 if (TYPE(fp) == NAME)
3271 name = STR(fp);
3272 else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003273 name = nbuf;
3274 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003275 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003276 }
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003277 nameval = PyString_InternFromString(name);
3278 if (nameval == NULL) {
3279 c->c_errors++;
3280 }
Peter Schneider-Kamp9a5086c2000-07-13 06:24:29 +00003281 if (PyDict_GetItem(c->c_locals, nameval)) {
Fred Drakedcf08e02000-08-15 15:49:44 +00003282 com_error(c, PyExc_SyntaxError,
3283 "duplicate argument in function definition");
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003284 }
3285 com_newlocal_o(c, nameval);
3286 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003287 c->c_argcount++;
3288 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003289 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003290 ch = CHILD(n, i);
3291 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003292 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003293 else
3294 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003295 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003296 /* Handle *arguments */
3297 if (i < nch) {
3298 node *ch;
3299 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003300 if (TYPE(ch) != DOUBLESTAR) {
3301 REQ(ch, STAR);
3302 ch = CHILD(n, i+1);
3303 if (TYPE(ch) == NAME) {
3304 c->c_flags |= CO_VARARGS;
3305 i += 3;
3306 com_newlocal(c, STR(ch));
3307 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003308 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003309 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003310 /* Handle **keywords */
3311 if (i < nch) {
3312 node *ch;
3313 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003314 if (TYPE(ch) != DOUBLESTAR) {
3315 REQ(ch, STAR);
3316 ch = CHILD(n, i+1);
3317 REQ(ch, STAR);
3318 ch = CHILD(n, i+2);
3319 }
3320 else
3321 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003322 REQ(ch, NAME);
3323 c->c_flags |= CO_VARKEYWORDS;
3324 com_newlocal(c, STR(ch));
3325 }
3326 if (complex) {
3327 /* Generate code for complex arguments only after
3328 having counted the simple arguments */
3329 int ilocal = 0;
3330 for (i = 0; i < nch; i++) {
3331 node *ch = CHILD(n, i);
3332 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003333 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003334 break;
3335 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3336 fp = CHILD(ch, 0);
3337 if (TYPE(fp) != NAME) {
3338 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003339 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003340 com_fpdef(c, ch);
3341 }
3342 ilocal++;
3343 if (++i >= nch)
3344 break;
3345 ch = CHILD(n, i);
3346 if (TYPE(ch) == EQUAL)
3347 i += 2;
3348 else
3349 REQ(ch, COMMA);
3350 }
3351 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003352}
3353
3354static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003355com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003356{
3357 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003358 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003359 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003360 doc = get_docstring(n);
3361 if (doc != NULL) {
3362 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003363 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003364 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003365 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003366 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003367 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003368 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003369 for (i = 0; i < NCH(n); i++) {
3370 node *ch = CHILD(n, i);
3371 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3372 com_node(c, ch);
3373 }
3374}
3375
3376/* Top-level compile-node interface */
3377
3378static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003379compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003380{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003381 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003382 node *ch;
3383 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003384 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003385 doc = get_docstring(CHILD(n, 4));
3386 if (doc != NULL) {
3387 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003388 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003389 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003390 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003391 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003392 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3393 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003394 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003395 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003396 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003397 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003398 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003399 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003400 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003401 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003402 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003403}
3404
3405static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003406compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003407{
Guido van Rossum590baa41993-11-30 13:40:46 +00003408 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003409 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003410 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003411
3412 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003413 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003414 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003415 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003416 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003417 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003418 else
3419 ch = CHILD(n, 2);
3420 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003421 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003422 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003423}
3424
3425static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003426compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003427{
3428 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003429 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003430 REQ(n, classdef);
3431 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3432 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003433#ifdef PRIVATE_NAME_MANGLING
3434 c->c_private = c->c_name;
3435#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003436 ch = CHILD(n, NCH(n)-1); /* The suite */
3437 doc = get_docstring(ch);
3438 if (doc != NULL) {
3439 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003440 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003441 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003442 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003443 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003444 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003445 }
3446 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003447 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003448 com_node(c, ch);
3449 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003450 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003451 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003452 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003453}
3454
3455static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003456compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003457{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003458 com_addoparg(c, SET_LINENO, n->n_lineno);
3459
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003460 switch (TYPE(n)) {
3461
Guido van Rossum4c417781991-01-21 16:09:22 +00003462 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003463 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003464 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003465 n = CHILD(n, 0);
3466 if (TYPE(n) != NEWLINE)
3467 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003468 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003469 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003470 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003471 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003472 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003473 break;
3474
Guido van Rossum4c417781991-01-21 16:09:22 +00003475 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003476 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003477 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003478 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003479 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003480 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003481 break;
3482
Guido van Rossum590baa41993-11-30 13:40:46 +00003483 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003484 com_node(c, CHILD(n, 0));
3485 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003486 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003487 break;
3488
Guido van Rossum590baa41993-11-30 13:40:46 +00003489 case lambdef: /* anonymous function definition */
3490 compile_lambdef(c, n);
3491 break;
3492
Guido van Rossum4c417781991-01-21 16:09:22 +00003493 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003494 compile_funcdef(c, n);
3495 break;
3496
Guido van Rossum4c417781991-01-21 16:09:22 +00003497 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003498 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003499 break;
3500
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003501 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003502 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003503 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003504 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003505 }
3506}
3507
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003508/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00003509
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003510 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
3511 instructions that refer to local variables with LOAD_FAST etc.
3512 The latter instructions are much faster because they don't need to
3513 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003514
Guido van Rossum681d79a1995-07-18 14:51:37 +00003515 To find all local variables, we check all STORE_NAME, IMPORT_FROM
3516 and DELETE_NAME instructions. This yields all local variables,
3517 function definitions, class definitions and import statements.
3518 Argument names have already been entered into the list by the
3519 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003520
3521 All remaining LOAD_NAME instructions must refer to non-local (global
3522 or builtin) variables, so are replaced by LOAD_GLOBAL.
3523
3524 There are two problems: 'from foo import *' and 'exec' may introduce
3525 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00003526 case, we can still optimize bona fide locals (since those
3527 statements will be surrounded by fast_2_locals() and
3528 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003529
Guido van Rossum681d79a1995-07-18 14:51:37 +00003530 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00003531
3532static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003533optimize(struct compiling *c)
Guido van Rossum282914b1991-04-04 10:42:56 +00003534{
Guido van Rossum0a697f61991-04-16 08:39:12 +00003535 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00003536 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00003537 int oparg = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003538 PyObject *name;
3539 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003540
Guido van Rossum282914b1991-04-04 10:42:56 +00003541#define NEXTOP() (*next_instr++)
3542#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossum79f25d91997-04-29 20:08:16 +00003543#define GETITEM(v, i) (PyList_GetItem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003544#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
3545
Guido van Rossum79f25d91997-04-29 20:08:16 +00003546 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003547
3548 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00003549
Guido van Rossum79f25d91997-04-29 20:08:16 +00003550 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003551 for (;;) {
3552 opcode = NEXTOP();
3553 if (opcode == STOP_CODE)
3554 break;
3555 if (HAS_ARG(opcode))
3556 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +00003557 dispatch_opcode1:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003558 switch (opcode) {
3559 case STORE_NAME:
3560 case DELETE_NAME:
3561 case IMPORT_FROM:
3562 com_addlocal_o(c, GETNAMEOBJ(oparg));
3563 break;
Thomas Wouters52152252000-08-17 22:55:00 +00003564 case IMPORT_STAR:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003565 case EXEC_STMT:
3566 c->c_flags &= ~CO_OPTIMIZED;
3567 break;
Fred Drakeef8ace32000-08-24 00:32:09 +00003568 case EXTENDED_ARG:
3569 opcode = NEXTOP();
3570 oparg = oparg<<16 | NEXTARG();
3571 goto dispatch_opcode1;
3572 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00003573 }
3574 }
3575
Thomas Wouters52152252000-08-17 22:55:00 +00003576 /* TBD: Is this still necessary ? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003577 if (PyDict_GetItemString(c->c_locals, "*") != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003578 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003579
Guido van Rossum79f25d91997-04-29 20:08:16 +00003580 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003581 for (;;) {
3582 cur_instr = next_instr;
3583 opcode = NEXTOP();
3584 if (opcode == STOP_CODE)
3585 break;
3586 if (HAS_ARG(opcode))
3587 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +00003588 dispatch_opcode2:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003589 if (opcode == LOAD_NAME ||
3590 opcode == STORE_NAME ||
3591 opcode == DELETE_NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003592 PyObject *v;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003593 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00003594 name = GETNAMEOBJ(oparg);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003595 v = PyDict_GetItem(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003596 if (v == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003597 if (opcode == LOAD_NAME &&
3598 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003599 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003600 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00003601 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003602 i = PyInt_AsLong(v);
Fred Drakeef8ace32000-08-24 00:32:09 +00003603 if (i >> 16) /* too big for 2 bytes */
3604 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003605 switch (opcode) {
3606 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
3607 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
3608 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
3609 }
3610 cur_instr[1] = i & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +00003611 cur_instr[2] = i >> 8;
3612 }
3613 if (opcode == EXTENDED_ARG) {
3614 opcode = NEXTOP();
3615 oparg = oparg<<16 | NEXTARG();
3616 goto dispatch_opcode2;
Guido van Rossum282914b1991-04-04 10:42:56 +00003617 }
3618 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003619
Guido van Rossum681d79a1995-07-18 14:51:37 +00003620 if (c->c_errors == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00003621 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00003622}
3623
Guido van Rossum79f25d91997-04-29 20:08:16 +00003624PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003625PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003626{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003627 return jcompile(n, filename, NULL);
3628}
3629
Guido van Rossum79f25d91997-04-29 20:08:16 +00003630static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003631icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003632{
3633 return jcompile(n, base->c_filename, base);
3634}
3635
Guido van Rossum79f25d91997-04-29 20:08:16 +00003636static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003637jcompile(node *n, char *filename, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003638{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003639 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003640 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003641 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003642 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003643#ifdef PRIVATE_NAME_MANGLING
3644 if (base)
3645 sc.c_private = base->c_private;
3646 else
3647 sc.c_private = NULL;
3648#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003649 compile_node(&sc, n);
3650 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003651 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003652 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003653 sc.c_flags |= CO_NEWLOCALS;
3654 }
3655 else if (TYPE(n) == classdef)
3656 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00003657 co = NULL;
3658 if (sc.c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003659 PyObject *consts, *names, *varnames, *filename, *name;
3660 consts = PyList_AsTuple(sc.c_consts);
3661 names = PyList_AsTuple(sc.c_names);
3662 varnames = PyList_AsTuple(sc.c_varnames);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003663 filename = PyString_InternFromString(sc.c_filename);
3664 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003665 if (!PyErr_Occurred())
3666 co = PyCode_New(sc.c_argcount,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003667 sc.c_nlocals,
Guido van Rossum8b993a91997-01-17 21:04:03 +00003668 sc.c_maxstacklevel,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003669 sc.c_flags,
3670 sc.c_code,
3671 consts,
3672 names,
3673 varnames,
3674 filename,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003675 name,
3676 sc.c_firstlineno,
3677 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003678 Py_XDECREF(consts);
3679 Py_XDECREF(names);
3680 Py_XDECREF(varnames);
3681 Py_XDECREF(filename);
3682 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003683 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003684 else if (!PyErr_Occurred()) {
3685 /* This could happen if someone called PyErr_Clear() after an
3686 error was reported above. That's not supposed to happen,
3687 but I just plugged one case and I'm not sure there can't be
3688 others. In that case, raise SystemError so that at least
3689 it gets reported instead dumping core. */
3690 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3691 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003692 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003693 return co;
3694}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003695
3696int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003697PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003698{
3699 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003700 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003701 int line = co->co_firstlineno;
3702 int addr = 0;
3703 while (--size >= 0) {
3704 addr += *p++;
3705 if (addr > addrq)
3706 break;
3707 line += *p++;
3708 }
3709 return line;
3710}