blob: c761e5eee6407b6f42a850889567b59d4886f1eb [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009******************************************************************/
10
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011/* Compile an expression node to intermediate code */
12
Guido van Rossum3f5da241990-12-20 15:06:42 +000013/* XXX TO DO:
Guido van Rossum8b993a91997-01-17 21:04:03 +000014 XXX add __doc__ attribute == co_doc to code object attributes?
15 XXX (it's currently the first item of the co_const tuple)
Guido van Rossum3f5da241990-12-20 15:06:42 +000016 XXX Generate simple jump for break/return outside 'try...finally'
Guido van Rossum8b993a91997-01-17 21:04:03 +000017 XXX Allow 'continue' inside try-finally
Guido van Rossum8b993a91997-01-17 21:04:03 +000018 XXX New opcode for loading the initial index for a for loop
Guido van Rossum681d79a1995-07-18 14:51:37 +000019 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000020*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000021
Guido van Rossum8ff077b1996-08-24 06:21:31 +000022#ifndef NO_PRIVATE_NAME_MANGLING
23#define PRIVATE_NAME_MANGLING
24#endif
25
Guido van Rossum79f25d91997-04-29 20:08:16 +000026#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000027
Guido van Rossum10dc2e81990-11-18 17:27:39 +000028#include "node.h"
29#include "token.h"
30#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000031#include "compile.h"
32#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000033#include "structmember.h"
34
35#include <ctype.h>
Jack Jansen41aa8e52000-07-03 21:39:47 +000036#ifdef HAVE_LIMITS_H
37#include <limits.h>
38#endif
Fred Drakeef8ace32000-08-24 00:32:09 +000039#ifndef INT_MAX
40#define INT_MAX 2147483647
41#endif
Guido van Rossum282914b1991-04-04 10:42:56 +000042
Guido van Rossumb05a5c71997-05-07 17:46:13 +000043/* Three symbols from graminit.h are also defined in Python.h, with
44 Py_ prefixes to their names. Python.h can't include graminit.h
45 (which defines too many confusing symbols), but we can check here
46 that they haven't changed (which is very unlikely, but possible). */
47#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000048 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000049#endif
50#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000051 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000052#endif
53#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000054 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000055#endif
56
Guido van Rossum8e793d91997-03-03 19:13:14 +000057int Py_OptimizeFlag = 0;
58
Guido van Rossum8861b741996-07-30 16:49:37 +000059#define OP_DELETE 0
60#define OP_ASSIGN 1
61#define OP_APPLY 2
62
Guido van Rossum79f25d91997-04-29 20:08:16 +000063#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000064
65static struct memberlist code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000066 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
67 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000068 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000069 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000070 {"co_code", T_OBJECT, OFF(co_code), READONLY},
71 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
72 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000073 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000074 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000075 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000076 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
77 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000078 {NULL} /* Sentinel */
79};
80
Guido van Rossum79f25d91997-04-29 20:08:16 +000081static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000082code_getattr(PyCodeObject *co, char *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +000083{
Guido van Rossum79f25d91997-04-29 20:08:16 +000084 return PyMember_Get((char *)co, code_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +000085}
Guido van Rossum10dc2e81990-11-18 17:27:39 +000086
87static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000088code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +000089{
Guido van Rossum79f25d91997-04-29 20:08:16 +000090 Py_XDECREF(co->co_code);
91 Py_XDECREF(co->co_consts);
92 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +000093 Py_XDECREF(co->co_varnames);
Guido van Rossum79f25d91997-04-29 20:08:16 +000094 Py_XDECREF(co->co_filename);
95 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +000096 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +000097 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +000098}
99
Guido van Rossum79f25d91997-04-29 20:08:16 +0000100static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000101code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000102{
103 char buf[500];
104 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000105 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000106 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000107
Guido van Rossuma396a882000-04-07 01:21:36 +0000108 if (co->co_firstlineno != 0)
109 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000110 if (co->co_filename && PyString_Check(co->co_filename))
111 filename = PyString_AsString(co->co_filename);
112 if (co->co_name && PyString_Check(co->co_name))
113 name = PyString_AsString(co->co_name);
Fred Drake615ae552000-06-30 16:20:13 +0000114 sprintf(buf, "<code object %.100s at %p, file \"%.300s\", line %d>",
115 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000116 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000117}
118
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000119static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000120code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000121{
122 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000123 cmp = PyObject_Compare(co->co_name, cp->co_name);
124 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000125 cmp = co->co_argcount - cp->co_argcount;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000126 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000127 cmp = co->co_nlocals - cp->co_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000128 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000129 cmp = co->co_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000130 if (cmp) return cmp;
Guido van Rossumd076c731998-10-07 19:42:25 +0000131 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000132 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000133 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000134 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000135 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000136 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000137 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000138 return cmp;
139}
140
141static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000142code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000143{
Guido van Rossum44679592000-04-10 16:20:31 +0000144 long h, h0, h1, h2, h3, h4;
145 h0 = PyObject_Hash(co->co_name);
146 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000147 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000148 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000149 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000150 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000151 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000152 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000153 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000154 if (h4 == -1) return -1;
Guido van Rossum44679592000-04-10 16:20:31 +0000155 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000156 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000157 if (h == -1) h = -2;
158 return h;
159}
160
Guido van Rossum79f25d91997-04-29 20:08:16 +0000161PyTypeObject PyCode_Type = {
162 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000163 0,
164 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000165 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000166 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000167 (destructor)code_dealloc, /*tp_dealloc*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000168 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000169 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000170 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000171 (cmpfunc)code_compare, /*tp_compare*/
172 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000173 0, /*tp_as_number*/
174 0, /*tp_as_sequence*/
175 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000176 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000177};
178
Guido van Rossum644a12b1997-04-09 19:24:53 +0000179#define NAME_CHARS \
180 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
181
Guido van Rossum79f25d91997-04-29 20:08:16 +0000182PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000183PyCode_New(int argcount, int nlocals, int stacksize, int flags,
184 PyObject *code, PyObject *consts, PyObject *names,
185 PyObject *varnames, PyObject *filename, PyObject *name,
186 int firstlineno, PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000187{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000188 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000189 int i;
Guido van Rossumd076c731998-10-07 19:42:25 +0000190 PyBufferProcs *pb;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000191 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000192 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000193 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000194 consts == NULL || !PyTuple_Check(consts) ||
195 names == NULL || !PyTuple_Check(names) ||
196 varnames == NULL || !PyTuple_Check(varnames) ||
197 name == NULL || !PyString_Check(name) ||
198 filename == NULL || !PyString_Check(filename) ||
199 lnotab == NULL || !PyString_Check(lnotab)) {
200 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000201 return NULL;
202 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000203 pb = code->ob_type->tp_as_buffer;
204 if (pb == NULL ||
205 pb->bf_getreadbuffer == NULL ||
206 pb->bf_getsegcount == NULL ||
207 (*pb->bf_getsegcount)(code, NULL) != 1)
208 {
209 PyErr_BadInternalCall();
210 return NULL;
211 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000212 /* Make sure names and varnames are all strings, & intern them */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000213 for (i = PyTuple_Size(names); --i >= 0; ) {
214 PyObject *v = PyTuple_GetItem(names, i);
215 if (v == NULL || !PyString_Check(v)) {
216 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000217 return NULL;
218 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000219 PyString_InternInPlace(&PyTuple_GET_ITEM(names, i));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000220 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000221 for (i = PyTuple_Size(varnames); --i >= 0; ) {
222 PyObject *v = PyTuple_GetItem(varnames, i);
223 if (v == NULL || !PyString_Check(v)) {
224 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000225 return NULL;
226 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000227 PyString_InternInPlace(&PyTuple_GET_ITEM(varnames, i));
228 }
229 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000230 for (i = PyTuple_Size(consts); --i >= 0; ) {
231 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000232 char *p;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000233 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000234 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000235 p = PyString_AsString(v);
Guido van Rossum582acec2000-06-28 22:07:35 +0000236 if (strspn(p, NAME_CHARS)
237 != (size_t)PyString_Size(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000238 continue;
239 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000240 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000241 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000242 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000243 co->co_argcount = argcount;
244 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000245 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000246 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000247 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000248 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000249 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000250 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000251 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000252 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000253 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000254 co->co_varnames = varnames;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000255 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000256 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000257 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000258 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000259 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000260 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000261 co->co_lnotab = lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000262 }
263 return co;
264}
265
266
267/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000268
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000269struct compiling {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000270 PyObject *c_code; /* string */
271 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000272 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000273 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000274 PyObject *c_name_dict; /* inverse of c_names */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000275 PyObject *c_globals; /* dictionary (value=None) */
276 PyObject *c_locals; /* dictionary (value=localID) */
277 PyObject *c_varnames; /* list (inverse of c_locals) */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000278 int c_nlocals; /* index of next local */
279 int c_argcount; /* number of top-level arguments */
280 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000281 int c_nexti; /* index into c_code */
282 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000283 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000284 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000285 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000286 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000287 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000288 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000289 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000290 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000291 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000292 int c_stacklevel; /* Current stack level */
293 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000294 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000295 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000296 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000297#ifdef PRIVATE_NAME_MANGLING
298 char *c_private; /* for private name mangling */
299#endif
Skip Montanaro803d6e52000-08-12 18:09:51 +0000300 int c_tmpname; /* temporary local name counter */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000301};
302
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000303
Guido van Rossum452a9831996-09-17 14:32:04 +0000304/* Error message including line number */
305
306static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000307com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000308{
Fred Drakedcf08e02000-08-15 15:49:44 +0000309 PyObject *v, *tb, *tmp;
Guido van Rossum635abd21997-01-06 22:56:52 +0000310 c->c_errors++;
Guido van Rossum452a9831996-09-17 14:32:04 +0000311 if (c->c_lineno <= 1) {
312 /* Unknown line number or single interactive command */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000313 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000314 return;
315 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000316 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000317 if (v == NULL)
318 return; /* MemoryError, too bad */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000319 PyErr_SetObject(exc, v);
320 Py_DECREF(v);
Fred Drakedcf08e02000-08-15 15:49:44 +0000321
322 /* add attributes for the line number and filename for the error */
323 PyErr_Fetch(&exc, &v, &tb);
324 PyErr_NormalizeException(&exc, &v, &tb);
325 tmp = PyInt_FromLong(c->c_lineno);
326 if (tmp == NULL)
327 PyErr_Clear();
328 else {
329 if (PyObject_SetAttrString(v, "lineno", tmp))
330 PyErr_Clear();
331 Py_DECREF(tmp);
332 }
333 if (c->c_filename != NULL) {
334 tmp = PyString_FromString(c->c_filename);
335 if (tmp == NULL)
336 PyErr_Clear();
337 else {
338 if (PyObject_SetAttrString(v, "filename", tmp))
339 PyErr_Clear();
340 Py_DECREF(tmp);
341 }
342 }
343 PyErr_Restore(exc, v, tb);
Guido van Rossum452a9831996-09-17 14:32:04 +0000344}
345
346
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000347/* Interface to the block stack */
348
349static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000350block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000351{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000352 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000353 com_error(c, PyExc_SystemError,
354 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000355 }
356 else {
357 c->c_block[c->c_nblocks++] = type;
358 }
359}
360
361static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000362block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000363{
364 if (c->c_nblocks > 0)
365 c->c_nblocks--;
366 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000367 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000368 }
369}
370
371
Guido van Rossum681d79a1995-07-18 14:51:37 +0000372/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000373
Tim Petersdbd9ba62000-07-09 03:09:57 +0000374static int com_init(struct compiling *, char *);
375static void com_free(struct compiling *);
376static void com_push(struct compiling *, int);
377static void com_pop(struct compiling *, int);
378static void com_done(struct compiling *);
379static void com_node(struct compiling *, struct _node *);
380static void com_factor(struct compiling *, struct _node *);
381static void com_addbyte(struct compiling *, int);
382static void com_addint(struct compiling *, int);
383static void com_addoparg(struct compiling *, int, int);
384static void com_addfwref(struct compiling *, int, int *);
385static void com_backpatch(struct compiling *, int);
386static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
387static int com_addconst(struct compiling *, PyObject *);
388static int com_addname(struct compiling *, PyObject *);
389static void com_addopname(struct compiling *, int, node *);
390static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000391static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000392static int com_argdefs(struct compiling *, node *);
393static int com_newlocal(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000394static void com_assign(struct compiling *, node *, int, node *);
395static void com_assign_name(struct compiling *, node *, int);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000396static PyCodeObject *icompile(struct _node *, struct compiling *);
397static PyCodeObject *jcompile(struct _node *, char *,
398 struct compiling *);
399static PyObject *parsestrplus(node *);
400static PyObject *parsestr(char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000401static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000402
403static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000404com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000405{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000406 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000407 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
408 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000409 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000410 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000411 goto fail;
412 if ((c->c_const_dict = PyDict_New()) == NULL)
413 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000414 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000415 goto fail;
416 if ((c->c_name_dict = PyDict_New()) == NULL)
417 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000418 if ((c->c_globals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000419 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000420 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000421 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000422 if ((c->c_varnames = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000423 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000424 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
425 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000426 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000427 c->c_nlocals = 0;
428 c->c_argcount = 0;
429 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000430 c->c_nexti = 0;
431 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000432 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000433 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000434 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000435 c->c_begin = 0;
436 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000437 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000438 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000439 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000440 c->c_stacklevel = 0;
441 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000442 c->c_firstlineno = 0;
443 c->c_last_addr = 0;
444 c->c_last_line = 0;
445 c-> c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000446 c->c_tmpname = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000447 return 1;
448
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000449 fail:
450 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000451 return 0;
452}
453
454static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000455com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000456{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000457 Py_XDECREF(c->c_code);
458 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000459 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000460 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000461 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000462 Py_XDECREF(c->c_globals);
463 Py_XDECREF(c->c_locals);
464 Py_XDECREF(c->c_varnames);
465 Py_XDECREF(c->c_lnotab);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000466}
467
468static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000469com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000470{
471 c->c_stacklevel += n;
472 if (c->c_stacklevel > c->c_maxstacklevel)
473 c->c_maxstacklevel = c->c_stacklevel;
474}
475
476static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000477com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000478{
479 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000480 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000481 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
482 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000483 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000484 c->c_stacklevel = 0;
485 }
486 else
487 c->c_stacklevel -= n;
488}
489
490static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000491com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000492{
493 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000494 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000495 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000496 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000497}
498
499static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000500com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000501{
502 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000503 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000504 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000505 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000506 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000507 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000508 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000509 com_error(c, PyExc_SystemError,
510 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000511 }
512 if (c->c_code == NULL)
513 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000514 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000515 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000516 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000517 c->c_errors++;
518 return;
519 }
520 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000521 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000522}
523
524static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000525com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000526{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000527 com_addbyte(c, x & 0xff);
528 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000529}
530
531static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000532com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000533{
534 int size;
535 char *p;
536 if (c->c_lnotab == NULL)
537 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000538 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000539 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000540 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000541 c->c_errors++;
542 return;
543 }
544 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000545 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000546 *p++ = addr;
547 *p++ = line;
548 c->c_lnotab_next += 2;
549}
550
551static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000552com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000553{
554 c->c_lineno = lineno;
555 if (c->c_firstlineno == 0) {
556 c->c_firstlineno = c->c_last_line = lineno;
557 }
558 else {
559 int incr_addr = c->c_nexti - c->c_last_addr;
560 int incr_line = lineno - c->c_last_line;
561 while (incr_addr > 0 || incr_line > 0) {
562 int trunc_addr = incr_addr;
563 int trunc_line = incr_line;
564 if (trunc_addr > 255)
565 trunc_addr = 255;
566 if (trunc_line > 255)
567 trunc_line = 255;
568 com_add_lnotab(c, trunc_addr, trunc_line);
569 incr_addr -= trunc_addr;
570 incr_line -= trunc_line;
571 }
572 c->c_last_addr = c->c_nexti;
573 c->c_last_line = lineno;
574 }
575}
576
577static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000578com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000579{
Fred Drakeef8ace32000-08-24 00:32:09 +0000580 int extended_arg = arg >> 16;
Guido van Rossum8e793d91997-03-03 19:13:14 +0000581 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000582 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000583 if (Py_OptimizeFlag)
584 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000585 }
Fred Drakeef8ace32000-08-24 00:32:09 +0000586 if (extended_arg){
587 com_addbyte(c, EXTENDED_ARG);
588 com_addint(c, extended_arg);
589 arg &= 0xffff;
590 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000591 com_addbyte(c, op);
592 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000593}
594
595static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000596com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000597{
598 /* Compile a forward reference for backpatching */
599 int here;
600 int anchor;
601 com_addbyte(c, op);
602 here = c->c_nexti;
603 anchor = *p_anchor;
604 *p_anchor = here;
605 com_addint(c, anchor == 0 ? 0 : here - anchor);
606}
607
608static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000609com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000610{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000611 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000612 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000613 int dist;
614 int prev;
615 for (;;) {
616 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000617 prev = code[anchor] + (code[anchor+1] << 8);
618 dist = target - (anchor+2);
619 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000620 dist >>= 8;
621 code[anchor+1] = dist;
622 dist >>= 8;
623 if (dist) {
624 com_error(c, PyExc_SystemError,
625 "com_backpatch: offset too large");
626 break;
627 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000628 if (!prev)
629 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000630 anchor -= prev;
631 }
632}
633
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000634/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000635
636static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000637com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000638{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000639 PyObject *w, *t, *np=NULL;
640 long n;
641
642 t = Py_BuildValue("(OO)", v, v->ob_type);
643 if (t == NULL)
644 goto fail;
645 w = PyDict_GetItem(dict, t);
646 if (w != NULL) {
647 n = PyInt_AsLong(w);
648 } else {
649 n = PyList_Size(list);
650 np = PyInt_FromLong(n);
651 if (np == NULL)
652 goto fail;
653 if (PyList_Append(list, v) != 0)
654 goto fail;
655 if (PyDict_SetItem(dict, t, np) != 0)
656 goto fail;
657 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000658 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000659 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000660 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000661 fail:
662 Py_XDECREF(np);
663 Py_XDECREF(t);
664 c->c_errors++;
665 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000666}
667
668static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000669com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000670{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000671 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000672}
673
674static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000675com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000676{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000677 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000678}
679
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000680#ifdef PRIVATE_NAME_MANGLING
681static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000682com_mangle(struct compiling *c, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000683{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000684 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000685 This is independent from how the name is used. */
686 char *p;
Guido van Rossum582acec2000-06-28 22:07:35 +0000687 size_t nlen, plen;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000688 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000689 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000690 return 0; /* Don't mangle __extremely_long_names */
691 if (name[nlen-1] == '_' && name[nlen-2] == '_')
692 return 0; /* Don't mangle __whatever__ */
693 p = c->c_private;
694 /* Strip leading underscores from class name */
695 while (*p == '_')
696 p++;
697 if (*p == '\0')
698 return 0; /* Don't mangle if class is just underscores */
699 plen = strlen(p);
700 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000701 plen = maxlen-nlen-2; /* Truncate class name if too long */
702 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000703 buffer[0] = '_';
704 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000705 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000706 /* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
707 return 1;
708}
709#endif
710
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000711static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000712com_addopnamestr(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000713{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000714 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000715 int i;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000716#ifdef PRIVATE_NAME_MANGLING
717 char buffer[256];
718 if (name != NULL && name[0] == '_' && name[1] == '_' &&
719 c->c_private != NULL &&
Guido van Rossum582acec2000-06-28 22:07:35 +0000720 com_mangle(c, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000721 name = buffer;
722#endif
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000723 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000724 c->c_errors++;
725 i = 255;
726 }
727 else {
728 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000729 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000730 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000731 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
732 switch (op) {
733 case LOAD_NAME:
734 case STORE_NAME:
735 case DELETE_NAME:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000736 if (PyDict_GetItemString(c->c_globals, name) != NULL) {
Guido van Rossumc5e96291991-12-10 13:53:51 +0000737 switch (op) {
738 case LOAD_NAME: op = LOAD_GLOBAL; break;
739 case STORE_NAME: op = STORE_GLOBAL; break;
740 case DELETE_NAME: op = DELETE_GLOBAL; break;
741 }
742 }
743 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000744 com_addoparg(c, op, i);
745}
746
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000747static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000748com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000749{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000750 char *name;
751 char buffer[1000];
752 /* XXX it is possible to write this code without the 1000
753 chars on the total length of dotted names, I just can't be
754 bothered right now */
755 if (TYPE(n) == STAR)
756 name = "*";
757 else if (TYPE(n) == dotted_name) {
758 char *p = buffer;
759 int i;
760 name = buffer;
761 for (i = 0; i < NCH(n); i += 2) {
762 char *s = STR(CHILD(n, i));
763 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000764 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000765 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +0000766 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000767 break;
768 }
769 if (p != buffer)
770 *p++ = '.';
771 strcpy(p, s);
772 p = strchr(p, '\0');
773 }
774 }
775 else {
776 REQ(n, NAME);
777 name = STR(n);
778 }
779 com_addopnamestr(c, op, name);
780}
781
Guido van Rossum79f25d91997-04-29 20:08:16 +0000782static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000783parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000784{
Tim Petersdbd9ba62000-07-09 03:09:57 +0000785 extern double atof(const char *);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000786 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000787 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000788 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +0000789#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +0000790 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +0000791 int imflag;
792#endif
793
Guido van Rossum282914b1991-04-04 10:42:56 +0000794 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000795 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +0000796#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +0000797 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +0000798#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000799 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000800 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000801 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000802 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000803 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000804 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000805 if (*end == '\0') {
806 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000807 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000808 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000809 return NULL;
810 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000811 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000812 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000813 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +0000814#ifndef WITHOUT_COMPLEX
815 if (imflag) {
816 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000817 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +0000818 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000819 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000820 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +0000821 }
Guido van Rossumac1fc951997-10-08 15:23:55 +0000822 else
Guido van Rossum50564e81996-01-12 01:13:16 +0000823#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +0000824 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000825 PyFPE_START_PROTECT("atof", return 0)
826 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000827 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000828 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000829 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000830}
831
Guido van Rossum79f25d91997-04-29 20:08:16 +0000832static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000833parsestr(char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000834{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000835 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +0000836 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000837 char *buf;
838 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000839 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000840 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +0000841 int first = *s;
842 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000843 int rawmode = 0;
844 int unicode = 0;
845 if (isalpha(quote) || quote == '_') {
846 if (quote == 'u' || quote == 'U') {
847 quote = *++s;
848 unicode = 1;
849 }
850 if (quote == 'r' || quote == 'R') {
851 quote = *++s;
852 rawmode = 1;
853 }
854 }
Guido van Rossum8054fad1993-10-26 15:19:44 +0000855 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000856 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000857 return NULL;
858 }
859 s++;
860 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +0000861 if (len > INT_MAX) {
862 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
863 return NULL;
864 }
Guido van Rossum8054fad1993-10-26 15:19:44 +0000865 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000866 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000867 return NULL;
868 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000869 if (len >= 4 && s[0] == quote && s[1] == quote) {
870 s += 2;
871 len -= 2;
872 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000873 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000874 return NULL;
875 }
876 }
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +0000877 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000878 if (rawmode)
879 return PyUnicode_DecodeRawUnicodeEscape(
880 s, len, NULL);
881 else
882 return PyUnicode_DecodeUnicodeEscape(
883 s, len, NULL);
884 }
885 else if (rawmode || strchr(s, '\\') == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000886 return PyString_FromStringAndSize(s, len);
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000887 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000888 v = PyString_FromStringAndSize((char *)NULL, len);
889 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000890 end = s + len;
891 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000892 if (*s != '\\') {
893 *p++ = *s++;
894 continue;
895 }
896 s++;
897 switch (*s++) {
898 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000899 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000900 case '\\': *p++ = '\\'; break;
901 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000902 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000903 case 'b': *p++ = '\b'; break;
904 case 'f': *p++ = '\014'; break; /* FF */
905 case 't': *p++ = '\t'; break;
906 case 'n': *p++ = '\n'; break;
907 case 'r': *p++ = '\r'; break;
908 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000909 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
910 case '0': case '1': case '2': case '3':
911 case '4': case '5': case '6': case '7':
912 c = s[-1] - '0';
913 if ('0' <= *s && *s <= '7') {
914 c = (c<<3) + *s++ - '0';
915 if ('0' <= *s && *s <= '7')
916 c = (c<<3) + *s++ - '0';
917 }
918 *p++ = c;
919 break;
920 case 'x':
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000921 if (isxdigit(Py_CHARMASK(*s))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000922 unsigned int x = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000923 do {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000924 c = Py_CHARMASK(*s);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000925 s++;
Guido van Rossumed1100f1997-10-20 23:24:07 +0000926 x = (x<<4) & ~0xF;
927 if (isdigit(c))
928 x += c - '0';
929 else if (islower(c))
930 x += 10 + c - 'a';
931 else
932 x += 10 + c - 'A';
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000933 } while (isxdigit(Py_CHARMASK(*s)));
Guido van Rossumed1100f1997-10-20 23:24:07 +0000934 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000935 break;
936 }
937 /* FALLTHROUGH */
938 default: *p++ = '\\'; *p++ = s[-1]; break;
939 }
940 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000941 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000942 return v;
943}
944
Guido van Rossum79f25d91997-04-29 20:08:16 +0000945static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000946parsestrplus(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000947{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000948 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000949 int i;
950 REQ(CHILD(n, 0), STRING);
951 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
952 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +0000953 for (i = 1; i < NCH(n); i++) {
954 PyObject *s;
955 s = parsestr(STR(CHILD(n, i)));
956 if (s == NULL)
957 goto onError;
958 if (PyString_Check(v) && PyString_Check(s)) {
959 PyString_ConcatAndDel(&v, s);
960 if (v == NULL)
961 goto onError;
962 }
963 else {
964 PyObject *temp;
965 temp = PyUnicode_Concat(v, s);
966 Py_DECREF(s);
967 if (temp == NULL)
968 goto onError;
969 Py_DECREF(v);
970 v = temp;
971 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000972 }
973 }
974 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +0000975
976 onError:
977 Py_XDECREF(v);
978 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000979}
980
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000981static void
Skip Montanaro803d6e52000-08-12 18:09:51 +0000982com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000983{
Skip Montanaro803d6e52000-08-12 18:09:51 +0000984 PyObject *v;
985 int anchor = 0;
986 int save_begin = c->c_begin;
987
988 /* list_iter: for v in expr [list_iter] */
989 com_node(c, CHILD(n, 3)); /* expr */
990 v = PyInt_FromLong(0L);
991 if (v == NULL)
992 c->c_errors++;
993 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
994 com_push(c, 1);
995 Py_XDECREF(v);
996 c->c_begin = c->c_nexti;
997 com_addoparg(c, SET_LINENO, n->n_lineno);
998 com_addfwref(c, FOR_LOOP, &anchor);
999 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001000 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001001 c->c_loops++;
1002 com_list_iter(c, n, e, t);
1003 c->c_loops--;
1004 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1005 c->c_begin = save_begin;
1006 com_backpatch(c, anchor);
1007 com_pop(c, 2); /* FOR_LOOP has popped these */
1008}
1009
1010static void
1011com_list_if(struct compiling *c, node *n, node *e, char *t)
1012{
1013 int anchor = 0;
1014 int a = 0;
1015 /* list_iter: 'if' test [list_iter] */
1016 com_addoparg(c, SET_LINENO, n->n_lineno);
1017 com_node(c, CHILD(n, 1));
1018 com_addfwref(c, JUMP_IF_FALSE, &a);
1019 com_addbyte(c, POP_TOP);
1020 com_pop(c, 1);
1021 com_list_iter(c, n, e, t);
1022 com_addfwref(c, JUMP_FORWARD, &anchor);
1023 com_backpatch(c, a);
1024 /* We jump here with an extra entry which we now pop */
1025 com_addbyte(c, POP_TOP);
1026 com_backpatch(c, anchor);
1027}
1028
1029static void
1030com_list_iter(struct compiling *c,
1031 node *p, /* parent of list_iter node */
1032 node *e, /* element expression node */
1033 char *t /* name of result list temp local */)
1034{
1035 /* list_iter is the last child in a listmaker, list_for, or list_if */
1036 node *n = CHILD(p, NCH(p)-1);
1037 if (TYPE(n) == list_iter) {
1038 n = CHILD(n, 0);
1039 switch (TYPE(n)) {
1040 case list_for:
1041 com_list_for(c, n, e, t);
1042 break;
1043 case list_if:
1044 com_list_if(c, n, e, t);
1045 break;
1046 default:
1047 com_error(c, PyExc_SystemError,
1048 "invalid list_iter node type");
1049 }
1050 }
1051 else {
1052 com_addopnamestr(c, LOAD_NAME, t);
1053 com_push(c, 1);
1054 com_node(c, e);
1055 com_addoparg(c, CALL_FUNCTION, 1);
1056 com_addbyte(c, POP_TOP);
1057 com_pop(c, 2);
1058 }
1059}
1060
1061static void
1062com_list_comprehension(struct compiling *c, node *n)
1063{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001064 /* listmaker: test list_for */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001065 char tmpname[12];
1066 sprintf(tmpname, "__%d__", ++c->c_tmpname);
1067 com_addoparg(c, BUILD_LIST, 0);
1068 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1069 com_push(c, 2);
1070 com_addopnamestr(c, LOAD_ATTR, "append");
1071 com_addopnamestr(c, STORE_NAME, tmpname);
1072 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001073 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001074 com_addopnamestr(c, DELETE_NAME, tmpname);
1075 --c->c_tmpname;
1076}
1077
1078static void
1079com_listmaker(struct compiling *c, node *n)
1080{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001081 /* listmaker: test ( list_for | (',' test)* [','] ) */
1082 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001083 com_list_comprehension(c, n);
1084 else {
1085 int len = 0;
1086 int i;
1087 for (i = 0; i < NCH(n); i += 2, len++)
1088 com_node(c, CHILD(n, i));
1089 com_addoparg(c, BUILD_LIST, len);
1090 com_pop(c, len-1);
1091 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001092}
1093
1094static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001095com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001096{
1097 int i;
1098 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1099 for (i = 0; i+2 < NCH(n); i += 4) {
1100 /* We must arrange things just right for STORE_SUBSCR.
1101 It wants the stack to look like (value) (dict) (key) */
1102 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001103 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001104 com_node(c, CHILD(n, i+2)); /* value */
1105 com_addbyte(c, ROT_TWO);
1106 com_node(c, CHILD(n, i)); /* key */
1107 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001108 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001109 }
1110}
1111
1112static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001113com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001114{
1115 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001116 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001117 int i;
1118 REQ(n, atom);
1119 ch = CHILD(n, 0);
1120 switch (TYPE(ch)) {
1121 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001122 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001123 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001124 com_push(c, 1);
1125 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001126 else
1127 com_node(c, CHILD(n, 1));
1128 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001129 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001130 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001131 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001132 com_push(c, 1);
1133 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001134 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001135 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001136 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001137 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001138 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001139 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001140 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001141 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001142 break;
1143 case BACKQUOTE:
1144 com_node(c, CHILD(n, 1));
1145 com_addbyte(c, UNARY_CONVERT);
1146 break;
1147 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001148 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001149 i = 255;
1150 }
1151 else {
1152 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001153 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001154 }
1155 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001156 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001157 break;
1158 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001159 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001160 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001161 c->c_errors++;
1162 i = 255;
1163 }
1164 else {
1165 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001166 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001167 }
1168 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001169 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001170 break;
1171 case NAME:
1172 com_addopname(c, LOAD_NAME, ch);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001173 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001174 break;
1175 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001176 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001177 com_error(c, PyExc_SystemError,
1178 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001179 }
1180}
1181
1182static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001183com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001184{
1185 if (NCH(n) == 1) {
1186 com_addbyte(c, op);
1187 }
1188 else if (NCH(n) == 2) {
1189 if (TYPE(CHILD(n, 0)) != COLON) {
1190 com_node(c, CHILD(n, 0));
1191 com_addbyte(c, op+1);
1192 }
1193 else {
1194 com_node(c, CHILD(n, 1));
1195 com_addbyte(c, op+2);
1196 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001197 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001198 }
1199 else {
1200 com_node(c, CHILD(n, 0));
1201 com_node(c, CHILD(n, 2));
1202 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001203 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001204 }
1205}
1206
Guido van Rossum635abd21997-01-06 22:56:52 +00001207static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001208com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1209{
1210 if (NCH(n) == 1) {
1211 com_addbyte(c, DUP_TOP);
1212 com_push(c, 1);
1213 com_addbyte(c, SLICE);
1214 com_node(c, augn);
1215 com_addbyte(c, opcode);
1216 com_pop(c, 1);
1217 com_addbyte(c, ROT_TWO);
1218 com_addbyte(c, STORE_SLICE);
1219 com_pop(c, 2);
1220 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1221 com_node(c, CHILD(n, 0));
1222 com_addoparg(c, DUP_TOPX, 2);
1223 com_push(c, 2);
1224 com_addbyte(c, SLICE+1);
1225 com_pop(c, 1);
1226 com_node(c, augn);
1227 com_addbyte(c, opcode);
1228 com_pop(c, 1);
1229 com_addbyte(c, ROT_THREE);
1230 com_addbyte(c, STORE_SLICE+1);
1231 com_pop(c, 3);
1232 } else if (NCH(n) == 2) {
1233 com_node(c, CHILD(n, 1));
1234 com_addoparg(c, DUP_TOPX, 2);
1235 com_push(c, 2);
1236 com_addbyte(c, SLICE+2);
1237 com_pop(c, 1);
1238 com_node(c, augn);
1239 com_addbyte(c, opcode);
1240 com_pop(c, 1);
1241 com_addbyte(c, ROT_THREE);
1242 com_addbyte(c, STORE_SLICE+2);
1243 com_pop(c, 3);
1244 } else {
1245 com_node(c, CHILD(n, 0));
1246 com_node(c, CHILD(n, 2));
1247 com_addoparg(c, DUP_TOPX, 3);
1248 com_push(c, 3);
1249 com_addbyte(c, SLICE+3);
1250 com_pop(c, 2);
1251 com_node(c, augn);
1252 com_addbyte(c, opcode);
1253 com_pop(c, 1);
1254 com_addbyte(c, ROT_FOUR);
1255 com_addbyte(c, STORE_SLICE+3);
1256 com_pop(c, 4);
1257 }
1258}
1259
1260static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001261com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001262{
1263 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001264 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001265 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001266 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001267 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001268 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001269 }
1270 else {
1271 com_node(c, CHILD(n, 0));
1272 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001273 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001274 }
1275 m = n;
1276 do {
1277 m = CHILD(m, 0);
1278 } while (NCH(m) == 1);
1279 if (TYPE(m) != NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001280 com_error(c, PyExc_SyntaxError,
1281 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001282 }
1283 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001284 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001285 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001286 *pkeywords = PyDict_New();
Guido van Rossum635abd21997-01-06 22:56:52 +00001287 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001288 c->c_errors++;
1289 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001290 if (PyDict_GetItem(*pkeywords, v) != NULL)
1291 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001292 "duplicate keyword argument");
1293 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001294 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001295 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001296 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001297 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001298 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001299 }
1300 }
1301 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001302}
1303
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001304static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001305com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001306{
1307 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001308 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001309 }
1310 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001311 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001312 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001313 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001314 int star_flag = 0;
1315 int starstar_flag = 0;
1316 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001317 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001318 na = 0;
1319 nk = 0;
1320 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001321 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001322 if (TYPE(ch) == STAR ||
1323 TYPE(ch) == DOUBLESTAR)
1324 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001325 if (ch->n_lineno != lineno) {
1326 lineno = ch->n_lineno;
1327 com_addoparg(c, SET_LINENO, lineno);
1328 }
1329 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001330 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001331 na++;
1332 else
1333 nk++;
1334 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001335 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001336 while (i < NCH(n)) {
1337 node *tok = CHILD(n, i);
1338 node *ch = CHILD(n, i+1);
1339 i += 3;
1340 switch (TYPE(tok)) {
1341 case STAR: star_flag = 1; break;
1342 case DOUBLESTAR: starstar_flag = 1; break;
1343 }
1344 com_node(c, ch);
1345 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001346 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001347 com_error(c, PyExc_SyntaxError,
1348 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001349 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001350 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001351 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001352 star_flag + (starstar_flag << 1);
1353 else
1354 opcode = CALL_FUNCTION;
1355 com_addoparg(c, opcode, na | (nk << 8));
1356 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001357 }
1358}
1359
1360static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001361com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001362{
1363 com_addopname(c, LOAD_ATTR, n);
1364}
1365
1366static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001367com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001368{
1369 int i=0;
1370 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001371 node *ch;
1372
1373 /* first argument */
1374 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001375 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001376 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001377 i++;
1378 }
1379 else {
1380 com_node(c, CHILD(n,i));
1381 i++;
1382 REQ(CHILD(n,i),COLON);
1383 i++;
1384 }
1385 /* second argument */
1386 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1387 com_node(c, CHILD(n,i));
1388 i++;
1389 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001390 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001391 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001392 com_push(c, 1);
1393 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001394 /* remaining arguments */
1395 for (; i < NCH(n); i++) {
1396 ns++;
1397 ch=CHILD(n,i);
1398 REQ(ch, sliceop);
1399 if (NCH(ch) == 1) {
1400 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001401 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001402 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001403 }
1404 else
1405 com_node(c, CHILD(ch,1));
1406 }
1407 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001408 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001409}
1410
1411static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001412com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001413{
1414 node *ch;
1415 REQ(n, subscript);
1416 ch = CHILD(n,0);
1417 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001418 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001419 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001420 com_push(c, 1);
1421 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001422 else {
1423 /* check for slice */
1424 if ((TYPE(ch) == COLON || NCH(n) > 1))
1425 com_sliceobj(c, n);
1426 else {
1427 REQ(ch, test);
1428 com_node(c, ch);
1429 }
1430 }
1431}
1432
1433static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001434com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001435{
1436 int i, op;
1437 REQ(n, subscriptlist);
1438 /* Check to make backward compatible slice behavior for '[i:j]' */
1439 if (NCH(n) == 1) {
1440 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001441 /* 'Basic' slice, should have exactly one colon. */
1442 if ((TYPE(CHILD(sub, 0)) == COLON
1443 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1444 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1445 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001446 switch (assigning) {
1447 case OP_DELETE:
1448 op = DELETE_SLICE;
1449 break;
1450 case OP_ASSIGN:
1451 op = STORE_SLICE;
1452 break;
1453 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001454 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001455 break;
1456 default:
1457 com_augassign_slice(c, sub, assigning, augn);
1458 return;
1459 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001460 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001461 if (op == STORE_SLICE)
1462 com_pop(c, 2);
1463 else if (op == DELETE_SLICE)
1464 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001465 return;
1466 }
1467 }
1468 /* Else normal subscriptlist. Compile each subscript. */
1469 for (i = 0; i < NCH(n); i += 2)
1470 com_subscript(c, CHILD(n, i));
1471 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001472 if (NCH(n) > 1) {
1473 i = (NCH(n)+1) / 2;
1474 com_addoparg(c, BUILD_TUPLE, i);
1475 com_pop(c, i-1);
1476 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001477 switch (assigning) {
1478 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001479 op = DELETE_SUBSCR;
1480 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001481 break;
1482 default:
1483 case OP_ASSIGN:
1484 op = STORE_SUBSCR;
1485 i = 3;
1486 break;
1487 case OP_APPLY:
1488 op = BINARY_SUBSCR;
1489 i = 1;
1490 break;
1491 }
1492 if (assigning > OP_APPLY) {
1493 com_addoparg(c, DUP_TOPX, 2);
1494 com_push(c, 2);
1495 com_addbyte(c, BINARY_SUBSCR);
1496 com_pop(c, 1);
1497 com_node(c, augn);
1498 com_addbyte(c, assigning);
1499 com_pop(c, 1);
1500 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001501 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001502 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001503 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001504}
1505
1506static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001507com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001508{
1509 REQ(n, trailer);
1510 switch (TYPE(CHILD(n, 0))) {
1511 case LPAR:
1512 com_call_function(c, CHILD(n, 1));
1513 break;
1514 case DOT:
1515 com_select_member(c, CHILD(n, 1));
1516 break;
1517 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00001518 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001519 break;
1520 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001521 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001522 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001523 }
1524}
1525
1526static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001527com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001528{
1529 int i;
1530 REQ(n, power);
1531 com_atom(c, CHILD(n, 0));
1532 for (i = 1; i < NCH(n); i++) {
1533 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1534 com_factor(c, CHILD(n, i+1));
1535 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001536 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001537 break;
1538 }
1539 else
1540 com_apply_trailer(c, CHILD(n, i));
1541 }
1542}
1543
1544static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001545com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001546{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001547 REQ(n, factor);
1548 if (TYPE(CHILD(n, 0)) == PLUS) {
1549 com_factor(c, CHILD(n, 1));
1550 com_addbyte(c, UNARY_POSITIVE);
1551 }
1552 else if (TYPE(CHILD(n, 0)) == MINUS) {
1553 com_factor(c, CHILD(n, 1));
1554 com_addbyte(c, UNARY_NEGATIVE);
1555 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001556 else if (TYPE(CHILD(n, 0)) == TILDE) {
1557 com_factor(c, CHILD(n, 1));
1558 com_addbyte(c, UNARY_INVERT);
1559 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001560 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001561 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001562 }
1563}
1564
1565static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001566com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001567{
1568 int i;
1569 int op;
1570 REQ(n, term);
1571 com_factor(c, CHILD(n, 0));
1572 for (i = 2; i < NCH(n); i += 2) {
1573 com_factor(c, CHILD(n, i));
1574 switch (TYPE(CHILD(n, i-1))) {
1575 case STAR:
1576 op = BINARY_MULTIPLY;
1577 break;
1578 case SLASH:
1579 op = BINARY_DIVIDE;
1580 break;
1581 case PERCENT:
1582 op = BINARY_MODULO;
1583 break;
1584 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001585 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001586 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001587 op = 255;
1588 }
1589 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001590 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001591 }
1592}
1593
1594static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001595com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001596{
1597 int i;
1598 int op;
1599 REQ(n, arith_expr);
1600 com_term(c, CHILD(n, 0));
1601 for (i = 2; i < NCH(n); i += 2) {
1602 com_term(c, CHILD(n, i));
1603 switch (TYPE(CHILD(n, i-1))) {
1604 case PLUS:
1605 op = BINARY_ADD;
1606 break;
1607 case MINUS:
1608 op = BINARY_SUBTRACT;
1609 break;
1610 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001611 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001612 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001613 op = 255;
1614 }
1615 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001616 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001617 }
1618}
1619
1620static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001621com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001622{
1623 int i;
1624 int op;
1625 REQ(n, shift_expr);
1626 com_arith_expr(c, CHILD(n, 0));
1627 for (i = 2; i < NCH(n); i += 2) {
1628 com_arith_expr(c, CHILD(n, i));
1629 switch (TYPE(CHILD(n, i-1))) {
1630 case LEFTSHIFT:
1631 op = BINARY_LSHIFT;
1632 break;
1633 case RIGHTSHIFT:
1634 op = BINARY_RSHIFT;
1635 break;
1636 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001637 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001638 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001639 op = 255;
1640 }
1641 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001642 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001643 }
1644}
1645
1646static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001647com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001648{
1649 int i;
1650 int op;
1651 REQ(n, and_expr);
1652 com_shift_expr(c, CHILD(n, 0));
1653 for (i = 2; i < NCH(n); i += 2) {
1654 com_shift_expr(c, CHILD(n, i));
1655 if (TYPE(CHILD(n, i-1)) == AMPER) {
1656 op = BINARY_AND;
1657 }
1658 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001659 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001660 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001661 op = 255;
1662 }
1663 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001664 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001665 }
1666}
1667
1668static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001669com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001670{
1671 int i;
1672 int op;
1673 REQ(n, xor_expr);
1674 com_and_expr(c, CHILD(n, 0));
1675 for (i = 2; i < NCH(n); i += 2) {
1676 com_and_expr(c, CHILD(n, i));
1677 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1678 op = BINARY_XOR;
1679 }
1680 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001681 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001682 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001683 op = 255;
1684 }
1685 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001686 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001687 }
1688}
1689
1690static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001691com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001692{
1693 int i;
1694 int op;
1695 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001696 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001697 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001698 com_xor_expr(c, CHILD(n, i));
1699 if (TYPE(CHILD(n, i-1)) == VBAR) {
1700 op = BINARY_OR;
1701 }
1702 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001703 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001704 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001705 op = 255;
1706 }
1707 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001708 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001709 }
1710}
1711
1712static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001713cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001714{
1715 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001716 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001717 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1718 if (NCH(n) == 1) {
1719 n = CHILD(n, 0);
1720 switch (TYPE(n)) {
1721 case LESS: return LT;
1722 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001723 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001724 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001725 case LESSEQUAL: return LE;
1726 case GREATEREQUAL: return GE;
1727 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001728 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1729 if (strcmp(STR(n), "is") == 0) return IS;
1730 }
1731 }
1732 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001733 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001734 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1735 return NOT_IN;
1736 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1737 return IS_NOT;
1738 }
1739 }
1740 return BAD;
1741}
1742
1743static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001744com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001745{
1746 int i;
1747 enum cmp_op op;
1748 int anchor;
1749 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1750 com_expr(c, CHILD(n, 0));
1751 if (NCH(n) == 1)
1752 return;
1753
1754 /****************************************************************
1755 The following code is generated for all but the last
1756 comparison in a chain:
1757
1758 label: on stack: opcode: jump to:
1759
1760 a <code to load b>
1761 a, b DUP_TOP
1762 a, b, b ROT_THREE
1763 b, a, b COMPARE_OP
1764 b, 0-or-1 JUMP_IF_FALSE L1
1765 b, 1 POP_TOP
1766 b
1767
1768 We are now ready to repeat this sequence for the next
1769 comparison in the chain.
1770
1771 For the last we generate:
1772
1773 b <code to load c>
1774 b, c COMPARE_OP
1775 0-or-1
1776
1777 If there were any jumps to L1 (i.e., there was more than one
1778 comparison), we generate:
1779
1780 0-or-1 JUMP_FORWARD L2
1781 L1: b, 0 ROT_TWO
1782 0, b POP_TOP
1783 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00001784 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001785 ****************************************************************/
1786
1787 anchor = 0;
1788
1789 for (i = 2; i < NCH(n); i += 2) {
1790 com_expr(c, CHILD(n, i));
1791 if (i+2 < NCH(n)) {
1792 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001793 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001794 com_addbyte(c, ROT_THREE);
1795 }
1796 op = cmp_type(CHILD(n, i-1));
1797 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001798 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001799 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001800 }
1801 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001802 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001803 if (i+2 < NCH(n)) {
1804 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1805 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001806 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001807 }
1808 }
1809
1810 if (anchor) {
1811 int anchor2 = 0;
1812 com_addfwref(c, JUMP_FORWARD, &anchor2);
1813 com_backpatch(c, anchor);
1814 com_addbyte(c, ROT_TWO);
1815 com_addbyte(c, POP_TOP);
1816 com_backpatch(c, anchor2);
1817 }
1818}
1819
1820static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001821com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001822{
1823 REQ(n, not_test); /* 'not' not_test | comparison */
1824 if (NCH(n) == 1) {
1825 com_comparison(c, CHILD(n, 0));
1826 }
1827 else {
1828 com_not_test(c, CHILD(n, 1));
1829 com_addbyte(c, UNARY_NOT);
1830 }
1831}
1832
1833static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001834com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001835{
1836 int i;
1837 int anchor;
1838 REQ(n, and_test); /* not_test ('and' not_test)* */
1839 anchor = 0;
1840 i = 0;
1841 for (;;) {
1842 com_not_test(c, CHILD(n, i));
1843 if ((i += 2) >= NCH(n))
1844 break;
1845 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1846 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001847 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001848 }
1849 if (anchor)
1850 com_backpatch(c, anchor);
1851}
1852
1853static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001854com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001855{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001856 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00001857 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001858 PyObject *v;
Guido van Rossum57531fe1993-11-30 14:57:42 +00001859 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001860 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001861 v = (PyObject *) icompile(CHILD(n, 0), c);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001862 if (v == NULL) {
1863 c->c_errors++;
1864 i = 255;
1865 }
1866 else {
1867 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001868 Py_DECREF(v);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001869 }
1870 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001871 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001872 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001873 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001874 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001875 else {
1876 int anchor = 0;
1877 int i = 0;
1878 for (;;) {
1879 com_and_test(c, CHILD(n, i));
1880 if ((i += 2) >= NCH(n))
1881 break;
1882 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1883 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001884 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001885 }
1886 if (anchor)
1887 com_backpatch(c, anchor);
1888 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001889}
1890
1891static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001892com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001893{
1894 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001895 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001896 com_node(c, CHILD(n, 0));
1897 }
1898 else {
1899 int i;
1900 int len;
1901 len = (NCH(n) + 1) / 2;
1902 for (i = 0; i < NCH(n); i += 2)
1903 com_node(c, CHILD(n, i));
1904 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001905 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001906 }
1907}
1908
1909
1910/* Begin of assignment compilation */
1911
Thomas Wouters434d0822000-08-24 20:11:32 +00001912
1913static void
1914com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
1915{
1916 com_addbyte(c, DUP_TOP);
1917 com_push(c, 1);
1918 com_addopname(c, LOAD_ATTR, n);
1919 com_pop(c, 1);
1920 com_node(c, augn);
1921 com_addbyte(c, opcode);
1922 com_pop(c, 1);
1923 com_addbyte(c, ROT_TWO);
1924 com_addopname(c, STORE_ATTR, n);
1925 com_pop(c, 2);
1926}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001927
1928static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001929com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001930{
1931 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001932 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001933}
1934
1935static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001936com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001937{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001938 REQ(n, trailer);
1939 switch (TYPE(CHILD(n, 0))) {
1940 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001941 com_error(c, PyExc_SyntaxError,
1942 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001943 break;
1944 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00001945 if (assigning > OP_APPLY)
1946 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
1947 else
1948 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001949 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001950 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00001951 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001952 break;
1953 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001954 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001955 }
1956}
1957
1958static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001959com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001960{
1961 int i;
1962 if (TYPE(n) != testlist)
1963 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001964 if (assigning) {
1965 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001966 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001967 com_push(c, i-1);
1968 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001969 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00001970 com_assign(c, CHILD(n, i), assigning, NULL);
1971}
1972
1973static void
1974com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
1975{
1976 REQ(n, NAME);
1977 com_addopname(c, LOAD_NAME, n);
1978 com_push(c, 1);
1979 com_node(c, augn);
1980 com_addbyte(c, opcode);
1981 com_pop(c, 1);
1982 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001983}
1984
1985static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001986com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001987{
1988 REQ(n, NAME);
1989 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001990 if (assigning)
1991 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001992}
1993
1994static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001995com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001996{
1997 /* Loop to avoid trivial recursion */
1998 for (;;) {
1999 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002000
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002001 case exprlist:
2002 case testlist:
2003 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002004 if (assigning > OP_APPLY) {
2005 com_error(c, PyExc_SyntaxError,
2006 "augmented assign to tuple not possible");
2007 return;
2008 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002009 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002010 return;
2011 }
2012 n = CHILD(n, 0);
2013 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002014
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002015 case test:
2016 case and_test:
2017 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002018 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002019 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002020 case xor_expr:
2021 case and_expr:
2022 case shift_expr:
2023 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002024 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002025 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002026 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002027 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002028 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002029 return;
2030 }
2031 n = CHILD(n, 0);
2032 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002033
Guido van Rossum50564e81996-01-12 01:13:16 +00002034 case power: /* atom trailer* ('**' power)* */
2035/* ('+'|'-'|'~') factor | atom trailer* */
2036 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002037 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002038 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002039 return;
2040 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002041 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002042 int i;
2043 com_node(c, CHILD(n, 0));
2044 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002045 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002046 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002047 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002048 return;
2049 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002050 com_apply_trailer(c, CHILD(n, i));
2051 } /* NB i is still alive */
2052 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002053 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002054 return;
2055 }
2056 n = CHILD(n, 0);
2057 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002058
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002059 case atom:
2060 switch (TYPE(CHILD(n, 0))) {
2061 case LPAR:
2062 n = CHILD(n, 1);
2063 if (TYPE(n) == RPAR) {
2064 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002065 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002066 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002067 return;
2068 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002069 if (assigning > OP_APPLY) {
2070 com_error(c, PyExc_SyntaxError,
2071 "augmented assign to tuple not possible");
2072 return;
2073 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002074 break;
2075 case LSQB:
2076 n = CHILD(n, 1);
2077 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002078 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002079 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002080 return;
2081 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002082 if (assigning > OP_APPLY) {
2083 com_error(c, PyExc_SyntaxError,
2084 "augmented assign to list not possible");
2085 return;
2086 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002087 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002088 return;
2089 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002090 if (assigning > OP_APPLY)
2091 com_augassign_name(c, CHILD(n, 0),
2092 assigning, augn);
2093 else
2094 com_assign_name(c, CHILD(n, 0),
2095 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002096 return;
2097 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002098 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002099 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002100 return;
2101 }
2102 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002103
2104 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002105 com_error(c, PyExc_SyntaxError,
2106 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002107 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002108
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002109 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002110 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002111 com_error(c, PyExc_SystemError,
2112 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002113 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002114
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002115 }
2116 }
2117}
Guido van Rossum7c531111997-03-11 18:42:21 +00002118
Thomas Wouters434d0822000-08-24 20:11:32 +00002119static void
2120com_augassign(struct compiling *c, node *n)
2121{
2122 int opcode;
2123
2124 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2125 case '+': opcode = INPLACE_ADD; break;
2126 case '-': opcode = INPLACE_SUBTRACT; break;
2127 case '/': opcode = INPLACE_DIVIDE; break;
2128 case '%': opcode = INPLACE_MODULO; break;
2129 case '<': opcode = INPLACE_LSHIFT; break;
2130 case '>': opcode = INPLACE_RSHIFT; break;
2131 case '&': opcode = INPLACE_AND; break;
2132 case '^': opcode = INPLACE_XOR; break;
2133 case '|': opcode = INPLACE_OR; break;
2134 case '*':
2135 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2136 opcode = INPLACE_POWER;
2137 else
2138 opcode = INPLACE_MULTIPLY;
2139 break;
2140 default:
2141 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2142 return;
2143 }
2144 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2145}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002146
2147static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002148com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002149{
Thomas Wouters434d0822000-08-24 20:11:32 +00002150 REQ(n, expr_stmt);
2151 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002152 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002153 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002154 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002155 if (NCH(n) == 1) {
2156 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002157 if (c->c_interactive)
2158 com_addbyte(c, PRINT_EXPR);
2159 else
2160 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002161 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002162 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002163 else if (TYPE(CHILD(n,1)) == augassign)
2164 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002165 else {
2166 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002167 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002168 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002169 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002170 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002171 com_push(c, 1);
2172 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002173 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002174 }
2175 }
2176}
2177
2178static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002179com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002180{
2181 int a = 0, b = 0;
2182 int i;
2183 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2184 /* Generate code like for
2185
2186 if __debug__:
2187 if not <test>:
2188 raise AssertionError [, <message>]
2189
2190 where <message> is the second test, if present.
2191 */
2192 if (Py_OptimizeFlag)
2193 return;
2194 com_addopnamestr(c, LOAD_GLOBAL, "__debug__");
2195 com_push(c, 1);
2196 com_addfwref(c, JUMP_IF_FALSE, &a);
2197 com_addbyte(c, POP_TOP);
2198 com_pop(c, 1);
2199 com_node(c, CHILD(n, 1));
2200 com_addfwref(c, JUMP_IF_TRUE, &b);
2201 com_addbyte(c, POP_TOP);
2202 com_pop(c, 1);
2203 /* Raise that exception! */
2204 com_addopnamestr(c, LOAD_GLOBAL, "AssertionError");
2205 com_push(c, 1);
2206 i = NCH(n)/2; /* Either 2 or 4 */
2207 if (i > 1)
2208 com_node(c, CHILD(n, 3));
2209 com_addoparg(c, RAISE_VARARGS, i);
2210 com_pop(c, i);
2211 /* The interpreter does not fall through */
2212 /* All jumps converge here */
2213 com_backpatch(c, a);
2214 com_backpatch(c, b);
2215 com_addbyte(c, POP_TOP);
2216}
2217
2218static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002219com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002220{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002221 int i = 1;
2222 node* stream = NULL;
2223
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002224 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002225
2226 /* are we using the extended print form? */
2227 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2228 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002229 com_node(c, stream);
2230 /* stack: [...] => [... stream] */
2231 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002232 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2233 i = 4;
2234 else
2235 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002236 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002237 for (; i < NCH(n); i += 2) {
2238 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002239 com_addbyte(c, DUP_TOP);
2240 /* stack: [stream] => [stream stream] */
2241 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002242 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002243 /* stack: [stream stream] => [stream stream obj] */
2244 com_addbyte(c, ROT_TWO);
2245 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002246 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002247 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002248 com_pop(c, 2);
2249 }
2250 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002251 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002252 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002253 com_addbyte(c, PRINT_ITEM);
2254 com_pop(c, 1);
2255 }
2256 }
2257 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002258 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002259 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002260 /* must pop the extra stream object off the stack */
2261 com_addbyte(c, POP_TOP);
2262 /* stack: [... stream] => [...] */
2263 com_pop(c, 1);
2264 }
2265 }
2266 else {
2267 if (stream != NULL) {
2268 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002269 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002270 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002271 com_pop(c, 1);
2272 }
2273 else
2274 com_addbyte(c, PRINT_NEWLINE);
2275 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002276}
2277
2278static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002279com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002280{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002281 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002282 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002283 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002284 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002285 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002286 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002287 com_push(c, 1);
2288 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002289 else
2290 com_node(c, CHILD(n, 1));
2291 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002292 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002293}
2294
2295static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002296com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002297{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002298 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002299 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2300 if (NCH(n) > 1) {
2301 com_node(c, CHILD(n, 1));
2302 if (NCH(n) > 3) {
2303 com_node(c, CHILD(n, 3));
2304 if (NCH(n) > 5)
2305 com_node(c, CHILD(n, 5));
2306 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002307 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002308 i = NCH(n)/2;
2309 com_addoparg(c, RAISE_VARARGS, i);
2310 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002311}
2312
2313static void
Thomas Wouters52152252000-08-17 22:55:00 +00002314com_from_import(struct compiling *c, node *n)
2315{
2316 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2317 com_push(c, 1);
2318 if (NCH(n) > 1) {
2319 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2320 com_error(c, PyExc_SyntaxError, "invalid syntax");
2321 return;
2322 }
2323 com_addopname(c, STORE_NAME, CHILD(n, 2));
2324 } else
2325 com_addopname(c, STORE_NAME, CHILD(n, 0));
2326 com_pop(c, 1);
2327}
2328
2329static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002330com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002331{
2332 int i;
2333 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002334 /* 'import' dotted_name (',' dotted_name)* |
2335 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002336 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002337 /* 'from' dotted_name 'import' ... */
2338 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002339 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002340 com_push(c, 1);
Thomas Wouters52152252000-08-17 22:55:00 +00002341 if (TYPE(CHILD(n, 3)) == STAR)
2342 com_addbyte(c, IMPORT_STAR);
2343 else {
2344 for (i = 3; i < NCH(n); i += 2)
2345 com_from_import(c, CHILD(n, i));
2346 com_addbyte(c, POP_TOP);
2347 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002348 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002349 }
2350 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002351 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002352 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002353 node *subn = CHILD(n, i);
2354 REQ(subn, dotted_as_name);
2355 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002356 com_push(c, 1);
Thomas Wouters52152252000-08-17 22:55:00 +00002357 if (NCH(subn) > 1) {
Thomas Wouters8bad6122000-08-19 20:55:02 +00002358 if (strcmp(STR(CHILD(subn, 1)), "as") != 0 ||
2359 NCH(CHILD(subn, 0)) > 1) {
Thomas Wouters52152252000-08-17 22:55:00 +00002360 com_error(c, PyExc_SyntaxError,
2361 "invalid syntax");
2362 return;
2363 }
2364 com_addopname(c, STORE_NAME, CHILD(subn, 2));
2365 } else
2366 com_addopname(c, STORE_NAME,
2367 CHILD(CHILD(subn, 0),0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002368 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002369 }
2370 }
2371}
2372
2373static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002374com_global_stmt(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002375{
2376 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002377 REQ(n, global_stmt);
2378 /* 'global' NAME (',' NAME)* */
2379 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002380 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002381#ifdef PRIVATE_NAME_MANGLING
2382 char buffer[256];
2383 if (s != NULL && s[0] == '_' && s[1] == '_' &&
2384 c->c_private != NULL &&
Guido van Rossum582acec2000-06-28 22:07:35 +00002385 com_mangle(c, s, buffer, sizeof(buffer)))
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002386 s = buffer;
2387#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +00002388 if (PyDict_GetItemString(c->c_locals, s) != NULL) {
2389 com_error(c, PyExc_SyntaxError,
2390 "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002391 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002392 else if (PyDict_SetItemString(c->c_globals, s, Py_None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002393 c->c_errors++;
2394 }
2395}
2396
Guido van Rossum681d79a1995-07-18 14:51:37 +00002397static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002398com_newlocal_o(struct compiling *c, PyObject *nameval)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002399{
2400 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002401 PyObject *ival;
2402 if (PyList_Size(c->c_varnames) != c->c_nlocals) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002403 /* This is usually caused by an error on a previous call */
2404 if (c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002405 com_error(c, PyExc_SystemError,
2406 "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002407 }
2408 return 0;
2409 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002410 ival = PyInt_FromLong(i = c->c_nlocals++);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002411 if (ival == NULL)
2412 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002413 else if (PyDict_SetItem(c->c_locals, nameval, ival) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002414 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002415 else if (PyList_Append(c->c_varnames, nameval) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002416 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002417 Py_XDECREF(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002418 return i;
2419}
2420
2421static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002422com_addlocal_o(struct compiling *c, PyObject *nameval)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002423{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002424 PyObject *ival = PyDict_GetItem(c->c_locals, nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002425 if (ival != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002426 return PyInt_AsLong(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002427 return com_newlocal_o(c, nameval);
2428}
2429
2430static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002431com_newlocal(struct compiling *c, char *name)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002432{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002433 PyObject *nameval = PyString_InternFromString(name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002434 int i;
2435 if (nameval == NULL) {
2436 c->c_errors++;
2437 return 0;
2438 }
2439 i = com_newlocal_o(c, nameval);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002440 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002441 return i;
2442}
2443
Guido van Rossumc5e96291991-12-10 13:53:51 +00002444static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002445com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002446{
2447 REQ(n, exec_stmt);
2448 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2449 com_node(c, CHILD(n, 1));
2450 if (NCH(n) >= 4)
2451 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002452 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002453 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002454 com_push(c, 1);
2455 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002456 if (NCH(n) >= 6)
2457 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002458 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002459 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002460 com_push(c, 1);
2461 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002462 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002463 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002464}
2465
Guido van Rossum7c531111997-03-11 18:42:21 +00002466static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002467is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002468{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002469 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002470 int i;
2471
2472 /* Label to avoid tail recursion */
2473 next:
2474 switch (TYPE(n)) {
2475
2476 case suite:
2477 if (NCH(n) == 1) {
2478 n = CHILD(n, 0);
2479 goto next;
2480 }
2481 /* Fall through */
2482 case file_input:
2483 for (i = 0; i < NCH(n); i++) {
2484 node *ch = CHILD(n, i);
2485 if (TYPE(ch) == stmt) {
2486 n = ch;
2487 goto next;
2488 }
2489 }
2490 break;
2491
2492 case stmt:
2493 case simple_stmt:
2494 case small_stmt:
2495 n = CHILD(n, 0);
2496 goto next;
2497
2498 case expr_stmt:
2499 case testlist:
2500 case test:
2501 case and_test:
2502 case not_test:
2503 case comparison:
2504 case expr:
2505 case xor_expr:
2506 case and_expr:
2507 case shift_expr:
2508 case arith_expr:
2509 case term:
2510 case factor:
2511 case power:
2512 case atom:
2513 if (NCH(n) == 1) {
2514 n = CHILD(n, 0);
2515 goto next;
2516 }
2517 break;
2518
2519 case NAME:
2520 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2521 return 1;
2522 break;
2523
2524 case NUMBER:
2525 v = parsenumber(c, STR(n));
2526 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002527 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002528 break;
2529 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002530 i = PyObject_IsTrue(v);
2531 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002532 return i == 0;
2533
2534 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002535 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002536 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002537 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002538 break;
2539 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002540 i = PyObject_IsTrue(v);
2541 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002542 return i == 0;
2543
2544 }
2545 return 0;
2546}
2547
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002548static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002549com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002550{
2551 int i;
2552 int anchor = 0;
2553 REQ(n, if_stmt);
2554 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2555 for (i = 0; i+3 < NCH(n); i+=4) {
2556 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002557 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002558 if (is_constant_false(c, ch))
2559 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002560 if (i > 0)
2561 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002562 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002563 com_addfwref(c, JUMP_IF_FALSE, &a);
2564 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002565 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002566 com_node(c, CHILD(n, i+3));
2567 com_addfwref(c, JUMP_FORWARD, &anchor);
2568 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002569 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002570 com_addbyte(c, POP_TOP);
2571 }
2572 if (i+2 < NCH(n))
2573 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002574 if (anchor)
2575 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002576}
2577
2578static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002579com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002580{
2581 int break_anchor = 0;
2582 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002583 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002584 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2585 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002586 block_push(c, SETUP_LOOP);
2587 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002588 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002589 com_node(c, CHILD(n, 1));
2590 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2591 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002592 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002593 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002594 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002595 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002596 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2597 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002598 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002599 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002600 com_addbyte(c, POP_TOP);
2601 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002602 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002603 if (NCH(n) > 4)
2604 com_node(c, CHILD(n, 6));
2605 com_backpatch(c, break_anchor);
2606}
2607
2608static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002609com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002610{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002611 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002612 int break_anchor = 0;
2613 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002614 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002615 REQ(n, for_stmt);
2616 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2617 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002618 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002619 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002620 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002621 if (v == NULL)
2622 c->c_errors++;
2623 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002624 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002625 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002626 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002627 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002628 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002629 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00002630 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002631 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002632 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002633 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002634 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2635 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002636 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002637 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002638 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002639 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002640 if (NCH(n) > 8)
2641 com_node(c, CHILD(n, 8));
2642 com_backpatch(c, break_anchor);
2643}
2644
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002645/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002646
2647 SETUP_FINALLY L
2648 <code for S>
2649 POP_BLOCK
2650 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002651 L: <code for Sf>
2652 END_FINALLY
2653
2654 The special instructions use the block stack. Each block
2655 stack entry contains the instruction that created it (here
2656 SETUP_FINALLY), the level of the value stack at the time the
2657 block stack entry was created, and a label (here L).
2658
2659 SETUP_FINALLY:
2660 Pushes the current value stack level and the label
2661 onto the block stack.
2662 POP_BLOCK:
2663 Pops en entry from the block stack, and pops the value
2664 stack until its level is the same as indicated on the
2665 block stack. (The label is ignored.)
2666 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002667 Pops a variable number of entries from the *value* stack
2668 and re-raises the exception they specify. The number of
2669 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002670
2671 The block stack is unwound when an exception is raised:
2672 when a SETUP_FINALLY entry is found, the exception is pushed
2673 onto the value stack (and the exception condition is cleared),
2674 and the interpreter jumps to the label gotten from the block
2675 stack.
2676
2677 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002678 (The contents of the value stack is shown in [], with the top
2679 at the right; 'tb' is trace-back info, 'val' the exception's
2680 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002681
2682 Value stack Label Instruction Argument
2683 [] SETUP_EXCEPT L1
2684 [] <code for S>
2685 [] POP_BLOCK
2686 [] JUMP_FORWARD L0
2687
Guido van Rossum3f5da241990-12-20 15:06:42 +00002688 [tb, val, exc] L1: DUP )
2689 [tb, val, exc, exc] <evaluate E1> )
2690 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2691 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2692 [tb, val, exc, 1] POP )
2693 [tb, val, exc] POP
2694 [tb, val] <assign to V1> (or POP if no V1)
2695 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002696 [] <code for S1>
2697 JUMP_FORWARD L0
2698
Guido van Rossum3f5da241990-12-20 15:06:42 +00002699 [tb, val, exc, 0] L2: POP
2700 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002701 .............................etc.......................
2702
Guido van Rossum3f5da241990-12-20 15:06:42 +00002703 [tb, val, exc, 0] Ln+1: POP
2704 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002705
2706 [] L0: <next statement>
2707
2708 Of course, parts are not generated if Vi or Ei is not present.
2709*/
2710
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002711static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002712com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002713{
2714 int except_anchor = 0;
2715 int end_anchor = 0;
2716 int else_anchor = 0;
2717 int i;
2718 node *ch;
2719
2720 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2721 block_push(c, SETUP_EXCEPT);
2722 com_node(c, CHILD(n, 2));
2723 com_addbyte(c, POP_BLOCK);
2724 block_pop(c, SETUP_EXCEPT);
2725 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2726 com_backpatch(c, except_anchor);
2727 for (i = 3;
2728 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2729 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002730 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002731 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002732 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002733 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002734 break;
2735 }
2736 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002737 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002738 com_addoparg(c, SET_LINENO, ch->n_lineno);
2739 if (NCH(ch) > 1) {
2740 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002741 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002742 com_node(c, CHILD(ch, 1));
2743 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002744 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002745 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2746 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002747 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002748 }
2749 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002750 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002751 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00002752 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002753 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002754 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002755 com_pop(c, 1);
2756 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002757 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002758 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002759 com_node(c, CHILD(n, i+2));
2760 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2761 if (except_anchor) {
2762 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002763 /* We come in with [tb, val, exc, 0] on the
2764 stack; one pop and it's the same as
2765 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002766 com_addbyte(c, POP_TOP);
2767 }
2768 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002769 /* We actually come in here with [tb, val, exc] but the
2770 END_FINALLY will zap those and jump around.
2771 The c_stacklevel does not reflect them so we need not pop
2772 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002773 com_addbyte(c, END_FINALLY);
2774 com_backpatch(c, else_anchor);
2775 if (i < NCH(n))
2776 com_node(c, CHILD(n, i+2));
2777 com_backpatch(c, end_anchor);
2778}
2779
2780static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002781com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002782{
2783 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002784 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002785
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002786 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2787 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002788 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002789 com_addbyte(c, POP_BLOCK);
2790 block_pop(c, SETUP_FINALLY);
2791 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002792 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002793 /* While the generated code pushes only one item,
2794 the try-finally handling can enter here with
2795 up to three items. OK, here are the details:
2796 3 for an exception, 2 for RETURN, 1 for BREAK. */
2797 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002798 com_backpatch(c, finally_anchor);
2799 ch = CHILD(n, NCH(n)-1);
2800 com_addoparg(c, SET_LINENO, ch->n_lineno);
2801 com_node(c, ch);
2802 com_addbyte(c, END_FINALLY);
2803 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002804 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002805}
2806
2807static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002808com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002809{
2810 REQ(n, try_stmt);
2811 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2812 | 'try' ':' suite 'finally' ':' suite */
2813 if (TYPE(CHILD(n, 3)) != except_clause)
2814 com_try_finally(c, n);
2815 else
2816 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002817}
2818
Guido van Rossum8b993a91997-01-17 21:04:03 +00002819static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002820get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002821{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002822 int i;
2823
Guido van Rossum8b993a91997-01-17 21:04:03 +00002824 /* Label to avoid tail recursion */
2825 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002826 switch (TYPE(n)) {
2827
2828 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002829 if (NCH(n) == 1) {
2830 n = CHILD(n, 0);
2831 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002832 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002833 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002834 case file_input:
2835 for (i = 0; i < NCH(n); i++) {
2836 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002837 if (TYPE(ch) == stmt) {
2838 n = ch;
2839 goto next;
2840 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002841 }
2842 break;
2843
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002844 case stmt:
2845 case simple_stmt:
2846 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002847 n = CHILD(n, 0);
2848 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002849
2850 case expr_stmt:
2851 case testlist:
2852 case test:
2853 case and_test:
2854 case not_test:
2855 case comparison:
2856 case expr:
2857 case xor_expr:
2858 case and_expr:
2859 case shift_expr:
2860 case arith_expr:
2861 case term:
2862 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002863 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002864 if (NCH(n) == 1) {
2865 n = CHILD(n, 0);
2866 goto next;
2867 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002868 break;
2869
2870 case atom:
2871 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002872 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002873 break;
2874
2875 }
2876 return NULL;
2877}
2878
Guido van Rossum79f25d91997-04-29 20:08:16 +00002879static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002880get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002881{
Guido van Rossum541563e1999-01-28 15:08:09 +00002882 /* Don't generate doc-strings if run with -OO */
2883 if (Py_OptimizeFlag > 1)
2884 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002885 n = get_rawdocstring(n);
2886 if (n == NULL)
2887 return NULL;
2888 return parsestrplus(n);
2889}
2890
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002891static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002892com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002893{
2894 REQ(n, suite);
2895 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2896 if (NCH(n) == 1) {
2897 com_node(c, CHILD(n, 0));
2898 }
2899 else {
2900 int i;
2901 for (i = 0; i < NCH(n); i++) {
2902 node *ch = CHILD(n, i);
2903 if (TYPE(ch) == stmt)
2904 com_node(c, ch);
2905 }
2906 }
2907}
2908
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002909/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002910static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002911com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002912{
2913 int i = c->c_nblocks;
2914 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2915 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2916 }
2917 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002918 com_error(c, PyExc_SyntaxError,
2919 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002920 }
2921 /* XXX Could allow it inside a 'finally' clause
2922 XXX if we could pop the exception still on the stack */
2923}
2924
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002925static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002926com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002927{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002928 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002929 if (TYPE(n) == lambdef) {
2930 /* lambdef: 'lambda' [varargslist] ':' test */
2931 n = CHILD(n, 1);
2932 }
2933 else {
2934 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2935 n = CHILD(n, 2);
2936 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2937 n = CHILD(n, 1);
2938 }
2939 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002940 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002941 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002942 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002943 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2944 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002945 nargs = 0;
2946 ndefs = 0;
2947 for (i = 0; i < nch; i++) {
2948 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002949 if (TYPE(CHILD(n, i)) == STAR ||
2950 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002951 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002952 nargs++;
2953 i++;
2954 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002955 t = RPAR; /* Anything except EQUAL or COMMA */
2956 else
2957 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002958 if (t == EQUAL) {
2959 i++;
2960 ndefs++;
2961 com_node(c, CHILD(n, i));
2962 i++;
2963 if (i >= nch)
2964 break;
2965 t = TYPE(CHILD(n, i));
2966 }
2967 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00002968 /* Treat "(a=1, b)" as an error */
2969 if (ndefs)
2970 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00002971 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002972 }
2973 if (t != COMMA)
2974 break;
2975 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002976 return ndefs;
2977}
2978
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002979static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002980com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002981{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002982 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002983 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002984 v = (PyObject *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002985 if (v == NULL)
2986 c->c_errors++;
2987 else {
2988 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002989 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002990 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002991 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002992 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002993 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002994 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002995 com_pop(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002996 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002997 }
2998}
2999
3000static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003001com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003002{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003003 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003004 REQ(n, testlist);
3005 /* testlist: test (',' test)* [','] */
3006 for (i = 0; i < NCH(n); i += 2)
3007 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003008 i = (NCH(n)+1) / 2;
3009 com_addoparg(c, BUILD_TUPLE, i);
3010 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003011}
3012
3013static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003014com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003015{
Guido van Rossum25831651993-05-19 14:50:45 +00003016 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003017 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003018 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003019 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003020 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003021 c->c_errors++;
3022 return;
3023 }
3024 /* Push the class name on the stack */
3025 i = com_addconst(c, v);
3026 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003027 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003028 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003029 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003030 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003031 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003032 com_push(c, 1);
3033 }
Guido van Rossum25831651993-05-19 14:50:45 +00003034 else
3035 com_bases(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00003036 v = (PyObject *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003037 if (v == NULL)
3038 c->c_errors++;
3039 else {
Guido van Rossum25831651993-05-19 14:50:45 +00003040 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003041 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003042 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003043 com_addoparg(c, MAKE_FUNCTION, 0);
3044 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003045 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003046 com_pop(c, 2);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003047 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum79f25d91997-04-29 20:08:16 +00003048 Py_DECREF(v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003049 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003050}
3051
3052static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003053com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003054{
3055 switch (TYPE(n)) {
3056
3057 /* Definition nodes */
3058
3059 case funcdef:
3060 com_funcdef(c, n);
3061 break;
3062 case classdef:
3063 com_classdef(c, n);
3064 break;
3065
3066 /* Trivial parse tree nodes */
3067
3068 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003069 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003070 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003071 com_node(c, CHILD(n, 0));
3072 break;
3073
3074 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003075 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3076 com_addoparg(c, SET_LINENO, n->n_lineno);
3077 {
3078 int i;
3079 for (i = 0; i < NCH(n)-1; i += 2)
3080 com_node(c, CHILD(n, i));
3081 }
3082 break;
3083
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003084 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003085 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003086 com_node(c, CHILD(n, 0));
3087 break;
3088
3089 /* Statement nodes */
3090
3091 case expr_stmt:
3092 com_expr_stmt(c, n);
3093 break;
3094 case print_stmt:
3095 com_print_stmt(c, n);
3096 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003097 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003098 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003099 break;
3100 case pass_stmt:
3101 break;
3102 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003103 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003104 com_error(c, PyExc_SyntaxError,
3105 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003106 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003107 com_addbyte(c, BREAK_LOOP);
3108 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003109 case continue_stmt:
3110 com_continue_stmt(c, n);
3111 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003112 case return_stmt:
3113 com_return_stmt(c, n);
3114 break;
3115 case raise_stmt:
3116 com_raise_stmt(c, n);
3117 break;
3118 case import_stmt:
3119 com_import_stmt(c, n);
3120 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003121 case global_stmt:
3122 com_global_stmt(c, n);
3123 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003124 case exec_stmt:
3125 com_exec_stmt(c, n);
3126 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003127 case assert_stmt:
3128 com_assert_stmt(c, n);
3129 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003130 case if_stmt:
3131 com_if_stmt(c, n);
3132 break;
3133 case while_stmt:
3134 com_while_stmt(c, n);
3135 break;
3136 case for_stmt:
3137 com_for_stmt(c, n);
3138 break;
3139 case try_stmt:
3140 com_try_stmt(c, n);
3141 break;
3142 case suite:
3143 com_suite(c, n);
3144 break;
3145
3146 /* Expression nodes */
3147
3148 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003149 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003150 break;
3151 case test:
3152 com_test(c, n);
3153 break;
3154 case and_test:
3155 com_and_test(c, n);
3156 break;
3157 case not_test:
3158 com_not_test(c, n);
3159 break;
3160 case comparison:
3161 com_comparison(c, n);
3162 break;
3163 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003164 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003165 break;
3166 case expr:
3167 com_expr(c, n);
3168 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003169 case xor_expr:
3170 com_xor_expr(c, n);
3171 break;
3172 case and_expr:
3173 com_and_expr(c, n);
3174 break;
3175 case shift_expr:
3176 com_shift_expr(c, n);
3177 break;
3178 case arith_expr:
3179 com_arith_expr(c, n);
3180 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003181 case term:
3182 com_term(c, n);
3183 break;
3184 case factor:
3185 com_factor(c, n);
3186 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003187 case power:
3188 com_power(c, n);
3189 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003190 case atom:
3191 com_atom(c, n);
3192 break;
3193
3194 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003195 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003196 com_error(c, PyExc_SystemError,
3197 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003198 }
3199}
3200
Tim Petersdbd9ba62000-07-09 03:09:57 +00003201static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003202
3203static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003204com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003205{
3206 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3207 if (TYPE(CHILD(n, 0)) == LPAR)
3208 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003209 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003210 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003211 com_pop(c, 1);
3212 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003213}
3214
3215static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003216com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003217{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003218 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003219 if (NCH(n) == 1) {
3220 com_fpdef(c, CHILD(n, 0));
3221 }
3222 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003223 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003224 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003225 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003226 for (i = 0; i < NCH(n); i += 2)
3227 com_fpdef(c, CHILD(n, i));
3228 }
3229}
3230
3231static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003232com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003233{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003234 int nch, i;
3235 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003236 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003237 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003238 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003239 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003240 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003241 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003242 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003243 node *ch = CHILD(n, i);
3244 node *fp;
3245 char *name;
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003246 PyObject *nameval;
Guido van Rossum50564e81996-01-12 01:13:16 +00003247 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003248 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003249 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3250 fp = CHILD(ch, 0);
3251 if (TYPE(fp) == NAME)
3252 name = STR(fp);
3253 else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003254 name = nbuf;
3255 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003256 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003257 }
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003258 nameval = PyString_InternFromString(name);
3259 if (nameval == NULL) {
3260 c->c_errors++;
3261 }
Peter Schneider-Kamp9a5086c2000-07-13 06:24:29 +00003262 if (PyDict_GetItem(c->c_locals, nameval)) {
Fred Drakedcf08e02000-08-15 15:49:44 +00003263 com_error(c, PyExc_SyntaxError,
3264 "duplicate argument in function definition");
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003265 }
3266 com_newlocal_o(c, nameval);
3267 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003268 c->c_argcount++;
3269 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003270 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003271 ch = CHILD(n, i);
3272 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003273 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003274 else
3275 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003276 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003277 /* Handle *arguments */
3278 if (i < nch) {
3279 node *ch;
3280 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003281 if (TYPE(ch) != DOUBLESTAR) {
3282 REQ(ch, STAR);
3283 ch = CHILD(n, i+1);
3284 if (TYPE(ch) == NAME) {
3285 c->c_flags |= CO_VARARGS;
3286 i += 3;
3287 com_newlocal(c, STR(ch));
3288 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003289 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003290 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003291 /* Handle **keywords */
3292 if (i < nch) {
3293 node *ch;
3294 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003295 if (TYPE(ch) != DOUBLESTAR) {
3296 REQ(ch, STAR);
3297 ch = CHILD(n, i+1);
3298 REQ(ch, STAR);
3299 ch = CHILD(n, i+2);
3300 }
3301 else
3302 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003303 REQ(ch, NAME);
3304 c->c_flags |= CO_VARKEYWORDS;
3305 com_newlocal(c, STR(ch));
3306 }
3307 if (complex) {
3308 /* Generate code for complex arguments only after
3309 having counted the simple arguments */
3310 int ilocal = 0;
3311 for (i = 0; i < nch; i++) {
3312 node *ch = CHILD(n, i);
3313 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003314 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003315 break;
3316 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3317 fp = CHILD(ch, 0);
3318 if (TYPE(fp) != NAME) {
3319 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003320 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003321 com_fpdef(c, ch);
3322 }
3323 ilocal++;
3324 if (++i >= nch)
3325 break;
3326 ch = CHILD(n, i);
3327 if (TYPE(ch) == EQUAL)
3328 i += 2;
3329 else
3330 REQ(ch, COMMA);
3331 }
3332 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003333}
3334
3335static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003336com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003337{
3338 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003339 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003340 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003341 doc = get_docstring(n);
3342 if (doc != NULL) {
3343 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003344 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003345 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003346 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003347 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003348 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003349 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003350 for (i = 0; i < NCH(n); i++) {
3351 node *ch = CHILD(n, i);
3352 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3353 com_node(c, ch);
3354 }
3355}
3356
3357/* Top-level compile-node interface */
3358
3359static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003360compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003361{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003362 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003363 node *ch;
3364 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003365 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003366 doc = get_docstring(CHILD(n, 4));
3367 if (doc != NULL) {
3368 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003369 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003370 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003371 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003372 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003373 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3374 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003375 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003376 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003377 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003378 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003379 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003380 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003381 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003382 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003383 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003384}
3385
3386static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003387compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003388{
Guido van Rossum590baa41993-11-30 13:40:46 +00003389 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003390 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003391 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003392
3393 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003394 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003395 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003396 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003397 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003398 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003399 else
3400 ch = CHILD(n, 2);
3401 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003402 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003403 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003404}
3405
3406static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003407compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003408{
3409 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003410 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003411 REQ(n, classdef);
3412 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3413 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003414#ifdef PRIVATE_NAME_MANGLING
3415 c->c_private = c->c_name;
3416#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003417 ch = CHILD(n, NCH(n)-1); /* The suite */
3418 doc = get_docstring(ch);
3419 if (doc != NULL) {
3420 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003421 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003422 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003423 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003424 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003425 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003426 }
3427 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003428 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003429 com_node(c, ch);
3430 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003431 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003432 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003433 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003434}
3435
3436static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003437compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003438{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003439 com_addoparg(c, SET_LINENO, n->n_lineno);
3440
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003441 switch (TYPE(n)) {
3442
Guido van Rossum4c417781991-01-21 16:09:22 +00003443 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003444 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003445 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003446 n = CHILD(n, 0);
3447 if (TYPE(n) != NEWLINE)
3448 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003449 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003450 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003451 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003452 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003453 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003454 break;
3455
Guido van Rossum4c417781991-01-21 16:09:22 +00003456 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003457 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003458 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003459 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003460 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003461 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003462 break;
3463
Guido van Rossum590baa41993-11-30 13:40:46 +00003464 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003465 com_node(c, CHILD(n, 0));
3466 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003467 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003468 break;
3469
Guido van Rossum590baa41993-11-30 13:40:46 +00003470 case lambdef: /* anonymous function definition */
3471 compile_lambdef(c, n);
3472 break;
3473
Guido van Rossum4c417781991-01-21 16:09:22 +00003474 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003475 compile_funcdef(c, n);
3476 break;
3477
Guido van Rossum4c417781991-01-21 16:09:22 +00003478 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003479 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003480 break;
3481
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003482 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003483 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003484 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003485 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003486 }
3487}
3488
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003489/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00003490
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003491 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
3492 instructions that refer to local variables with LOAD_FAST etc.
3493 The latter instructions are much faster because they don't need to
3494 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003495
Guido van Rossum681d79a1995-07-18 14:51:37 +00003496 To find all local variables, we check all STORE_NAME, IMPORT_FROM
3497 and DELETE_NAME instructions. This yields all local variables,
3498 function definitions, class definitions and import statements.
3499 Argument names have already been entered into the list by the
3500 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003501
3502 All remaining LOAD_NAME instructions must refer to non-local (global
3503 or builtin) variables, so are replaced by LOAD_GLOBAL.
3504
3505 There are two problems: 'from foo import *' and 'exec' may introduce
3506 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00003507 case, we can still optimize bona fide locals (since those
3508 statements will be surrounded by fast_2_locals() and
3509 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003510
Guido van Rossum681d79a1995-07-18 14:51:37 +00003511 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00003512
3513static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003514optimize(struct compiling *c)
Guido van Rossum282914b1991-04-04 10:42:56 +00003515{
Guido van Rossum0a697f61991-04-16 08:39:12 +00003516 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00003517 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00003518 int oparg = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003519 PyObject *name;
3520 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003521
Guido van Rossum282914b1991-04-04 10:42:56 +00003522#define NEXTOP() (*next_instr++)
3523#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossum79f25d91997-04-29 20:08:16 +00003524#define GETITEM(v, i) (PyList_GetItem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003525#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
3526
Guido van Rossum79f25d91997-04-29 20:08:16 +00003527 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003528
3529 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00003530
Guido van Rossum79f25d91997-04-29 20:08:16 +00003531 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003532 for (;;) {
3533 opcode = NEXTOP();
3534 if (opcode == STOP_CODE)
3535 break;
3536 if (HAS_ARG(opcode))
3537 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +00003538 dispatch_opcode1:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003539 switch (opcode) {
3540 case STORE_NAME:
3541 case DELETE_NAME:
3542 case IMPORT_FROM:
3543 com_addlocal_o(c, GETNAMEOBJ(oparg));
3544 break;
Thomas Wouters52152252000-08-17 22:55:00 +00003545 case IMPORT_STAR:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003546 case EXEC_STMT:
3547 c->c_flags &= ~CO_OPTIMIZED;
3548 break;
Fred Drakeef8ace32000-08-24 00:32:09 +00003549 case EXTENDED_ARG:
3550 opcode = NEXTOP();
3551 oparg = oparg<<16 | NEXTARG();
3552 goto dispatch_opcode1;
3553 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00003554 }
3555 }
3556
Thomas Wouters52152252000-08-17 22:55:00 +00003557 /* TBD: Is this still necessary ? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003558 if (PyDict_GetItemString(c->c_locals, "*") != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003559 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003560
Guido van Rossum79f25d91997-04-29 20:08:16 +00003561 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003562 for (;;) {
3563 cur_instr = next_instr;
3564 opcode = NEXTOP();
3565 if (opcode == STOP_CODE)
3566 break;
3567 if (HAS_ARG(opcode))
3568 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +00003569 dispatch_opcode2:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003570 if (opcode == LOAD_NAME ||
3571 opcode == STORE_NAME ||
3572 opcode == DELETE_NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003573 PyObject *v;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003574 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00003575 name = GETNAMEOBJ(oparg);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003576 v = PyDict_GetItem(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003577 if (v == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003578 if (opcode == LOAD_NAME &&
3579 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003580 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003581 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00003582 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003583 i = PyInt_AsLong(v);
Fred Drakeef8ace32000-08-24 00:32:09 +00003584 if (i >> 16) /* too big for 2 bytes */
3585 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003586 switch (opcode) {
3587 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
3588 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
3589 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
3590 }
3591 cur_instr[1] = i & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +00003592 cur_instr[2] = i >> 8;
3593 }
3594 if (opcode == EXTENDED_ARG) {
3595 opcode = NEXTOP();
3596 oparg = oparg<<16 | NEXTARG();
3597 goto dispatch_opcode2;
Guido van Rossum282914b1991-04-04 10:42:56 +00003598 }
3599 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003600
Guido van Rossum681d79a1995-07-18 14:51:37 +00003601 if (c->c_errors == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00003602 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00003603}
3604
Guido van Rossum79f25d91997-04-29 20:08:16 +00003605PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003606PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003607{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003608 return jcompile(n, filename, NULL);
3609}
3610
Guido van Rossum79f25d91997-04-29 20:08:16 +00003611static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003612icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003613{
3614 return jcompile(n, base->c_filename, base);
3615}
3616
Guido van Rossum79f25d91997-04-29 20:08:16 +00003617static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003618jcompile(node *n, char *filename, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003619{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003620 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003621 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003622 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003623 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003624#ifdef PRIVATE_NAME_MANGLING
3625 if (base)
3626 sc.c_private = base->c_private;
3627 else
3628 sc.c_private = NULL;
3629#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003630 compile_node(&sc, n);
3631 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003632 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003633 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003634 sc.c_flags |= CO_NEWLOCALS;
3635 }
3636 else if (TYPE(n) == classdef)
3637 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00003638 co = NULL;
3639 if (sc.c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003640 PyObject *consts, *names, *varnames, *filename, *name;
3641 consts = PyList_AsTuple(sc.c_consts);
3642 names = PyList_AsTuple(sc.c_names);
3643 varnames = PyList_AsTuple(sc.c_varnames);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003644 filename = PyString_InternFromString(sc.c_filename);
3645 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003646 if (!PyErr_Occurred())
3647 co = PyCode_New(sc.c_argcount,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003648 sc.c_nlocals,
Guido van Rossum8b993a91997-01-17 21:04:03 +00003649 sc.c_maxstacklevel,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003650 sc.c_flags,
3651 sc.c_code,
3652 consts,
3653 names,
3654 varnames,
3655 filename,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003656 name,
3657 sc.c_firstlineno,
3658 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003659 Py_XDECREF(consts);
3660 Py_XDECREF(names);
3661 Py_XDECREF(varnames);
3662 Py_XDECREF(filename);
3663 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003664 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003665 else if (!PyErr_Occurred()) {
3666 /* This could happen if someone called PyErr_Clear() after an
3667 error was reported above. That's not supposed to happen,
3668 but I just plugged one case and I'm not sure there can't be
3669 others. In that case, raise SystemError so that at least
3670 it gets reported instead dumping core. */
3671 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3672 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003673 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003674 return co;
3675}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003676
3677int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003678PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003679{
3680 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003681 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003682 int line = co->co_firstlineno;
3683 int addr = 0;
3684 while (--size >= 0) {
3685 addr += *p++;
3686 if (addr > addrq)
3687 break;
3688 line += *p++;
3689 }
3690 return line;
3691}