blob: e8462c653961384ee825b2ed375f9fb4f6e5543a [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);
Thomas Wouters434d0822000-08-24 20:11:32 +00001919 com_node(c, augn);
1920 com_addbyte(c, opcode);
1921 com_pop(c, 1);
1922 com_addbyte(c, ROT_TWO);
1923 com_addopname(c, STORE_ATTR, n);
1924 com_pop(c, 2);
1925}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001926
1927static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001928com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001929{
1930 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001931 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001932}
1933
1934static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001935com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001936{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001937 REQ(n, trailer);
1938 switch (TYPE(CHILD(n, 0))) {
1939 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001940 com_error(c, PyExc_SyntaxError,
1941 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001942 break;
1943 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00001944 if (assigning > OP_APPLY)
1945 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
1946 else
1947 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001948 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001949 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00001950 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001951 break;
1952 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001953 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001954 }
1955}
1956
1957static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001958com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001959{
1960 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00001961 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001962 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001963 if (assigning) {
1964 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001965 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001966 com_push(c, i-1);
1967 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001968 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00001969 com_assign(c, CHILD(n, i), assigning, NULL);
1970}
1971
1972static void
1973com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
1974{
1975 REQ(n, NAME);
1976 com_addopname(c, LOAD_NAME, n);
1977 com_push(c, 1);
1978 com_node(c, augn);
1979 com_addbyte(c, opcode);
1980 com_pop(c, 1);
1981 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001982}
1983
1984static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001985com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001986{
1987 REQ(n, NAME);
1988 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001989 if (assigning)
1990 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001991}
1992
1993static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001994com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001995{
1996 /* Loop to avoid trivial recursion */
1997 for (;;) {
1998 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001999
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002000 case exprlist:
2001 case testlist:
2002 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002003 if (assigning > OP_APPLY) {
2004 com_error(c, PyExc_SyntaxError,
2005 "augmented assign to tuple not possible");
2006 return;
2007 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002008 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002009 return;
2010 }
2011 n = CHILD(n, 0);
2012 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002013
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002014 case test:
2015 case and_test:
2016 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002017 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002018 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002019 case xor_expr:
2020 case and_expr:
2021 case shift_expr:
2022 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002023 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002024 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002025 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002026 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002027 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002028 return;
2029 }
2030 n = CHILD(n, 0);
2031 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002032
Guido van Rossum50564e81996-01-12 01:13:16 +00002033 case power: /* atom trailer* ('**' power)* */
2034/* ('+'|'-'|'~') factor | atom trailer* */
2035 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002036 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002037 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002038 return;
2039 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002040 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002041 int i;
2042 com_node(c, CHILD(n, 0));
2043 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002044 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002045 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002046 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002047 return;
2048 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002049 com_apply_trailer(c, CHILD(n, i));
2050 } /* NB i is still alive */
2051 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002052 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002053 return;
2054 }
2055 n = CHILD(n, 0);
2056 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002057
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002058 case atom:
2059 switch (TYPE(CHILD(n, 0))) {
2060 case LPAR:
2061 n = CHILD(n, 1);
2062 if (TYPE(n) == RPAR) {
2063 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002064 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002065 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002066 return;
2067 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002068 if (assigning > OP_APPLY) {
2069 com_error(c, PyExc_SyntaxError,
2070 "augmented assign to tuple not possible");
2071 return;
2072 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002073 break;
2074 case LSQB:
2075 n = CHILD(n, 1);
2076 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002077 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002078 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002079 return;
2080 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002081 if (assigning > OP_APPLY) {
2082 com_error(c, PyExc_SyntaxError,
2083 "augmented assign to list not possible");
2084 return;
2085 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002086 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002087 return;
2088 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002089 if (assigning > OP_APPLY)
2090 com_augassign_name(c, CHILD(n, 0),
2091 assigning, augn);
2092 else
2093 com_assign_name(c, CHILD(n, 0),
2094 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002095 return;
2096 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002097 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002098 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002099 return;
2100 }
2101 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002102
2103 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002104 com_error(c, PyExc_SyntaxError,
2105 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002106 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002107
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002108 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002109 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002110 com_error(c, PyExc_SystemError,
2111 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002112 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002113
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002114 }
2115 }
2116}
Guido van Rossum7c531111997-03-11 18:42:21 +00002117
Thomas Wouters434d0822000-08-24 20:11:32 +00002118static void
2119com_augassign(struct compiling *c, node *n)
2120{
2121 int opcode;
2122
2123 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2124 case '+': opcode = INPLACE_ADD; break;
2125 case '-': opcode = INPLACE_SUBTRACT; break;
2126 case '/': opcode = INPLACE_DIVIDE; break;
2127 case '%': opcode = INPLACE_MODULO; break;
2128 case '<': opcode = INPLACE_LSHIFT; break;
2129 case '>': opcode = INPLACE_RSHIFT; break;
2130 case '&': opcode = INPLACE_AND; break;
2131 case '^': opcode = INPLACE_XOR; break;
2132 case '|': opcode = INPLACE_OR; break;
2133 case '*':
2134 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2135 opcode = INPLACE_POWER;
2136 else
2137 opcode = INPLACE_MULTIPLY;
2138 break;
2139 default:
2140 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2141 return;
2142 }
2143 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2144}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002145
2146static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002147com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002148{
Thomas Wouters434d0822000-08-24 20:11:32 +00002149 REQ(n, expr_stmt);
2150 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002151 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002152 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002153 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002154 if (NCH(n) == 1) {
2155 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002156 if (c->c_interactive)
2157 com_addbyte(c, PRINT_EXPR);
2158 else
2159 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002160 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002161 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002162 else if (TYPE(CHILD(n,1)) == augassign)
2163 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002164 else {
2165 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002166 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002167 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002168 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002169 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002170 com_push(c, 1);
2171 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002172 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002173 }
2174 }
2175}
2176
2177static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002178com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002179{
2180 int a = 0, b = 0;
2181 int i;
2182 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2183 /* Generate code like for
2184
2185 if __debug__:
2186 if not <test>:
2187 raise AssertionError [, <message>]
2188
2189 where <message> is the second test, if present.
2190 */
2191 if (Py_OptimizeFlag)
2192 return;
2193 com_addopnamestr(c, LOAD_GLOBAL, "__debug__");
2194 com_push(c, 1);
2195 com_addfwref(c, JUMP_IF_FALSE, &a);
2196 com_addbyte(c, POP_TOP);
2197 com_pop(c, 1);
2198 com_node(c, CHILD(n, 1));
2199 com_addfwref(c, JUMP_IF_TRUE, &b);
2200 com_addbyte(c, POP_TOP);
2201 com_pop(c, 1);
2202 /* Raise that exception! */
2203 com_addopnamestr(c, LOAD_GLOBAL, "AssertionError");
2204 com_push(c, 1);
2205 i = NCH(n)/2; /* Either 2 or 4 */
2206 if (i > 1)
2207 com_node(c, CHILD(n, 3));
2208 com_addoparg(c, RAISE_VARARGS, i);
2209 com_pop(c, i);
2210 /* The interpreter does not fall through */
2211 /* All jumps converge here */
2212 com_backpatch(c, a);
2213 com_backpatch(c, b);
2214 com_addbyte(c, POP_TOP);
2215}
2216
2217static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002218com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002219{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002220 int i = 1;
2221 node* stream = NULL;
2222
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002223 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002224
2225 /* are we using the extended print form? */
2226 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2227 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002228 com_node(c, stream);
2229 /* stack: [...] => [... stream] */
2230 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002231 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2232 i = 4;
2233 else
2234 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002235 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002236 for (; i < NCH(n); i += 2) {
2237 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002238 com_addbyte(c, DUP_TOP);
2239 /* stack: [stream] => [stream stream] */
2240 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002241 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002242 /* stack: [stream stream] => [stream stream obj] */
2243 com_addbyte(c, ROT_TWO);
2244 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002245 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002246 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002247 com_pop(c, 2);
2248 }
2249 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002250 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002251 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002252 com_addbyte(c, PRINT_ITEM);
2253 com_pop(c, 1);
2254 }
2255 }
2256 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002257 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002258 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002259 /* must pop the extra stream object off the stack */
2260 com_addbyte(c, POP_TOP);
2261 /* stack: [... stream] => [...] */
2262 com_pop(c, 1);
2263 }
2264 }
2265 else {
2266 if (stream != NULL) {
2267 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002268 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002269 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002270 com_pop(c, 1);
2271 }
2272 else
2273 com_addbyte(c, PRINT_NEWLINE);
2274 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002275}
2276
2277static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002278com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002279{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002280 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002281 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002282 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002283 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002284 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002285 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002286 com_push(c, 1);
2287 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002288 else
2289 com_node(c, CHILD(n, 1));
2290 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002291 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002292}
2293
2294static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002295com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002296{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002297 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002298 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2299 if (NCH(n) > 1) {
2300 com_node(c, CHILD(n, 1));
2301 if (NCH(n) > 3) {
2302 com_node(c, CHILD(n, 3));
2303 if (NCH(n) > 5)
2304 com_node(c, CHILD(n, 5));
2305 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002306 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002307 i = NCH(n)/2;
2308 com_addoparg(c, RAISE_VARARGS, i);
2309 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002310}
2311
2312static void
Thomas Wouters52152252000-08-17 22:55:00 +00002313com_from_import(struct compiling *c, node *n)
2314{
2315 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2316 com_push(c, 1);
2317 if (NCH(n) > 1) {
2318 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2319 com_error(c, PyExc_SyntaxError, "invalid syntax");
2320 return;
2321 }
2322 com_addopname(c, STORE_NAME, CHILD(n, 2));
2323 } else
2324 com_addopname(c, STORE_NAME, CHILD(n, 0));
2325 com_pop(c, 1);
2326}
2327
2328static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002329com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002330{
2331 int i;
2332 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002333 /* 'import' dotted_name (',' dotted_name)* |
2334 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002335 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002336 /* 'from' dotted_name 'import' ... */
2337 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002338 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002339 com_push(c, 1);
Thomas Wouters52152252000-08-17 22:55:00 +00002340 if (TYPE(CHILD(n, 3)) == STAR)
2341 com_addbyte(c, IMPORT_STAR);
2342 else {
2343 for (i = 3; i < NCH(n); i += 2)
2344 com_from_import(c, CHILD(n, i));
2345 com_addbyte(c, POP_TOP);
2346 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002347 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002348 }
2349 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002350 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002351 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002352 node *subn = CHILD(n, i);
2353 REQ(subn, dotted_as_name);
2354 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002355 com_push(c, 1);
Thomas Wouters52152252000-08-17 22:55:00 +00002356 if (NCH(subn) > 1) {
Thomas Wouters8bad6122000-08-19 20:55:02 +00002357 if (strcmp(STR(CHILD(subn, 1)), "as") != 0 ||
2358 NCH(CHILD(subn, 0)) > 1) {
Thomas Wouters52152252000-08-17 22:55:00 +00002359 com_error(c, PyExc_SyntaxError,
2360 "invalid syntax");
2361 return;
2362 }
2363 com_addopname(c, STORE_NAME, CHILD(subn, 2));
2364 } else
2365 com_addopname(c, STORE_NAME,
2366 CHILD(CHILD(subn, 0),0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002367 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002368 }
2369 }
2370}
2371
2372static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002373com_global_stmt(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002374{
2375 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002376 REQ(n, global_stmt);
2377 /* 'global' NAME (',' NAME)* */
2378 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002379 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002380#ifdef PRIVATE_NAME_MANGLING
2381 char buffer[256];
2382 if (s != NULL && s[0] == '_' && s[1] == '_' &&
2383 c->c_private != NULL &&
Guido van Rossum582acec2000-06-28 22:07:35 +00002384 com_mangle(c, s, buffer, sizeof(buffer)))
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002385 s = buffer;
2386#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +00002387 if (PyDict_GetItemString(c->c_locals, s) != NULL) {
2388 com_error(c, PyExc_SyntaxError,
2389 "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002390 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002391 else if (PyDict_SetItemString(c->c_globals, s, Py_None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002392 c->c_errors++;
2393 }
2394}
2395
Guido van Rossum681d79a1995-07-18 14:51:37 +00002396static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002397com_newlocal_o(struct compiling *c, PyObject *nameval)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002398{
2399 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002400 PyObject *ival;
2401 if (PyList_Size(c->c_varnames) != c->c_nlocals) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002402 /* This is usually caused by an error on a previous call */
2403 if (c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002404 com_error(c, PyExc_SystemError,
2405 "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002406 }
2407 return 0;
2408 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002409 ival = PyInt_FromLong(i = c->c_nlocals++);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002410 if (ival == NULL)
2411 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002412 else if (PyDict_SetItem(c->c_locals, nameval, ival) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002413 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002414 else if (PyList_Append(c->c_varnames, nameval) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002415 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002416 Py_XDECREF(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002417 return i;
2418}
2419
2420static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002421com_addlocal_o(struct compiling *c, PyObject *nameval)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002422{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002423 PyObject *ival = PyDict_GetItem(c->c_locals, nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002424 if (ival != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002425 return PyInt_AsLong(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002426 return com_newlocal_o(c, nameval);
2427}
2428
2429static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002430com_newlocal(struct compiling *c, char *name)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002431{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002432 PyObject *nameval = PyString_InternFromString(name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002433 int i;
2434 if (nameval == NULL) {
2435 c->c_errors++;
2436 return 0;
2437 }
2438 i = com_newlocal_o(c, nameval);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002439 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002440 return i;
2441}
2442
Guido van Rossumc5e96291991-12-10 13:53:51 +00002443static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002444com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002445{
2446 REQ(n, exec_stmt);
2447 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2448 com_node(c, CHILD(n, 1));
2449 if (NCH(n) >= 4)
2450 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002451 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002452 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002453 com_push(c, 1);
2454 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002455 if (NCH(n) >= 6)
2456 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002457 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002458 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002459 com_push(c, 1);
2460 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002461 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002462 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002463}
2464
Guido van Rossum7c531111997-03-11 18:42:21 +00002465static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002466is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002467{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002468 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002469 int i;
2470
2471 /* Label to avoid tail recursion */
2472 next:
2473 switch (TYPE(n)) {
2474
2475 case suite:
2476 if (NCH(n) == 1) {
2477 n = CHILD(n, 0);
2478 goto next;
2479 }
2480 /* Fall through */
2481 case file_input:
2482 for (i = 0; i < NCH(n); i++) {
2483 node *ch = CHILD(n, i);
2484 if (TYPE(ch) == stmt) {
2485 n = ch;
2486 goto next;
2487 }
2488 }
2489 break;
2490
2491 case stmt:
2492 case simple_stmt:
2493 case small_stmt:
2494 n = CHILD(n, 0);
2495 goto next;
2496
2497 case expr_stmt:
2498 case testlist:
2499 case test:
2500 case and_test:
2501 case not_test:
2502 case comparison:
2503 case expr:
2504 case xor_expr:
2505 case and_expr:
2506 case shift_expr:
2507 case arith_expr:
2508 case term:
2509 case factor:
2510 case power:
2511 case atom:
2512 if (NCH(n) == 1) {
2513 n = CHILD(n, 0);
2514 goto next;
2515 }
2516 break;
2517
2518 case NAME:
2519 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2520 return 1;
2521 break;
2522
2523 case NUMBER:
2524 v = parsenumber(c, STR(n));
2525 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002526 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002527 break;
2528 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002529 i = PyObject_IsTrue(v);
2530 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002531 return i == 0;
2532
2533 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002534 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002535 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002536 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002537 break;
2538 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002539 i = PyObject_IsTrue(v);
2540 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002541 return i == 0;
2542
2543 }
2544 return 0;
2545}
2546
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002547static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002548com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002549{
2550 int i;
2551 int anchor = 0;
2552 REQ(n, if_stmt);
2553 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2554 for (i = 0; i+3 < NCH(n); i+=4) {
2555 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002556 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002557 if (is_constant_false(c, ch))
2558 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002559 if (i > 0)
2560 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002561 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002562 com_addfwref(c, JUMP_IF_FALSE, &a);
2563 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002564 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002565 com_node(c, CHILD(n, i+3));
2566 com_addfwref(c, JUMP_FORWARD, &anchor);
2567 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002568 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002569 com_addbyte(c, POP_TOP);
2570 }
2571 if (i+2 < NCH(n))
2572 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002573 if (anchor)
2574 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002575}
2576
2577static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002578com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002579{
2580 int break_anchor = 0;
2581 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002582 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002583 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2584 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002585 block_push(c, SETUP_LOOP);
2586 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002587 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002588 com_node(c, CHILD(n, 1));
2589 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2590 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002591 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002592 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002593 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002594 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002595 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2596 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002597 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002598 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002599 com_addbyte(c, POP_TOP);
2600 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002601 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002602 if (NCH(n) > 4)
2603 com_node(c, CHILD(n, 6));
2604 com_backpatch(c, break_anchor);
2605}
2606
2607static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002608com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002609{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002610 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002611 int break_anchor = 0;
2612 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002613 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002614 REQ(n, for_stmt);
2615 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2616 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002617 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002618 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002619 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002620 if (v == NULL)
2621 c->c_errors++;
2622 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002623 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002624 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002625 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002626 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002627 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002628 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00002629 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002630 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002631 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002632 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002633 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2634 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002635 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002636 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002637 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002638 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002639 if (NCH(n) > 8)
2640 com_node(c, CHILD(n, 8));
2641 com_backpatch(c, break_anchor);
2642}
2643
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002644/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002645
2646 SETUP_FINALLY L
2647 <code for S>
2648 POP_BLOCK
2649 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002650 L: <code for Sf>
2651 END_FINALLY
2652
2653 The special instructions use the block stack. Each block
2654 stack entry contains the instruction that created it (here
2655 SETUP_FINALLY), the level of the value stack at the time the
2656 block stack entry was created, and a label (here L).
2657
2658 SETUP_FINALLY:
2659 Pushes the current value stack level and the label
2660 onto the block stack.
2661 POP_BLOCK:
2662 Pops en entry from the block stack, and pops the value
2663 stack until its level is the same as indicated on the
2664 block stack. (The label is ignored.)
2665 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002666 Pops a variable number of entries from the *value* stack
2667 and re-raises the exception they specify. The number of
2668 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002669
2670 The block stack is unwound when an exception is raised:
2671 when a SETUP_FINALLY entry is found, the exception is pushed
2672 onto the value stack (and the exception condition is cleared),
2673 and the interpreter jumps to the label gotten from the block
2674 stack.
2675
2676 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002677 (The contents of the value stack is shown in [], with the top
2678 at the right; 'tb' is trace-back info, 'val' the exception's
2679 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002680
2681 Value stack Label Instruction Argument
2682 [] SETUP_EXCEPT L1
2683 [] <code for S>
2684 [] POP_BLOCK
2685 [] JUMP_FORWARD L0
2686
Guido van Rossum3f5da241990-12-20 15:06:42 +00002687 [tb, val, exc] L1: DUP )
2688 [tb, val, exc, exc] <evaluate E1> )
2689 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2690 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2691 [tb, val, exc, 1] POP )
2692 [tb, val, exc] POP
2693 [tb, val] <assign to V1> (or POP if no V1)
2694 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002695 [] <code for S1>
2696 JUMP_FORWARD L0
2697
Guido van Rossum3f5da241990-12-20 15:06:42 +00002698 [tb, val, exc, 0] L2: POP
2699 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002700 .............................etc.......................
2701
Guido van Rossum3f5da241990-12-20 15:06:42 +00002702 [tb, val, exc, 0] Ln+1: POP
2703 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002704
2705 [] L0: <next statement>
2706
2707 Of course, parts are not generated if Vi or Ei is not present.
2708*/
2709
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002710static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002711com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002712{
2713 int except_anchor = 0;
2714 int end_anchor = 0;
2715 int else_anchor = 0;
2716 int i;
2717 node *ch;
2718
2719 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2720 block_push(c, SETUP_EXCEPT);
2721 com_node(c, CHILD(n, 2));
2722 com_addbyte(c, POP_BLOCK);
2723 block_pop(c, SETUP_EXCEPT);
2724 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2725 com_backpatch(c, except_anchor);
2726 for (i = 3;
2727 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2728 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002729 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002730 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002731 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002732 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002733 break;
2734 }
2735 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002736 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002737 com_addoparg(c, SET_LINENO, ch->n_lineno);
2738 if (NCH(ch) > 1) {
2739 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002740 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002741 com_node(c, CHILD(ch, 1));
2742 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002743 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002744 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2745 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002746 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002747 }
2748 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002749 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002750 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00002751 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002752 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002753 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002754 com_pop(c, 1);
2755 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002756 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002757 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002758 com_node(c, CHILD(n, i+2));
2759 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2760 if (except_anchor) {
2761 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002762 /* We come in with [tb, val, exc, 0] on the
2763 stack; one pop and it's the same as
2764 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002765 com_addbyte(c, POP_TOP);
2766 }
2767 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002768 /* We actually come in here with [tb, val, exc] but the
2769 END_FINALLY will zap those and jump around.
2770 The c_stacklevel does not reflect them so we need not pop
2771 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002772 com_addbyte(c, END_FINALLY);
2773 com_backpatch(c, else_anchor);
2774 if (i < NCH(n))
2775 com_node(c, CHILD(n, i+2));
2776 com_backpatch(c, end_anchor);
2777}
2778
2779static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002780com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002781{
2782 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002783 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002784
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002785 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2786 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002787 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002788 com_addbyte(c, POP_BLOCK);
2789 block_pop(c, SETUP_FINALLY);
2790 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002791 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002792 /* While the generated code pushes only one item,
2793 the try-finally handling can enter here with
2794 up to three items. OK, here are the details:
2795 3 for an exception, 2 for RETURN, 1 for BREAK. */
2796 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002797 com_backpatch(c, finally_anchor);
2798 ch = CHILD(n, NCH(n)-1);
2799 com_addoparg(c, SET_LINENO, ch->n_lineno);
2800 com_node(c, ch);
2801 com_addbyte(c, END_FINALLY);
2802 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002803 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002804}
2805
2806static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002807com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002808{
2809 REQ(n, try_stmt);
2810 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2811 | 'try' ':' suite 'finally' ':' suite */
2812 if (TYPE(CHILD(n, 3)) != except_clause)
2813 com_try_finally(c, n);
2814 else
2815 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002816}
2817
Guido van Rossum8b993a91997-01-17 21:04:03 +00002818static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002819get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002820{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002821 int i;
2822
Guido van Rossum8b993a91997-01-17 21:04:03 +00002823 /* Label to avoid tail recursion */
2824 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002825 switch (TYPE(n)) {
2826
2827 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002828 if (NCH(n) == 1) {
2829 n = CHILD(n, 0);
2830 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002831 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002832 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002833 case file_input:
2834 for (i = 0; i < NCH(n); i++) {
2835 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002836 if (TYPE(ch) == stmt) {
2837 n = ch;
2838 goto next;
2839 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002840 }
2841 break;
2842
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002843 case stmt:
2844 case simple_stmt:
2845 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002846 n = CHILD(n, 0);
2847 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002848
2849 case expr_stmt:
2850 case testlist:
2851 case test:
2852 case and_test:
2853 case not_test:
2854 case comparison:
2855 case expr:
2856 case xor_expr:
2857 case and_expr:
2858 case shift_expr:
2859 case arith_expr:
2860 case term:
2861 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002862 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002863 if (NCH(n) == 1) {
2864 n = CHILD(n, 0);
2865 goto next;
2866 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002867 break;
2868
2869 case atom:
2870 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002871 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002872 break;
2873
2874 }
2875 return NULL;
2876}
2877
Guido van Rossum79f25d91997-04-29 20:08:16 +00002878static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002879get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002880{
Guido van Rossum541563e1999-01-28 15:08:09 +00002881 /* Don't generate doc-strings if run with -OO */
2882 if (Py_OptimizeFlag > 1)
2883 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002884 n = get_rawdocstring(n);
2885 if (n == NULL)
2886 return NULL;
2887 return parsestrplus(n);
2888}
2889
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002890static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002891com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002892{
2893 REQ(n, suite);
2894 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2895 if (NCH(n) == 1) {
2896 com_node(c, CHILD(n, 0));
2897 }
2898 else {
2899 int i;
2900 for (i = 0; i < NCH(n); i++) {
2901 node *ch = CHILD(n, i);
2902 if (TYPE(ch) == stmt)
2903 com_node(c, ch);
2904 }
2905 }
2906}
2907
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002908/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002909static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002910com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002911{
2912 int i = c->c_nblocks;
2913 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2914 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2915 }
2916 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002917 com_error(c, PyExc_SyntaxError,
2918 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002919 }
2920 /* XXX Could allow it inside a 'finally' clause
2921 XXX if we could pop the exception still on the stack */
2922}
2923
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002924static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002925com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002926{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002927 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002928 if (TYPE(n) == lambdef) {
2929 /* lambdef: 'lambda' [varargslist] ':' test */
2930 n = CHILD(n, 1);
2931 }
2932 else {
2933 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2934 n = CHILD(n, 2);
2935 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2936 n = CHILD(n, 1);
2937 }
2938 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002939 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002940 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002941 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002942 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2943 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002944 nargs = 0;
2945 ndefs = 0;
2946 for (i = 0; i < nch; i++) {
2947 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002948 if (TYPE(CHILD(n, i)) == STAR ||
2949 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002950 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002951 nargs++;
2952 i++;
2953 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002954 t = RPAR; /* Anything except EQUAL or COMMA */
2955 else
2956 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002957 if (t == EQUAL) {
2958 i++;
2959 ndefs++;
2960 com_node(c, CHILD(n, i));
2961 i++;
2962 if (i >= nch)
2963 break;
2964 t = TYPE(CHILD(n, i));
2965 }
2966 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00002967 /* Treat "(a=1, b)" as an error */
2968 if (ndefs)
2969 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00002970 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002971 }
2972 if (t != COMMA)
2973 break;
2974 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002975 return ndefs;
2976}
2977
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002978static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002979com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002980{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002981 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002982 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002983 v = (PyObject *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002984 if (v == NULL)
2985 c->c_errors++;
2986 else {
2987 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002988 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002989 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002990 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002991 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002992 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002993 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002994 com_pop(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002995 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002996 }
2997}
2998
2999static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003000com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003001{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003002 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003003 REQ(n, testlist);
3004 /* testlist: test (',' test)* [','] */
3005 for (i = 0; i < NCH(n); i += 2)
3006 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003007 i = (NCH(n)+1) / 2;
3008 com_addoparg(c, BUILD_TUPLE, i);
3009 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003010}
3011
3012static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003013com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003014{
Guido van Rossum25831651993-05-19 14:50:45 +00003015 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003016 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003017 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003018 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003019 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003020 c->c_errors++;
3021 return;
3022 }
3023 /* Push the class name on the stack */
3024 i = com_addconst(c, v);
3025 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003026 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003027 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003028 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003029 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003030 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003031 com_push(c, 1);
3032 }
Guido van Rossum25831651993-05-19 14:50:45 +00003033 else
3034 com_bases(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00003035 v = (PyObject *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003036 if (v == NULL)
3037 c->c_errors++;
3038 else {
Guido van Rossum25831651993-05-19 14:50:45 +00003039 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003040 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003041 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003042 com_addoparg(c, MAKE_FUNCTION, 0);
3043 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003044 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003045 com_pop(c, 2);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003046 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum79f25d91997-04-29 20:08:16 +00003047 Py_DECREF(v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003048 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003049}
3050
3051static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003052com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003053{
3054 switch (TYPE(n)) {
3055
3056 /* Definition nodes */
3057
3058 case funcdef:
3059 com_funcdef(c, n);
3060 break;
3061 case classdef:
3062 com_classdef(c, n);
3063 break;
3064
3065 /* Trivial parse tree nodes */
3066
3067 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003068 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003069 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003070 com_node(c, CHILD(n, 0));
3071 break;
3072
3073 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003074 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3075 com_addoparg(c, SET_LINENO, n->n_lineno);
3076 {
3077 int i;
3078 for (i = 0; i < NCH(n)-1; i += 2)
3079 com_node(c, CHILD(n, i));
3080 }
3081 break;
3082
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003083 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003084 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003085 com_node(c, CHILD(n, 0));
3086 break;
3087
3088 /* Statement nodes */
3089
3090 case expr_stmt:
3091 com_expr_stmt(c, n);
3092 break;
3093 case print_stmt:
3094 com_print_stmt(c, n);
3095 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003096 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003097 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003098 break;
3099 case pass_stmt:
3100 break;
3101 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003102 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003103 com_error(c, PyExc_SyntaxError,
3104 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003105 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003106 com_addbyte(c, BREAK_LOOP);
3107 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003108 case continue_stmt:
3109 com_continue_stmt(c, n);
3110 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003111 case return_stmt:
3112 com_return_stmt(c, n);
3113 break;
3114 case raise_stmt:
3115 com_raise_stmt(c, n);
3116 break;
3117 case import_stmt:
3118 com_import_stmt(c, n);
3119 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003120 case global_stmt:
3121 com_global_stmt(c, n);
3122 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003123 case exec_stmt:
3124 com_exec_stmt(c, n);
3125 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003126 case assert_stmt:
3127 com_assert_stmt(c, n);
3128 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003129 case if_stmt:
3130 com_if_stmt(c, n);
3131 break;
3132 case while_stmt:
3133 com_while_stmt(c, n);
3134 break;
3135 case for_stmt:
3136 com_for_stmt(c, n);
3137 break;
3138 case try_stmt:
3139 com_try_stmt(c, n);
3140 break;
3141 case suite:
3142 com_suite(c, n);
3143 break;
3144
3145 /* Expression nodes */
3146
3147 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003148 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003149 break;
3150 case test:
3151 com_test(c, n);
3152 break;
3153 case and_test:
3154 com_and_test(c, n);
3155 break;
3156 case not_test:
3157 com_not_test(c, n);
3158 break;
3159 case comparison:
3160 com_comparison(c, n);
3161 break;
3162 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003163 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003164 break;
3165 case expr:
3166 com_expr(c, n);
3167 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003168 case xor_expr:
3169 com_xor_expr(c, n);
3170 break;
3171 case and_expr:
3172 com_and_expr(c, n);
3173 break;
3174 case shift_expr:
3175 com_shift_expr(c, n);
3176 break;
3177 case arith_expr:
3178 com_arith_expr(c, n);
3179 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003180 case term:
3181 com_term(c, n);
3182 break;
3183 case factor:
3184 com_factor(c, n);
3185 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003186 case power:
3187 com_power(c, n);
3188 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003189 case atom:
3190 com_atom(c, n);
3191 break;
3192
3193 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003194 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003195 com_error(c, PyExc_SystemError,
3196 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003197 }
3198}
3199
Tim Petersdbd9ba62000-07-09 03:09:57 +00003200static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003201
3202static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003203com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003204{
3205 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3206 if (TYPE(CHILD(n, 0)) == LPAR)
3207 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003208 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003209 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003210 com_pop(c, 1);
3211 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003212}
3213
3214static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003215com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003216{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003217 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003218 if (NCH(n) == 1) {
3219 com_fpdef(c, CHILD(n, 0));
3220 }
3221 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003222 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003223 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003224 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003225 for (i = 0; i < NCH(n); i += 2)
3226 com_fpdef(c, CHILD(n, i));
3227 }
3228}
3229
3230static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003231com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003232{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003233 int nch, i;
3234 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003235 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003236 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003237 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003238 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003239 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003240 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003241 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003242 node *ch = CHILD(n, i);
3243 node *fp;
3244 char *name;
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003245 PyObject *nameval;
Guido van Rossum50564e81996-01-12 01:13:16 +00003246 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003247 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003248 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3249 fp = CHILD(ch, 0);
3250 if (TYPE(fp) == NAME)
3251 name = STR(fp);
3252 else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003253 name = nbuf;
3254 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003255 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003256 }
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003257 nameval = PyString_InternFromString(name);
3258 if (nameval == NULL) {
3259 c->c_errors++;
3260 }
Peter Schneider-Kamp9a5086c2000-07-13 06:24:29 +00003261 if (PyDict_GetItem(c->c_locals, nameval)) {
Fred Drakedcf08e02000-08-15 15:49:44 +00003262 com_error(c, PyExc_SyntaxError,
3263 "duplicate argument in function definition");
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003264 }
3265 com_newlocal_o(c, nameval);
3266 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003267 c->c_argcount++;
3268 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003269 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003270 ch = CHILD(n, i);
3271 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003272 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003273 else
3274 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003275 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003276 /* Handle *arguments */
3277 if (i < nch) {
3278 node *ch;
3279 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003280 if (TYPE(ch) != DOUBLESTAR) {
3281 REQ(ch, STAR);
3282 ch = CHILD(n, i+1);
3283 if (TYPE(ch) == NAME) {
3284 c->c_flags |= CO_VARARGS;
3285 i += 3;
3286 com_newlocal(c, STR(ch));
3287 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003288 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003289 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003290 /* Handle **keywords */
3291 if (i < nch) {
3292 node *ch;
3293 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003294 if (TYPE(ch) != DOUBLESTAR) {
3295 REQ(ch, STAR);
3296 ch = CHILD(n, i+1);
3297 REQ(ch, STAR);
3298 ch = CHILD(n, i+2);
3299 }
3300 else
3301 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003302 REQ(ch, NAME);
3303 c->c_flags |= CO_VARKEYWORDS;
3304 com_newlocal(c, STR(ch));
3305 }
3306 if (complex) {
3307 /* Generate code for complex arguments only after
3308 having counted the simple arguments */
3309 int ilocal = 0;
3310 for (i = 0; i < nch; i++) {
3311 node *ch = CHILD(n, i);
3312 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003313 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003314 break;
3315 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3316 fp = CHILD(ch, 0);
3317 if (TYPE(fp) != NAME) {
3318 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003319 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003320 com_fpdef(c, ch);
3321 }
3322 ilocal++;
3323 if (++i >= nch)
3324 break;
3325 ch = CHILD(n, i);
3326 if (TYPE(ch) == EQUAL)
3327 i += 2;
3328 else
3329 REQ(ch, COMMA);
3330 }
3331 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003332}
3333
3334static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003335com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003336{
3337 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003338 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003339 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003340 doc = get_docstring(n);
3341 if (doc != NULL) {
3342 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003343 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003344 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003345 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003346 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003347 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003348 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003349 for (i = 0; i < NCH(n); i++) {
3350 node *ch = CHILD(n, i);
3351 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3352 com_node(c, ch);
3353 }
3354}
3355
3356/* Top-level compile-node interface */
3357
3358static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003359compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003360{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003361 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003362 node *ch;
3363 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003364 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003365 doc = get_docstring(CHILD(n, 4));
3366 if (doc != NULL) {
3367 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003368 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003369 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003370 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003371 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003372 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3373 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003374 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003375 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003376 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003377 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003378 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003379 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003380 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003381 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003382 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003383}
3384
3385static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003386compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003387{
Guido van Rossum590baa41993-11-30 13:40:46 +00003388 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003389 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003390 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003391
3392 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003393 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003394 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003395 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003396 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003397 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003398 else
3399 ch = CHILD(n, 2);
3400 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003401 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003402 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003403}
3404
3405static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003406compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003407{
3408 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003409 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003410 REQ(n, classdef);
3411 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3412 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003413#ifdef PRIVATE_NAME_MANGLING
3414 c->c_private = c->c_name;
3415#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003416 ch = CHILD(n, NCH(n)-1); /* The suite */
3417 doc = get_docstring(ch);
3418 if (doc != NULL) {
3419 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003420 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003421 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003422 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003423 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003424 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003425 }
3426 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003427 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003428 com_node(c, ch);
3429 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003430 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003431 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003432 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003433}
3434
3435static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003436compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003437{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003438 com_addoparg(c, SET_LINENO, n->n_lineno);
3439
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003440 switch (TYPE(n)) {
3441
Guido van Rossum4c417781991-01-21 16:09:22 +00003442 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003443 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003444 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003445 n = CHILD(n, 0);
3446 if (TYPE(n) != NEWLINE)
3447 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003448 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003449 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003450 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003451 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003452 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003453 break;
3454
Guido van Rossum4c417781991-01-21 16:09:22 +00003455 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003456 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003457 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003458 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003459 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003460 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003461 break;
3462
Guido van Rossum590baa41993-11-30 13:40:46 +00003463 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003464 com_node(c, CHILD(n, 0));
3465 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003466 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003467 break;
3468
Guido van Rossum590baa41993-11-30 13:40:46 +00003469 case lambdef: /* anonymous function definition */
3470 compile_lambdef(c, n);
3471 break;
3472
Guido van Rossum4c417781991-01-21 16:09:22 +00003473 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003474 compile_funcdef(c, n);
3475 break;
3476
Guido van Rossum4c417781991-01-21 16:09:22 +00003477 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003478 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003479 break;
3480
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003481 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003482 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003483 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003484 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003485 }
3486}
3487
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003488/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00003489
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003490 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
3491 instructions that refer to local variables with LOAD_FAST etc.
3492 The latter instructions are much faster because they don't need to
3493 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003494
Guido van Rossum681d79a1995-07-18 14:51:37 +00003495 To find all local variables, we check all STORE_NAME, IMPORT_FROM
3496 and DELETE_NAME instructions. This yields all local variables,
3497 function definitions, class definitions and import statements.
3498 Argument names have already been entered into the list by the
3499 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003500
3501 All remaining LOAD_NAME instructions must refer to non-local (global
3502 or builtin) variables, so are replaced by LOAD_GLOBAL.
3503
3504 There are two problems: 'from foo import *' and 'exec' may introduce
3505 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00003506 case, we can still optimize bona fide locals (since those
3507 statements will be surrounded by fast_2_locals() and
3508 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003509
Guido van Rossum681d79a1995-07-18 14:51:37 +00003510 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00003511
3512static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003513optimize(struct compiling *c)
Guido van Rossum282914b1991-04-04 10:42:56 +00003514{
Guido van Rossum0a697f61991-04-16 08:39:12 +00003515 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00003516 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00003517 int oparg = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003518 PyObject *name;
3519 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003520
Guido van Rossum282914b1991-04-04 10:42:56 +00003521#define NEXTOP() (*next_instr++)
3522#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossum79f25d91997-04-29 20:08:16 +00003523#define GETITEM(v, i) (PyList_GetItem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003524#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
3525
Guido van Rossum79f25d91997-04-29 20:08:16 +00003526 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003527
3528 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00003529
Guido van Rossum79f25d91997-04-29 20:08:16 +00003530 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003531 for (;;) {
3532 opcode = NEXTOP();
3533 if (opcode == STOP_CODE)
3534 break;
3535 if (HAS_ARG(opcode))
3536 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +00003537 dispatch_opcode1:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003538 switch (opcode) {
3539 case STORE_NAME:
3540 case DELETE_NAME:
3541 case IMPORT_FROM:
3542 com_addlocal_o(c, GETNAMEOBJ(oparg));
3543 break;
Thomas Wouters52152252000-08-17 22:55:00 +00003544 case IMPORT_STAR:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003545 case EXEC_STMT:
3546 c->c_flags &= ~CO_OPTIMIZED;
3547 break;
Fred Drakeef8ace32000-08-24 00:32:09 +00003548 case EXTENDED_ARG:
3549 opcode = NEXTOP();
3550 oparg = oparg<<16 | NEXTARG();
3551 goto dispatch_opcode1;
3552 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00003553 }
3554 }
3555
Thomas Wouters52152252000-08-17 22:55:00 +00003556 /* TBD: Is this still necessary ? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003557 if (PyDict_GetItemString(c->c_locals, "*") != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003558 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003559
Guido van Rossum79f25d91997-04-29 20:08:16 +00003560 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003561 for (;;) {
3562 cur_instr = next_instr;
3563 opcode = NEXTOP();
3564 if (opcode == STOP_CODE)
3565 break;
3566 if (HAS_ARG(opcode))
3567 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +00003568 dispatch_opcode2:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003569 if (opcode == LOAD_NAME ||
3570 opcode == STORE_NAME ||
3571 opcode == DELETE_NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003572 PyObject *v;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003573 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00003574 name = GETNAMEOBJ(oparg);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003575 v = PyDict_GetItem(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003576 if (v == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003577 if (opcode == LOAD_NAME &&
3578 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003579 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003580 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00003581 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003582 i = PyInt_AsLong(v);
Fred Drakeef8ace32000-08-24 00:32:09 +00003583 if (i >> 16) /* too big for 2 bytes */
3584 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003585 switch (opcode) {
3586 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
3587 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
3588 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
3589 }
3590 cur_instr[1] = i & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +00003591 cur_instr[2] = i >> 8;
3592 }
3593 if (opcode == EXTENDED_ARG) {
3594 opcode = NEXTOP();
3595 oparg = oparg<<16 | NEXTARG();
3596 goto dispatch_opcode2;
Guido van Rossum282914b1991-04-04 10:42:56 +00003597 }
3598 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003599
Guido van Rossum681d79a1995-07-18 14:51:37 +00003600 if (c->c_errors == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00003601 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00003602}
3603
Guido van Rossum79f25d91997-04-29 20:08:16 +00003604PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003605PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003606{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003607 return jcompile(n, filename, NULL);
3608}
3609
Guido van Rossum79f25d91997-04-29 20:08:16 +00003610static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003611icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003612{
3613 return jcompile(n, base->c_filename, base);
3614}
3615
Guido van Rossum79f25d91997-04-29 20:08:16 +00003616static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003617jcompile(node *n, char *filename, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003618{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003619 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003620 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003621 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003622 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003623#ifdef PRIVATE_NAME_MANGLING
3624 if (base)
3625 sc.c_private = base->c_private;
3626 else
3627 sc.c_private = NULL;
3628#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003629 compile_node(&sc, n);
3630 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003631 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003632 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003633 sc.c_flags |= CO_NEWLOCALS;
3634 }
3635 else if (TYPE(n) == classdef)
3636 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00003637 co = NULL;
3638 if (sc.c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003639 PyObject *consts, *names, *varnames, *filename, *name;
3640 consts = PyList_AsTuple(sc.c_consts);
3641 names = PyList_AsTuple(sc.c_names);
3642 varnames = PyList_AsTuple(sc.c_varnames);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003643 filename = PyString_InternFromString(sc.c_filename);
3644 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003645 if (!PyErr_Occurred())
3646 co = PyCode_New(sc.c_argcount,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003647 sc.c_nlocals,
Guido van Rossum8b993a91997-01-17 21:04:03 +00003648 sc.c_maxstacklevel,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003649 sc.c_flags,
3650 sc.c_code,
3651 consts,
3652 names,
3653 varnames,
3654 filename,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003655 name,
3656 sc.c_firstlineno,
3657 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003658 Py_XDECREF(consts);
3659 Py_XDECREF(names);
3660 Py_XDECREF(varnames);
3661 Py_XDECREF(filename);
3662 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003663 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003664 else if (!PyErr_Occurred()) {
3665 /* This could happen if someone called PyErr_Clear() after an
3666 error was reported above. That's not supposed to happen,
3667 but I just plugged one case and I'm not sure there can't be
3668 others. In that case, raise SystemError so that at least
3669 it gets reported instead dumping core. */
3670 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3671 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003672 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003673 return co;
3674}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003675
3676int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003677PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003678{
3679 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003680 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003681 int line = co->co_firstlineno;
3682 int addr = 0;
3683 while (--size >= 0) {
3684 addr += *p++;
3685 if (addr > addrq)
3686 break;
3687 line += *p++;
3688 }
3689 return line;
3690}