blob: ba910c41346bf37d3bbb363543867bdd9899696d [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;
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002332 PyObject *tup;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002333 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002334 /* 'import' dotted_name (',' dotted_name)* |
2335 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002336 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002337 /* 'from' dotted_name 'import' ... */
2338 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002339
2340 if (TYPE(CHILD(n, 3)) == STAR) {
2341 tup = Py_BuildValue("(s)", "*");
2342 } else {
2343 tup = PyTuple_New((NCH(n) - 2)/2);
2344 for (i = 3; i < NCH(n); i += 2) {
2345 PyTuple_SET_ITEM(tup, (i-3)/2,
2346 PyString_FromString(STR(
2347 CHILD(CHILD(n, i), 0))));
2348 }
2349 }
2350 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002351 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002352 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002353 if (TYPE(CHILD(n, 3)) == STAR)
2354 com_addbyte(c, IMPORT_STAR);
2355 else {
2356 for (i = 3; i < NCH(n); i += 2)
2357 com_from_import(c, CHILD(n, i));
2358 com_addbyte(c, POP_TOP);
2359 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002360 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002361 }
2362 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002363 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002364 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002365 node *subn = CHILD(n, i);
2366 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002367 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002368 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002369 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00002370 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00002371 int j;
2372 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00002373 com_error(c, PyExc_SyntaxError,
2374 "invalid syntax");
2375 return;
2376 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00002377 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
2378 com_addopname(c, LOAD_ATTR,
2379 CHILD(CHILD(subn, 0), j));
Thomas Wouters52152252000-08-17 22:55:00 +00002380 com_addopname(c, STORE_NAME, CHILD(subn, 2));
2381 } else
2382 com_addopname(c, STORE_NAME,
2383 CHILD(CHILD(subn, 0),0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002384 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002385 }
2386 }
2387}
2388
2389static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002390com_global_stmt(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002391{
2392 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002393 REQ(n, global_stmt);
2394 /* 'global' NAME (',' NAME)* */
2395 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002396 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002397#ifdef PRIVATE_NAME_MANGLING
2398 char buffer[256];
2399 if (s != NULL && s[0] == '_' && s[1] == '_' &&
2400 c->c_private != NULL &&
Guido van Rossum582acec2000-06-28 22:07:35 +00002401 com_mangle(c, s, buffer, sizeof(buffer)))
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002402 s = buffer;
2403#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +00002404 if (PyDict_GetItemString(c->c_locals, s) != NULL) {
2405 com_error(c, PyExc_SyntaxError,
2406 "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002407 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002408 else if (PyDict_SetItemString(c->c_globals, s, Py_None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002409 c->c_errors++;
2410 }
2411}
2412
Guido van Rossum681d79a1995-07-18 14:51:37 +00002413static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002414com_newlocal_o(struct compiling *c, PyObject *nameval)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002415{
2416 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002417 PyObject *ival;
2418 if (PyList_Size(c->c_varnames) != c->c_nlocals) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002419 /* This is usually caused by an error on a previous call */
2420 if (c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002421 com_error(c, PyExc_SystemError,
2422 "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002423 }
2424 return 0;
2425 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002426 ival = PyInt_FromLong(i = c->c_nlocals++);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002427 if (ival == NULL)
2428 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002429 else if (PyDict_SetItem(c->c_locals, nameval, ival) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002430 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002431 else if (PyList_Append(c->c_varnames, nameval) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002432 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002433 Py_XDECREF(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002434 return i;
2435}
2436
2437static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002438com_addlocal_o(struct compiling *c, PyObject *nameval)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002439{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002440 PyObject *ival = PyDict_GetItem(c->c_locals, nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002441 if (ival != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002442 return PyInt_AsLong(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002443 return com_newlocal_o(c, nameval);
2444}
2445
2446static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002447com_newlocal(struct compiling *c, char *name)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002448{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002449 PyObject *nameval = PyString_InternFromString(name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002450 int i;
2451 if (nameval == NULL) {
2452 c->c_errors++;
2453 return 0;
2454 }
2455 i = com_newlocal_o(c, nameval);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002456 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002457 return i;
2458}
2459
Guido van Rossumc5e96291991-12-10 13:53:51 +00002460static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002461com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002462{
2463 REQ(n, exec_stmt);
2464 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2465 com_node(c, CHILD(n, 1));
2466 if (NCH(n) >= 4)
2467 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002468 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002469 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002470 com_push(c, 1);
2471 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002472 if (NCH(n) >= 6)
2473 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002474 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002475 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002476 com_push(c, 1);
2477 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002478 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002479 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002480}
2481
Guido van Rossum7c531111997-03-11 18:42:21 +00002482static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002483is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002484{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002485 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002486 int i;
2487
2488 /* Label to avoid tail recursion */
2489 next:
2490 switch (TYPE(n)) {
2491
2492 case suite:
2493 if (NCH(n) == 1) {
2494 n = CHILD(n, 0);
2495 goto next;
2496 }
2497 /* Fall through */
2498 case file_input:
2499 for (i = 0; i < NCH(n); i++) {
2500 node *ch = CHILD(n, i);
2501 if (TYPE(ch) == stmt) {
2502 n = ch;
2503 goto next;
2504 }
2505 }
2506 break;
2507
2508 case stmt:
2509 case simple_stmt:
2510 case small_stmt:
2511 n = CHILD(n, 0);
2512 goto next;
2513
2514 case expr_stmt:
2515 case testlist:
2516 case test:
2517 case and_test:
2518 case not_test:
2519 case comparison:
2520 case expr:
2521 case xor_expr:
2522 case and_expr:
2523 case shift_expr:
2524 case arith_expr:
2525 case term:
2526 case factor:
2527 case power:
2528 case atom:
2529 if (NCH(n) == 1) {
2530 n = CHILD(n, 0);
2531 goto next;
2532 }
2533 break;
2534
2535 case NAME:
2536 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2537 return 1;
2538 break;
2539
2540 case NUMBER:
2541 v = parsenumber(c, STR(n));
2542 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002543 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002544 break;
2545 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002546 i = PyObject_IsTrue(v);
2547 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002548 return i == 0;
2549
2550 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002551 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002552 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002553 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002554 break;
2555 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002556 i = PyObject_IsTrue(v);
2557 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002558 return i == 0;
2559
2560 }
2561 return 0;
2562}
2563
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002564static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002565com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002566{
2567 int i;
2568 int anchor = 0;
2569 REQ(n, if_stmt);
2570 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2571 for (i = 0; i+3 < NCH(n); i+=4) {
2572 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002573 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002574 if (is_constant_false(c, ch))
2575 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002576 if (i > 0)
2577 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002578 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002579 com_addfwref(c, JUMP_IF_FALSE, &a);
2580 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002581 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002582 com_node(c, CHILD(n, i+3));
2583 com_addfwref(c, JUMP_FORWARD, &anchor);
2584 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002585 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002586 com_addbyte(c, POP_TOP);
2587 }
2588 if (i+2 < NCH(n))
2589 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002590 if (anchor)
2591 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002592}
2593
2594static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002595com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002596{
2597 int break_anchor = 0;
2598 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002599 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002600 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2601 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002602 block_push(c, SETUP_LOOP);
2603 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002604 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002605 com_node(c, CHILD(n, 1));
2606 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2607 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002608 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002609 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002610 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002611 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002612 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2613 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002614 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002615 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002616 com_addbyte(c, POP_TOP);
2617 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002618 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002619 if (NCH(n) > 4)
2620 com_node(c, CHILD(n, 6));
2621 com_backpatch(c, break_anchor);
2622}
2623
2624static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002625com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002626{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002627 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002628 int break_anchor = 0;
2629 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002630 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002631 REQ(n, for_stmt);
2632 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2633 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002634 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002635 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002636 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002637 if (v == NULL)
2638 c->c_errors++;
2639 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002640 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002641 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002642 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002643 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002644 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002645 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00002646 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002647 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002648 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002649 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002650 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2651 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002652 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002653 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002654 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002655 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002656 if (NCH(n) > 8)
2657 com_node(c, CHILD(n, 8));
2658 com_backpatch(c, break_anchor);
2659}
2660
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002661/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002662
2663 SETUP_FINALLY L
2664 <code for S>
2665 POP_BLOCK
2666 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002667 L: <code for Sf>
2668 END_FINALLY
2669
2670 The special instructions use the block stack. Each block
2671 stack entry contains the instruction that created it (here
2672 SETUP_FINALLY), the level of the value stack at the time the
2673 block stack entry was created, and a label (here L).
2674
2675 SETUP_FINALLY:
2676 Pushes the current value stack level and the label
2677 onto the block stack.
2678 POP_BLOCK:
2679 Pops en entry from the block stack, and pops the value
2680 stack until its level is the same as indicated on the
2681 block stack. (The label is ignored.)
2682 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002683 Pops a variable number of entries from the *value* stack
2684 and re-raises the exception they specify. The number of
2685 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002686
2687 The block stack is unwound when an exception is raised:
2688 when a SETUP_FINALLY entry is found, the exception is pushed
2689 onto the value stack (and the exception condition is cleared),
2690 and the interpreter jumps to the label gotten from the block
2691 stack.
2692
2693 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002694 (The contents of the value stack is shown in [], with the top
2695 at the right; 'tb' is trace-back info, 'val' the exception's
2696 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002697
2698 Value stack Label Instruction Argument
2699 [] SETUP_EXCEPT L1
2700 [] <code for S>
2701 [] POP_BLOCK
2702 [] JUMP_FORWARD L0
2703
Guido van Rossum3f5da241990-12-20 15:06:42 +00002704 [tb, val, exc] L1: DUP )
2705 [tb, val, exc, exc] <evaluate E1> )
2706 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2707 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2708 [tb, val, exc, 1] POP )
2709 [tb, val, exc] POP
2710 [tb, val] <assign to V1> (or POP if no V1)
2711 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002712 [] <code for S1>
2713 JUMP_FORWARD L0
2714
Guido van Rossum3f5da241990-12-20 15:06:42 +00002715 [tb, val, exc, 0] L2: POP
2716 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002717 .............................etc.......................
2718
Guido van Rossum3f5da241990-12-20 15:06:42 +00002719 [tb, val, exc, 0] Ln+1: POP
2720 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002721
2722 [] L0: <next statement>
2723
2724 Of course, parts are not generated if Vi or Ei is not present.
2725*/
2726
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002727static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002728com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002729{
2730 int except_anchor = 0;
2731 int end_anchor = 0;
2732 int else_anchor = 0;
2733 int i;
2734 node *ch;
2735
2736 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2737 block_push(c, SETUP_EXCEPT);
2738 com_node(c, CHILD(n, 2));
2739 com_addbyte(c, POP_BLOCK);
2740 block_pop(c, SETUP_EXCEPT);
2741 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2742 com_backpatch(c, except_anchor);
2743 for (i = 3;
2744 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2745 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002746 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002747 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002748 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002749 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002750 break;
2751 }
2752 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002753 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002754 com_addoparg(c, SET_LINENO, ch->n_lineno);
2755 if (NCH(ch) > 1) {
2756 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002757 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002758 com_node(c, CHILD(ch, 1));
2759 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002760 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002761 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2762 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002763 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002764 }
2765 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002766 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002767 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00002768 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002769 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002770 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002771 com_pop(c, 1);
2772 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002773 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002774 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002775 com_node(c, CHILD(n, i+2));
2776 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2777 if (except_anchor) {
2778 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002779 /* We come in with [tb, val, exc, 0] on the
2780 stack; one pop and it's the same as
2781 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002782 com_addbyte(c, POP_TOP);
2783 }
2784 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002785 /* We actually come in here with [tb, val, exc] but the
2786 END_FINALLY will zap those and jump around.
2787 The c_stacklevel does not reflect them so we need not pop
2788 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002789 com_addbyte(c, END_FINALLY);
2790 com_backpatch(c, else_anchor);
2791 if (i < NCH(n))
2792 com_node(c, CHILD(n, i+2));
2793 com_backpatch(c, end_anchor);
2794}
2795
2796static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002797com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002798{
2799 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002800 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002801
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002802 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2803 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002804 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002805 com_addbyte(c, POP_BLOCK);
2806 block_pop(c, SETUP_FINALLY);
2807 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002808 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002809 /* While the generated code pushes only one item,
2810 the try-finally handling can enter here with
2811 up to three items. OK, here are the details:
2812 3 for an exception, 2 for RETURN, 1 for BREAK. */
2813 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002814 com_backpatch(c, finally_anchor);
2815 ch = CHILD(n, NCH(n)-1);
2816 com_addoparg(c, SET_LINENO, ch->n_lineno);
2817 com_node(c, ch);
2818 com_addbyte(c, END_FINALLY);
2819 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002820 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002821}
2822
2823static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002824com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002825{
2826 REQ(n, try_stmt);
2827 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2828 | 'try' ':' suite 'finally' ':' suite */
2829 if (TYPE(CHILD(n, 3)) != except_clause)
2830 com_try_finally(c, n);
2831 else
2832 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002833}
2834
Guido van Rossum8b993a91997-01-17 21:04:03 +00002835static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002836get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002837{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002838 int i;
2839
Guido van Rossum8b993a91997-01-17 21:04:03 +00002840 /* Label to avoid tail recursion */
2841 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002842 switch (TYPE(n)) {
2843
2844 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002845 if (NCH(n) == 1) {
2846 n = CHILD(n, 0);
2847 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002848 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002849 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002850 case file_input:
2851 for (i = 0; i < NCH(n); i++) {
2852 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002853 if (TYPE(ch) == stmt) {
2854 n = ch;
2855 goto next;
2856 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002857 }
2858 break;
2859
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002860 case stmt:
2861 case simple_stmt:
2862 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002863 n = CHILD(n, 0);
2864 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002865
2866 case expr_stmt:
2867 case testlist:
2868 case test:
2869 case and_test:
2870 case not_test:
2871 case comparison:
2872 case expr:
2873 case xor_expr:
2874 case and_expr:
2875 case shift_expr:
2876 case arith_expr:
2877 case term:
2878 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002879 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002880 if (NCH(n) == 1) {
2881 n = CHILD(n, 0);
2882 goto next;
2883 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002884 break;
2885
2886 case atom:
2887 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002888 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002889 break;
2890
2891 }
2892 return NULL;
2893}
2894
Guido van Rossum79f25d91997-04-29 20:08:16 +00002895static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002896get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002897{
Guido van Rossum541563e1999-01-28 15:08:09 +00002898 /* Don't generate doc-strings if run with -OO */
2899 if (Py_OptimizeFlag > 1)
2900 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002901 n = get_rawdocstring(n);
2902 if (n == NULL)
2903 return NULL;
2904 return parsestrplus(n);
2905}
2906
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002907static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002908com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002909{
2910 REQ(n, suite);
2911 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2912 if (NCH(n) == 1) {
2913 com_node(c, CHILD(n, 0));
2914 }
2915 else {
2916 int i;
2917 for (i = 0; i < NCH(n); i++) {
2918 node *ch = CHILD(n, i);
2919 if (TYPE(ch) == stmt)
2920 com_node(c, ch);
2921 }
2922 }
2923}
2924
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002925/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002926static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002927com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002928{
2929 int i = c->c_nblocks;
2930 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2931 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2932 }
2933 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002934 com_error(c, PyExc_SyntaxError,
2935 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002936 }
2937 /* XXX Could allow it inside a 'finally' clause
2938 XXX if we could pop the exception still on the stack */
2939}
2940
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002941static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002942com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002943{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002944 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002945 if (TYPE(n) == lambdef) {
2946 /* lambdef: 'lambda' [varargslist] ':' test */
2947 n = CHILD(n, 1);
2948 }
2949 else {
2950 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2951 n = CHILD(n, 2);
2952 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2953 n = CHILD(n, 1);
2954 }
2955 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002956 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002957 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002958 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002959 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2960 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002961 nargs = 0;
2962 ndefs = 0;
2963 for (i = 0; i < nch; i++) {
2964 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002965 if (TYPE(CHILD(n, i)) == STAR ||
2966 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002967 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002968 nargs++;
2969 i++;
2970 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002971 t = RPAR; /* Anything except EQUAL or COMMA */
2972 else
2973 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002974 if (t == EQUAL) {
2975 i++;
2976 ndefs++;
2977 com_node(c, CHILD(n, i));
2978 i++;
2979 if (i >= nch)
2980 break;
2981 t = TYPE(CHILD(n, i));
2982 }
2983 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00002984 /* Treat "(a=1, b)" as an error */
2985 if (ndefs)
2986 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00002987 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002988 }
2989 if (t != COMMA)
2990 break;
2991 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002992 return ndefs;
2993}
2994
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002995static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002996com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002997{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002998 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002999 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003000 v = (PyObject *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003001 if (v == NULL)
3002 c->c_errors++;
3003 else {
3004 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003005 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003006 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003007 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003008 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003009 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003010 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003011 com_pop(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003012 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003013 }
3014}
3015
3016static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003017com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003018{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003019 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003020 REQ(n, testlist);
3021 /* testlist: test (',' test)* [','] */
3022 for (i = 0; i < NCH(n); i += 2)
3023 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003024 i = (NCH(n)+1) / 2;
3025 com_addoparg(c, BUILD_TUPLE, i);
3026 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003027}
3028
3029static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003030com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003031{
Guido van Rossum25831651993-05-19 14:50:45 +00003032 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003033 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003034 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003035 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003036 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003037 c->c_errors++;
3038 return;
3039 }
3040 /* Push the class name on the stack */
3041 i = com_addconst(c, v);
3042 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003043 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003044 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003045 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003046 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003047 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003048 com_push(c, 1);
3049 }
Guido van Rossum25831651993-05-19 14:50:45 +00003050 else
3051 com_bases(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00003052 v = (PyObject *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003053 if (v == NULL)
3054 c->c_errors++;
3055 else {
Guido van Rossum25831651993-05-19 14:50:45 +00003056 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003057 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003058 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003059 com_addoparg(c, MAKE_FUNCTION, 0);
3060 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003061 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003062 com_pop(c, 2);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003063 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum79f25d91997-04-29 20:08:16 +00003064 Py_DECREF(v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003065 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003066}
3067
3068static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003069com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003070{
3071 switch (TYPE(n)) {
3072
3073 /* Definition nodes */
3074
3075 case funcdef:
3076 com_funcdef(c, n);
3077 break;
3078 case classdef:
3079 com_classdef(c, n);
3080 break;
3081
3082 /* Trivial parse tree nodes */
3083
3084 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003085 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003086 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003087 com_node(c, CHILD(n, 0));
3088 break;
3089
3090 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003091 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3092 com_addoparg(c, SET_LINENO, n->n_lineno);
3093 {
3094 int i;
3095 for (i = 0; i < NCH(n)-1; i += 2)
3096 com_node(c, CHILD(n, i));
3097 }
3098 break;
3099
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003100 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003101 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003102 com_node(c, CHILD(n, 0));
3103 break;
3104
3105 /* Statement nodes */
3106
3107 case expr_stmt:
3108 com_expr_stmt(c, n);
3109 break;
3110 case print_stmt:
3111 com_print_stmt(c, n);
3112 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003113 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003114 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003115 break;
3116 case pass_stmt:
3117 break;
3118 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003119 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003120 com_error(c, PyExc_SyntaxError,
3121 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003122 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003123 com_addbyte(c, BREAK_LOOP);
3124 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003125 case continue_stmt:
3126 com_continue_stmt(c, n);
3127 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003128 case return_stmt:
3129 com_return_stmt(c, n);
3130 break;
3131 case raise_stmt:
3132 com_raise_stmt(c, n);
3133 break;
3134 case import_stmt:
3135 com_import_stmt(c, n);
3136 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003137 case global_stmt:
3138 com_global_stmt(c, n);
3139 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003140 case exec_stmt:
3141 com_exec_stmt(c, n);
3142 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003143 case assert_stmt:
3144 com_assert_stmt(c, n);
3145 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003146 case if_stmt:
3147 com_if_stmt(c, n);
3148 break;
3149 case while_stmt:
3150 com_while_stmt(c, n);
3151 break;
3152 case for_stmt:
3153 com_for_stmt(c, n);
3154 break;
3155 case try_stmt:
3156 com_try_stmt(c, n);
3157 break;
3158 case suite:
3159 com_suite(c, n);
3160 break;
3161
3162 /* Expression nodes */
3163
3164 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003165 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003166 break;
3167 case test:
3168 com_test(c, n);
3169 break;
3170 case and_test:
3171 com_and_test(c, n);
3172 break;
3173 case not_test:
3174 com_not_test(c, n);
3175 break;
3176 case comparison:
3177 com_comparison(c, n);
3178 break;
3179 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003180 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003181 break;
3182 case expr:
3183 com_expr(c, n);
3184 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003185 case xor_expr:
3186 com_xor_expr(c, n);
3187 break;
3188 case and_expr:
3189 com_and_expr(c, n);
3190 break;
3191 case shift_expr:
3192 com_shift_expr(c, n);
3193 break;
3194 case arith_expr:
3195 com_arith_expr(c, n);
3196 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003197 case term:
3198 com_term(c, n);
3199 break;
3200 case factor:
3201 com_factor(c, n);
3202 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003203 case power:
3204 com_power(c, n);
3205 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003206 case atom:
3207 com_atom(c, n);
3208 break;
3209
3210 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003211 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003212 com_error(c, PyExc_SystemError,
3213 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003214 }
3215}
3216
Tim Petersdbd9ba62000-07-09 03:09:57 +00003217static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003218
3219static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003220com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003221{
3222 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3223 if (TYPE(CHILD(n, 0)) == LPAR)
3224 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003225 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003226 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003227 com_pop(c, 1);
3228 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003229}
3230
3231static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003232com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003233{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003234 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003235 if (NCH(n) == 1) {
3236 com_fpdef(c, CHILD(n, 0));
3237 }
3238 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003239 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003240 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003241 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003242 for (i = 0; i < NCH(n); i += 2)
3243 com_fpdef(c, CHILD(n, i));
3244 }
3245}
3246
3247static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003248com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003249{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003250 int nch, i;
3251 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003252 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003253 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003254 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003255 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003256 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003257 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003258 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003259 node *ch = CHILD(n, i);
3260 node *fp;
3261 char *name;
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003262 PyObject *nameval;
Guido van Rossum50564e81996-01-12 01:13:16 +00003263 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003264 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003265 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3266 fp = CHILD(ch, 0);
3267 if (TYPE(fp) == NAME)
3268 name = STR(fp);
3269 else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003270 name = nbuf;
3271 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003272 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003273 }
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003274 nameval = PyString_InternFromString(name);
3275 if (nameval == NULL) {
3276 c->c_errors++;
3277 }
Peter Schneider-Kamp9a5086c2000-07-13 06:24:29 +00003278 if (PyDict_GetItem(c->c_locals, nameval)) {
Fred Drakedcf08e02000-08-15 15:49:44 +00003279 com_error(c, PyExc_SyntaxError,
3280 "duplicate argument in function definition");
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003281 }
3282 com_newlocal_o(c, nameval);
3283 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003284 c->c_argcount++;
3285 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003286 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003287 ch = CHILD(n, i);
3288 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003289 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003290 else
3291 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003292 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003293 /* Handle *arguments */
3294 if (i < nch) {
3295 node *ch;
3296 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003297 if (TYPE(ch) != DOUBLESTAR) {
3298 REQ(ch, STAR);
3299 ch = CHILD(n, i+1);
3300 if (TYPE(ch) == NAME) {
3301 c->c_flags |= CO_VARARGS;
3302 i += 3;
3303 com_newlocal(c, STR(ch));
3304 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003305 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003306 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003307 /* Handle **keywords */
3308 if (i < nch) {
3309 node *ch;
3310 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003311 if (TYPE(ch) != DOUBLESTAR) {
3312 REQ(ch, STAR);
3313 ch = CHILD(n, i+1);
3314 REQ(ch, STAR);
3315 ch = CHILD(n, i+2);
3316 }
3317 else
3318 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003319 REQ(ch, NAME);
3320 c->c_flags |= CO_VARKEYWORDS;
3321 com_newlocal(c, STR(ch));
3322 }
3323 if (complex) {
3324 /* Generate code for complex arguments only after
3325 having counted the simple arguments */
3326 int ilocal = 0;
3327 for (i = 0; i < nch; i++) {
3328 node *ch = CHILD(n, i);
3329 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003330 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003331 break;
3332 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3333 fp = CHILD(ch, 0);
3334 if (TYPE(fp) != NAME) {
3335 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003336 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003337 com_fpdef(c, ch);
3338 }
3339 ilocal++;
3340 if (++i >= nch)
3341 break;
3342 ch = CHILD(n, i);
3343 if (TYPE(ch) == EQUAL)
3344 i += 2;
3345 else
3346 REQ(ch, COMMA);
3347 }
3348 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003349}
3350
3351static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003352com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003353{
3354 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003355 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003356 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003357 doc = get_docstring(n);
3358 if (doc != NULL) {
3359 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003360 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003361 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003362 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003363 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003364 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003365 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003366 for (i = 0; i < NCH(n); i++) {
3367 node *ch = CHILD(n, i);
3368 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3369 com_node(c, ch);
3370 }
3371}
3372
3373/* Top-level compile-node interface */
3374
3375static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003376compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003377{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003378 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003379 node *ch;
3380 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003381 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003382 doc = get_docstring(CHILD(n, 4));
3383 if (doc != NULL) {
3384 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003385 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003386 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003387 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003388 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003389 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3390 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003391 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003392 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003393 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003394 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003395 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003396 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003397 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003398 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003399 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003400}
3401
3402static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003403compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003404{
Guido van Rossum590baa41993-11-30 13:40:46 +00003405 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003406 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003407 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003408
3409 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003410 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003411 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003412 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003413 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003414 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003415 else
3416 ch = CHILD(n, 2);
3417 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003418 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003419 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003420}
3421
3422static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003423compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003424{
3425 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003426 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003427 REQ(n, classdef);
3428 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3429 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003430#ifdef PRIVATE_NAME_MANGLING
3431 c->c_private = c->c_name;
3432#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003433 ch = CHILD(n, NCH(n)-1); /* The suite */
3434 doc = get_docstring(ch);
3435 if (doc != NULL) {
3436 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003437 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003438 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003439 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003440 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003441 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003442 }
3443 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003444 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003445 com_node(c, ch);
3446 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003447 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003448 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003449 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003450}
3451
3452static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003453compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003454{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003455 com_addoparg(c, SET_LINENO, n->n_lineno);
3456
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003457 switch (TYPE(n)) {
3458
Guido van Rossum4c417781991-01-21 16:09:22 +00003459 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003460 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003461 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003462 n = CHILD(n, 0);
3463 if (TYPE(n) != NEWLINE)
3464 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003465 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003466 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003467 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003468 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003469 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003470 break;
3471
Guido van Rossum4c417781991-01-21 16:09:22 +00003472 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003473 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003474 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003475 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003476 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003477 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003478 break;
3479
Guido van Rossum590baa41993-11-30 13:40:46 +00003480 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003481 com_node(c, CHILD(n, 0));
3482 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003483 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003484 break;
3485
Guido van Rossum590baa41993-11-30 13:40:46 +00003486 case lambdef: /* anonymous function definition */
3487 compile_lambdef(c, n);
3488 break;
3489
Guido van Rossum4c417781991-01-21 16:09:22 +00003490 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003491 compile_funcdef(c, n);
3492 break;
3493
Guido van Rossum4c417781991-01-21 16:09:22 +00003494 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003495 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003496 break;
3497
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003498 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003499 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003500 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003501 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003502 }
3503}
3504
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003505/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00003506
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003507 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
3508 instructions that refer to local variables with LOAD_FAST etc.
3509 The latter instructions are much faster because they don't need to
3510 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003511
Guido van Rossum681d79a1995-07-18 14:51:37 +00003512 To find all local variables, we check all STORE_NAME, IMPORT_FROM
3513 and DELETE_NAME instructions. This yields all local variables,
3514 function definitions, class definitions and import statements.
3515 Argument names have already been entered into the list by the
3516 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003517
3518 All remaining LOAD_NAME instructions must refer to non-local (global
3519 or builtin) variables, so are replaced by LOAD_GLOBAL.
3520
3521 There are two problems: 'from foo import *' and 'exec' may introduce
3522 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00003523 case, we can still optimize bona fide locals (since those
3524 statements will be surrounded by fast_2_locals() and
3525 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003526
Guido van Rossum681d79a1995-07-18 14:51:37 +00003527 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00003528
3529static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003530optimize(struct compiling *c)
Guido van Rossum282914b1991-04-04 10:42:56 +00003531{
Guido van Rossum0a697f61991-04-16 08:39:12 +00003532 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00003533 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00003534 int oparg = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003535 PyObject *name;
3536 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003537
Guido van Rossum282914b1991-04-04 10:42:56 +00003538#define NEXTOP() (*next_instr++)
3539#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossum79f25d91997-04-29 20:08:16 +00003540#define GETITEM(v, i) (PyList_GetItem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003541#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
3542
Guido van Rossum79f25d91997-04-29 20:08:16 +00003543 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003544
3545 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00003546
Guido van Rossum79f25d91997-04-29 20:08:16 +00003547 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003548 for (;;) {
3549 opcode = NEXTOP();
3550 if (opcode == STOP_CODE)
3551 break;
3552 if (HAS_ARG(opcode))
3553 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +00003554 dispatch_opcode1:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003555 switch (opcode) {
3556 case STORE_NAME:
3557 case DELETE_NAME:
3558 case IMPORT_FROM:
3559 com_addlocal_o(c, GETNAMEOBJ(oparg));
3560 break;
Thomas Wouters52152252000-08-17 22:55:00 +00003561 case IMPORT_STAR:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003562 case EXEC_STMT:
3563 c->c_flags &= ~CO_OPTIMIZED;
3564 break;
Fred Drakeef8ace32000-08-24 00:32:09 +00003565 case EXTENDED_ARG:
3566 opcode = NEXTOP();
3567 oparg = oparg<<16 | NEXTARG();
3568 goto dispatch_opcode1;
3569 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00003570 }
3571 }
3572
Thomas Wouters52152252000-08-17 22:55:00 +00003573 /* TBD: Is this still necessary ? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003574 if (PyDict_GetItemString(c->c_locals, "*") != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003575 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003576
Guido van Rossum79f25d91997-04-29 20:08:16 +00003577 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003578 for (;;) {
3579 cur_instr = next_instr;
3580 opcode = NEXTOP();
3581 if (opcode == STOP_CODE)
3582 break;
3583 if (HAS_ARG(opcode))
3584 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +00003585 dispatch_opcode2:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003586 if (opcode == LOAD_NAME ||
3587 opcode == STORE_NAME ||
3588 opcode == DELETE_NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003589 PyObject *v;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003590 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00003591 name = GETNAMEOBJ(oparg);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003592 v = PyDict_GetItem(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003593 if (v == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003594 if (opcode == LOAD_NAME &&
3595 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003596 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003597 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00003598 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003599 i = PyInt_AsLong(v);
Fred Drakeef8ace32000-08-24 00:32:09 +00003600 if (i >> 16) /* too big for 2 bytes */
3601 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003602 switch (opcode) {
3603 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
3604 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
3605 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
3606 }
3607 cur_instr[1] = i & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +00003608 cur_instr[2] = i >> 8;
3609 }
3610 if (opcode == EXTENDED_ARG) {
3611 opcode = NEXTOP();
3612 oparg = oparg<<16 | NEXTARG();
3613 goto dispatch_opcode2;
Guido van Rossum282914b1991-04-04 10:42:56 +00003614 }
3615 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003616
Guido van Rossum681d79a1995-07-18 14:51:37 +00003617 if (c->c_errors == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00003618 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00003619}
3620
Guido van Rossum79f25d91997-04-29 20:08:16 +00003621PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003622PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003623{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003624 return jcompile(n, filename, NULL);
3625}
3626
Guido van Rossum79f25d91997-04-29 20:08:16 +00003627static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003628icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003629{
3630 return jcompile(n, base->c_filename, base);
3631}
3632
Guido van Rossum79f25d91997-04-29 20:08:16 +00003633static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003634jcompile(node *n, char *filename, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003635{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003636 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003637 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003638 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003639 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003640#ifdef PRIVATE_NAME_MANGLING
3641 if (base)
3642 sc.c_private = base->c_private;
3643 else
3644 sc.c_private = NULL;
3645#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003646 compile_node(&sc, n);
3647 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003648 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003649 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003650 sc.c_flags |= CO_NEWLOCALS;
3651 }
3652 else if (TYPE(n) == classdef)
3653 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00003654 co = NULL;
3655 if (sc.c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003656 PyObject *consts, *names, *varnames, *filename, *name;
3657 consts = PyList_AsTuple(sc.c_consts);
3658 names = PyList_AsTuple(sc.c_names);
3659 varnames = PyList_AsTuple(sc.c_varnames);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003660 filename = PyString_InternFromString(sc.c_filename);
3661 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003662 if (!PyErr_Occurred())
3663 co = PyCode_New(sc.c_argcount,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003664 sc.c_nlocals,
Guido van Rossum8b993a91997-01-17 21:04:03 +00003665 sc.c_maxstacklevel,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003666 sc.c_flags,
3667 sc.c_code,
3668 consts,
3669 names,
3670 varnames,
3671 filename,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003672 name,
3673 sc.c_firstlineno,
3674 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003675 Py_XDECREF(consts);
3676 Py_XDECREF(names);
3677 Py_XDECREF(varnames);
3678 Py_XDECREF(filename);
3679 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003680 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003681 else if (!PyErr_Occurred()) {
3682 /* This could happen if someone called PyErr_Clear() after an
3683 error was reported above. That's not supposed to happen,
3684 but I just plugged one case and I'm not sure there can't be
3685 others. In that case, raise SystemError so that at least
3686 it gets reported instead dumping core. */
3687 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3688 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003689 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003690 return co;
3691}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003692
3693int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003694PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003695{
3696 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003697 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003698 int line = co->co_firstlineno;
3699 int addr = 0;
3700 while (--size >= 0) {
3701 addr += *p++;
3702 if (addr > addrq)
3703 break;
3704 line += *p++;
3705 }
3706 return line;
3707}