blob: 3b7c87af7646caf19b271c5da7f37990f936441f [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 *);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000394static void com_assign(struct compiling *, node *, int);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000395static PyCodeObject *icompile(struct _node *, struct compiling *);
396static PyCodeObject *jcompile(struct _node *, char *,
397 struct compiling *);
398static PyObject *parsestrplus(node *);
399static PyObject *parsestr(char *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000400
401static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000402com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000403{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000404 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000405 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
406 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000407 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000408 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000409 goto fail;
410 if ((c->c_const_dict = PyDict_New()) == NULL)
411 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000412 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000413 goto fail;
414 if ((c->c_name_dict = PyDict_New()) == NULL)
415 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000416 if ((c->c_globals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000417 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000418 if ((c->c_locals = 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_varnames = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000421 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000422 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
423 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000424 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000425 c->c_nlocals = 0;
426 c->c_argcount = 0;
427 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000428 c->c_nexti = 0;
429 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000430 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000431 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000432 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000433 c->c_begin = 0;
434 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000435 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000436 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000437 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000438 c->c_stacklevel = 0;
439 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000440 c->c_firstlineno = 0;
441 c->c_last_addr = 0;
442 c->c_last_line = 0;
443 c-> c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000444 c->c_tmpname = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000445 return 1;
446
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000447 fail:
448 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000449 return 0;
450}
451
452static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000453com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000454{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000455 Py_XDECREF(c->c_code);
456 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000457 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000458 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000459 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000460 Py_XDECREF(c->c_globals);
461 Py_XDECREF(c->c_locals);
462 Py_XDECREF(c->c_varnames);
463 Py_XDECREF(c->c_lnotab);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000464}
465
466static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000467com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000468{
469 c->c_stacklevel += n;
470 if (c->c_stacklevel > c->c_maxstacklevel)
471 c->c_maxstacklevel = c->c_stacklevel;
472}
473
474static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000475com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000476{
477 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000478 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000479 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
480 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000481 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000482 c->c_stacklevel = 0;
483 }
484 else
485 c->c_stacklevel -= n;
486}
487
488static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000489com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000490{
491 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000492 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000493 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000494 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000495}
496
497static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000498com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000499{
500 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000501 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000502 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000503 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000504 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000505 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000506 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000507 com_error(c, PyExc_SystemError,
508 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000509 }
510 if (c->c_code == NULL)
511 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000512 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000513 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000514 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000515 c->c_errors++;
516 return;
517 }
518 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000519 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000520}
521
522static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000523com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000524{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000525 com_addbyte(c, x & 0xff);
526 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000527}
528
529static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000530com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000531{
532 int size;
533 char *p;
534 if (c->c_lnotab == NULL)
535 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000536 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000537 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000538 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000539 c->c_errors++;
540 return;
541 }
542 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000543 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000544 *p++ = addr;
545 *p++ = line;
546 c->c_lnotab_next += 2;
547}
548
549static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000550com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000551{
552 c->c_lineno = lineno;
553 if (c->c_firstlineno == 0) {
554 c->c_firstlineno = c->c_last_line = lineno;
555 }
556 else {
557 int incr_addr = c->c_nexti - c->c_last_addr;
558 int incr_line = lineno - c->c_last_line;
559 while (incr_addr > 0 || incr_line > 0) {
560 int trunc_addr = incr_addr;
561 int trunc_line = incr_line;
562 if (trunc_addr > 255)
563 trunc_addr = 255;
564 if (trunc_line > 255)
565 trunc_line = 255;
566 com_add_lnotab(c, trunc_addr, trunc_line);
567 incr_addr -= trunc_addr;
568 incr_line -= trunc_line;
569 }
570 c->c_last_addr = c->c_nexti;
571 c->c_last_line = lineno;
572 }
573}
574
575static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000576com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000577{
Fred Drakeef8ace32000-08-24 00:32:09 +0000578 int extended_arg = arg >> 16;
Guido van Rossum8e793d91997-03-03 19:13:14 +0000579 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000580 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000581 if (Py_OptimizeFlag)
582 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000583 }
Fred Drakeef8ace32000-08-24 00:32:09 +0000584 if (extended_arg){
585 com_addbyte(c, EXTENDED_ARG);
586 com_addint(c, extended_arg);
587 arg &= 0xffff;
588 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000589 com_addbyte(c, op);
590 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000591}
592
593static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000594com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000595{
596 /* Compile a forward reference for backpatching */
597 int here;
598 int anchor;
599 com_addbyte(c, op);
600 here = c->c_nexti;
601 anchor = *p_anchor;
602 *p_anchor = here;
603 com_addint(c, anchor == 0 ? 0 : here - anchor);
604}
605
606static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000607com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000608{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000609 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000610 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000611 int dist;
612 int prev;
613 for (;;) {
614 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000615 prev = code[anchor] + (code[anchor+1] << 8);
616 dist = target - (anchor+2);
617 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000618 dist >>= 8;
619 code[anchor+1] = dist;
620 dist >>= 8;
621 if (dist) {
622 com_error(c, PyExc_SystemError,
623 "com_backpatch: offset too large");
624 break;
625 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000626 if (!prev)
627 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000628 anchor -= prev;
629 }
630}
631
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000632/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000633
634static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000635com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000636{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000637 PyObject *w, *t, *np=NULL;
638 long n;
639
640 t = Py_BuildValue("(OO)", v, v->ob_type);
641 if (t == NULL)
642 goto fail;
643 w = PyDict_GetItem(dict, t);
644 if (w != NULL) {
645 n = PyInt_AsLong(w);
646 } else {
647 n = PyList_Size(list);
648 np = PyInt_FromLong(n);
649 if (np == NULL)
650 goto fail;
651 if (PyList_Append(list, v) != 0)
652 goto fail;
653 if (PyDict_SetItem(dict, t, np) != 0)
654 goto fail;
655 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000656 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000657 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000658 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000659 fail:
660 Py_XDECREF(np);
661 Py_XDECREF(t);
662 c->c_errors++;
663 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000664}
665
666static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000667com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000668{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000669 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000670}
671
672static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000673com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000674{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000675 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000676}
677
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000678#ifdef PRIVATE_NAME_MANGLING
679static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000680com_mangle(struct compiling *c, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000681{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000682 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000683 This is independent from how the name is used. */
684 char *p;
Guido van Rossum582acec2000-06-28 22:07:35 +0000685 size_t nlen, plen;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000686 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000687 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000688 return 0; /* Don't mangle __extremely_long_names */
689 if (name[nlen-1] == '_' && name[nlen-2] == '_')
690 return 0; /* Don't mangle __whatever__ */
691 p = c->c_private;
692 /* Strip leading underscores from class name */
693 while (*p == '_')
694 p++;
695 if (*p == '\0')
696 return 0; /* Don't mangle if class is just underscores */
697 plen = strlen(p);
698 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000699 plen = maxlen-nlen-2; /* Truncate class name if too long */
700 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000701 buffer[0] = '_';
702 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000703 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000704 /* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
705 return 1;
706}
707#endif
708
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000709static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000710com_addopnamestr(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000711{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000712 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000713 int i;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000714#ifdef PRIVATE_NAME_MANGLING
715 char buffer[256];
716 if (name != NULL && name[0] == '_' && name[1] == '_' &&
717 c->c_private != NULL &&
Guido van Rossum582acec2000-06-28 22:07:35 +0000718 com_mangle(c, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000719 name = buffer;
720#endif
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000721 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000722 c->c_errors++;
723 i = 255;
724 }
725 else {
726 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000727 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000728 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000729 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
730 switch (op) {
731 case LOAD_NAME:
732 case STORE_NAME:
733 case DELETE_NAME:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000734 if (PyDict_GetItemString(c->c_globals, name) != NULL) {
Guido van Rossumc5e96291991-12-10 13:53:51 +0000735 switch (op) {
736 case LOAD_NAME: op = LOAD_GLOBAL; break;
737 case STORE_NAME: op = STORE_GLOBAL; break;
738 case DELETE_NAME: op = DELETE_GLOBAL; break;
739 }
740 }
741 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000742 com_addoparg(c, op, i);
743}
744
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000745static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000746com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000747{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000748 char *name;
749 char buffer[1000];
750 /* XXX it is possible to write this code without the 1000
751 chars on the total length of dotted names, I just can't be
752 bothered right now */
753 if (TYPE(n) == STAR)
754 name = "*";
755 else if (TYPE(n) == dotted_name) {
756 char *p = buffer;
757 int i;
758 name = buffer;
759 for (i = 0; i < NCH(n); i += 2) {
760 char *s = STR(CHILD(n, i));
761 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000762 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000763 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +0000764 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000765 break;
766 }
767 if (p != buffer)
768 *p++ = '.';
769 strcpy(p, s);
770 p = strchr(p, '\0');
771 }
772 }
773 else {
774 REQ(n, NAME);
775 name = STR(n);
776 }
777 com_addopnamestr(c, op, name);
778}
779
Guido van Rossum79f25d91997-04-29 20:08:16 +0000780static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000781parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000782{
Tim Petersdbd9ba62000-07-09 03:09:57 +0000783 extern double atof(const char *);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000784 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000785 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000786 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +0000787#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +0000788 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +0000789 int imflag;
790#endif
791
Guido van Rossum282914b1991-04-04 10:42:56 +0000792 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000793 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +0000794#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +0000795 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +0000796#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000797 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000798 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000799 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000800 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000801 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000802 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000803 if (*end == '\0') {
804 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000805 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000806 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000807 return NULL;
808 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000809 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000810 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000811 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +0000812#ifndef WITHOUT_COMPLEX
813 if (imflag) {
814 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000815 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +0000816 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000817 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000818 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +0000819 }
Guido van Rossumac1fc951997-10-08 15:23:55 +0000820 else
Guido van Rossum50564e81996-01-12 01:13:16 +0000821#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +0000822 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000823 PyFPE_START_PROTECT("atof", return 0)
824 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000825 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000826 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000827 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000828}
829
Guido van Rossum79f25d91997-04-29 20:08:16 +0000830static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000831parsestr(char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000832{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000833 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +0000834 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000835 char *buf;
836 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000837 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000838 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +0000839 int first = *s;
840 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000841 int rawmode = 0;
842 int unicode = 0;
843 if (isalpha(quote) || quote == '_') {
844 if (quote == 'u' || quote == 'U') {
845 quote = *++s;
846 unicode = 1;
847 }
848 if (quote == 'r' || quote == 'R') {
849 quote = *++s;
850 rawmode = 1;
851 }
852 }
Guido van Rossum8054fad1993-10-26 15:19:44 +0000853 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000854 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000855 return NULL;
856 }
857 s++;
858 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +0000859 if (len > INT_MAX) {
860 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
861 return NULL;
862 }
Guido van Rossum8054fad1993-10-26 15:19:44 +0000863 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000864 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000865 return NULL;
866 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000867 if (len >= 4 && s[0] == quote && s[1] == quote) {
868 s += 2;
869 len -= 2;
870 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000871 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000872 return NULL;
873 }
874 }
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +0000875 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000876 if (rawmode)
877 return PyUnicode_DecodeRawUnicodeEscape(
878 s, len, NULL);
879 else
880 return PyUnicode_DecodeUnicodeEscape(
881 s, len, NULL);
882 }
883 else if (rawmode || strchr(s, '\\') == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000884 return PyString_FromStringAndSize(s, len);
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000885 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000886 v = PyString_FromStringAndSize((char *)NULL, len);
887 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000888 end = s + len;
889 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000890 if (*s != '\\') {
891 *p++ = *s++;
892 continue;
893 }
894 s++;
895 switch (*s++) {
896 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000897 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000898 case '\\': *p++ = '\\'; break;
899 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000900 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000901 case 'b': *p++ = '\b'; break;
902 case 'f': *p++ = '\014'; break; /* FF */
903 case 't': *p++ = '\t'; break;
904 case 'n': *p++ = '\n'; break;
905 case 'r': *p++ = '\r'; break;
906 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000907 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
908 case '0': case '1': case '2': case '3':
909 case '4': case '5': case '6': case '7':
910 c = s[-1] - '0';
911 if ('0' <= *s && *s <= '7') {
912 c = (c<<3) + *s++ - '0';
913 if ('0' <= *s && *s <= '7')
914 c = (c<<3) + *s++ - '0';
915 }
916 *p++ = c;
917 break;
918 case 'x':
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000919 if (isxdigit(Py_CHARMASK(*s))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000920 unsigned int x = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000921 do {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000922 c = Py_CHARMASK(*s);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000923 s++;
Guido van Rossumed1100f1997-10-20 23:24:07 +0000924 x = (x<<4) & ~0xF;
925 if (isdigit(c))
926 x += c - '0';
927 else if (islower(c))
928 x += 10 + c - 'a';
929 else
930 x += 10 + c - 'A';
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000931 } while (isxdigit(Py_CHARMASK(*s)));
Guido van Rossumed1100f1997-10-20 23:24:07 +0000932 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000933 break;
934 }
935 /* FALLTHROUGH */
936 default: *p++ = '\\'; *p++ = s[-1]; break;
937 }
938 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000939 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000940 return v;
941}
942
Guido van Rossum79f25d91997-04-29 20:08:16 +0000943static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000944parsestrplus(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000945{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000946 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000947 int i;
948 REQ(CHILD(n, 0), STRING);
949 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
950 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +0000951 for (i = 1; i < NCH(n); i++) {
952 PyObject *s;
953 s = parsestr(STR(CHILD(n, i)));
954 if (s == NULL)
955 goto onError;
956 if (PyString_Check(v) && PyString_Check(s)) {
957 PyString_ConcatAndDel(&v, s);
958 if (v == NULL)
959 goto onError;
960 }
961 else {
962 PyObject *temp;
963 temp = PyUnicode_Concat(v, s);
964 Py_DECREF(s);
965 if (temp == NULL)
966 goto onError;
967 Py_DECREF(v);
968 v = temp;
969 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000970 }
971 }
972 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +0000973
974 onError:
975 Py_XDECREF(v);
976 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000977}
978
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000979static void
Skip Montanaro803d6e52000-08-12 18:09:51 +0000980com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000981{
Skip Montanaro803d6e52000-08-12 18:09:51 +0000982 PyObject *v;
983 int anchor = 0;
984 int save_begin = c->c_begin;
985
986 /* list_iter: for v in expr [list_iter] */
987 com_node(c, CHILD(n, 3)); /* expr */
988 v = PyInt_FromLong(0L);
989 if (v == NULL)
990 c->c_errors++;
991 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
992 com_push(c, 1);
993 Py_XDECREF(v);
994 c->c_begin = c->c_nexti;
995 com_addoparg(c, SET_LINENO, n->n_lineno);
996 com_addfwref(c, FOR_LOOP, &anchor);
997 com_push(c, 1);
998 com_assign(c, CHILD(n, 1), OP_ASSIGN);
999 c->c_loops++;
1000 com_list_iter(c, n, e, t);
1001 c->c_loops--;
1002 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1003 c->c_begin = save_begin;
1004 com_backpatch(c, anchor);
1005 com_pop(c, 2); /* FOR_LOOP has popped these */
1006}
1007
1008static void
1009com_list_if(struct compiling *c, node *n, node *e, char *t)
1010{
1011 int anchor = 0;
1012 int a = 0;
1013 /* list_iter: 'if' test [list_iter] */
1014 com_addoparg(c, SET_LINENO, n->n_lineno);
1015 com_node(c, CHILD(n, 1));
1016 com_addfwref(c, JUMP_IF_FALSE, &a);
1017 com_addbyte(c, POP_TOP);
1018 com_pop(c, 1);
1019 com_list_iter(c, n, e, t);
1020 com_addfwref(c, JUMP_FORWARD, &anchor);
1021 com_backpatch(c, a);
1022 /* We jump here with an extra entry which we now pop */
1023 com_addbyte(c, POP_TOP);
1024 com_backpatch(c, anchor);
1025}
1026
1027static void
1028com_list_iter(struct compiling *c,
1029 node *p, /* parent of list_iter node */
1030 node *e, /* element expression node */
1031 char *t /* name of result list temp local */)
1032{
1033 /* list_iter is the last child in a listmaker, list_for, or list_if */
1034 node *n = CHILD(p, NCH(p)-1);
1035 if (TYPE(n) == list_iter) {
1036 n = CHILD(n, 0);
1037 switch (TYPE(n)) {
1038 case list_for:
1039 com_list_for(c, n, e, t);
1040 break;
1041 case list_if:
1042 com_list_if(c, n, e, t);
1043 break;
1044 default:
1045 com_error(c, PyExc_SystemError,
1046 "invalid list_iter node type");
1047 }
1048 }
1049 else {
1050 com_addopnamestr(c, LOAD_NAME, t);
1051 com_push(c, 1);
1052 com_node(c, e);
1053 com_addoparg(c, CALL_FUNCTION, 1);
1054 com_addbyte(c, POP_TOP);
1055 com_pop(c, 2);
1056 }
1057}
1058
1059static void
1060com_list_comprehension(struct compiling *c, node *n)
1061{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001062 /* listmaker: test list_for */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001063 char tmpname[12];
1064 sprintf(tmpname, "__%d__", ++c->c_tmpname);
1065 com_addoparg(c, BUILD_LIST, 0);
1066 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1067 com_push(c, 2);
1068 com_addopnamestr(c, LOAD_ATTR, "append");
1069 com_addopnamestr(c, STORE_NAME, tmpname);
1070 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001071 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001072 com_addopnamestr(c, DELETE_NAME, tmpname);
1073 --c->c_tmpname;
1074}
1075
1076static void
1077com_listmaker(struct compiling *c, node *n)
1078{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001079 /* listmaker: test ( list_for | (',' test)* [','] ) */
1080 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001081 com_list_comprehension(c, n);
1082 else {
1083 int len = 0;
1084 int i;
1085 for (i = 0; i < NCH(n); i += 2, len++)
1086 com_node(c, CHILD(n, i));
1087 com_addoparg(c, BUILD_LIST, len);
1088 com_pop(c, len-1);
1089 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001090}
1091
1092static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001093com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001094{
1095 int i;
1096 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1097 for (i = 0; i+2 < NCH(n); i += 4) {
1098 /* We must arrange things just right for STORE_SUBSCR.
1099 It wants the stack to look like (value) (dict) (key) */
1100 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001101 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001102 com_node(c, CHILD(n, i+2)); /* value */
1103 com_addbyte(c, ROT_TWO);
1104 com_node(c, CHILD(n, i)); /* key */
1105 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001106 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001107 }
1108}
1109
1110static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001111com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001112{
1113 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001114 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001115 int i;
1116 REQ(n, atom);
1117 ch = CHILD(n, 0);
1118 switch (TYPE(ch)) {
1119 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001120 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001121 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001122 com_push(c, 1);
1123 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001124 else
1125 com_node(c, CHILD(n, 1));
1126 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001127 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001128 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001129 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001130 com_push(c, 1);
1131 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001132 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001133 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001134 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001135 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001136 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001137 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001138 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001139 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001140 break;
1141 case BACKQUOTE:
1142 com_node(c, CHILD(n, 1));
1143 com_addbyte(c, UNARY_CONVERT);
1144 break;
1145 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001146 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001147 i = 255;
1148 }
1149 else {
1150 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001151 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001152 }
1153 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001154 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001155 break;
1156 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001157 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001158 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001159 c->c_errors++;
1160 i = 255;
1161 }
1162 else {
1163 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001164 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001165 }
1166 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001167 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001168 break;
1169 case NAME:
1170 com_addopname(c, LOAD_NAME, ch);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001171 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001172 break;
1173 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001174 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001175 com_error(c, PyExc_SystemError,
1176 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001177 }
1178}
1179
1180static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001181com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001182{
1183 if (NCH(n) == 1) {
1184 com_addbyte(c, op);
1185 }
1186 else if (NCH(n) == 2) {
1187 if (TYPE(CHILD(n, 0)) != COLON) {
1188 com_node(c, CHILD(n, 0));
1189 com_addbyte(c, op+1);
1190 }
1191 else {
1192 com_node(c, CHILD(n, 1));
1193 com_addbyte(c, op+2);
1194 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001195 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001196 }
1197 else {
1198 com_node(c, CHILD(n, 0));
1199 com_node(c, CHILD(n, 2));
1200 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001201 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001202 }
1203}
1204
Guido van Rossum635abd21997-01-06 22:56:52 +00001205static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001206com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001207{
1208 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001209 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001210 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001211 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001212 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001213 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001214 }
1215 else {
1216 com_node(c, CHILD(n, 0));
1217 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001218 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001219 }
1220 m = n;
1221 do {
1222 m = CHILD(m, 0);
1223 } while (NCH(m) == 1);
1224 if (TYPE(m) != NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001225 com_error(c, PyExc_SyntaxError,
1226 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001227 }
1228 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001229 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001230 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001231 *pkeywords = PyDict_New();
Guido van Rossum635abd21997-01-06 22:56:52 +00001232 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001233 c->c_errors++;
1234 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001235 if (PyDict_GetItem(*pkeywords, v) != NULL)
1236 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001237 "duplicate keyword argument");
1238 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001239 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001240 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001241 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001242 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001243 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001244 }
1245 }
1246 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001247}
1248
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001249static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001250com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001251{
1252 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001253 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001254 }
1255 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001256 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001257 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001258 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001259 int star_flag = 0;
1260 int starstar_flag = 0;
1261 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001262 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001263 na = 0;
1264 nk = 0;
1265 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001266 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001267 if (TYPE(ch) == STAR ||
1268 TYPE(ch) == DOUBLESTAR)
1269 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001270 if (ch->n_lineno != lineno) {
1271 lineno = ch->n_lineno;
1272 com_addoparg(c, SET_LINENO, lineno);
1273 }
1274 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001275 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001276 na++;
1277 else
1278 nk++;
1279 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001280 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001281 while (i < NCH(n)) {
1282 node *tok = CHILD(n, i);
1283 node *ch = CHILD(n, i+1);
1284 i += 3;
1285 switch (TYPE(tok)) {
1286 case STAR: star_flag = 1; break;
1287 case DOUBLESTAR: starstar_flag = 1; break;
1288 }
1289 com_node(c, ch);
1290 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001291 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001292 com_error(c, PyExc_SyntaxError,
1293 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001294 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001295 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001296 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001297 star_flag + (starstar_flag << 1);
1298 else
1299 opcode = CALL_FUNCTION;
1300 com_addoparg(c, opcode, na | (nk << 8));
1301 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001302 }
1303}
1304
1305static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001306com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001307{
1308 com_addopname(c, LOAD_ATTR, n);
1309}
1310
1311static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001312com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001313{
1314 int i=0;
1315 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001316 node *ch;
1317
1318 /* first argument */
1319 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001320 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001321 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001322 i++;
1323 }
1324 else {
1325 com_node(c, CHILD(n,i));
1326 i++;
1327 REQ(CHILD(n,i),COLON);
1328 i++;
1329 }
1330 /* second argument */
1331 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1332 com_node(c, CHILD(n,i));
1333 i++;
1334 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001335 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001336 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001337 com_push(c, 1);
1338 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001339 /* remaining arguments */
1340 for (; i < NCH(n); i++) {
1341 ns++;
1342 ch=CHILD(n,i);
1343 REQ(ch, sliceop);
1344 if (NCH(ch) == 1) {
1345 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001346 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001347 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001348 }
1349 else
1350 com_node(c, CHILD(ch,1));
1351 }
1352 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001353 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001354}
1355
1356static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001357com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001358{
1359 node *ch;
1360 REQ(n, subscript);
1361 ch = CHILD(n,0);
1362 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001363 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001364 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001365 com_push(c, 1);
1366 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001367 else {
1368 /* check for slice */
1369 if ((TYPE(ch) == COLON || NCH(n) > 1))
1370 com_sliceobj(c, n);
1371 else {
1372 REQ(ch, test);
1373 com_node(c, ch);
1374 }
1375 }
1376}
1377
1378static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001379com_subscriptlist(struct compiling *c, node *n, int assigning)
Guido van Rossum8861b741996-07-30 16:49:37 +00001380{
1381 int i, op;
1382 REQ(n, subscriptlist);
1383 /* Check to make backward compatible slice behavior for '[i:j]' */
1384 if (NCH(n) == 1) {
1385 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001386 /* 'Basic' slice, should have exactly one colon. */
1387 if ((TYPE(CHILD(sub, 0)) == COLON
1388 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1389 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1390 {
Guido van Rossum8861b741996-07-30 16:49:37 +00001391 if (assigning == OP_APPLY)
1392 op = SLICE;
1393 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001394 op = ((assigning == OP_ASSIGN) ?
1395 STORE_SLICE : DELETE_SLICE);
Guido van Rossum8861b741996-07-30 16:49:37 +00001396 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001397 if (op == STORE_SLICE)
1398 com_pop(c, 2);
1399 else if (op == DELETE_SLICE)
1400 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001401 return;
1402 }
1403 }
1404 /* Else normal subscriptlist. Compile each subscript. */
1405 for (i = 0; i < NCH(n); i += 2)
1406 com_subscript(c, CHILD(n, i));
1407 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001408 if (NCH(n) > 1) {
1409 i = (NCH(n)+1) / 2;
1410 com_addoparg(c, BUILD_TUPLE, i);
1411 com_pop(c, i-1);
1412 }
1413 if (assigning == OP_APPLY) {
Guido van Rossum8861b741996-07-30 16:49:37 +00001414 op = BINARY_SUBSCR;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001415 i = 1;
1416 }
1417 else if (assigning == OP_ASSIGN) {
1418 op = STORE_SUBSCR;
1419 i = 3;
1420 }
1421 else {
1422 op = DELETE_SUBSCR;
1423 i = 2;
1424 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001425 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001426 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001427}
1428
1429static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001430com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001431{
1432 REQ(n, trailer);
1433 switch (TYPE(CHILD(n, 0))) {
1434 case LPAR:
1435 com_call_function(c, CHILD(n, 1));
1436 break;
1437 case DOT:
1438 com_select_member(c, CHILD(n, 1));
1439 break;
1440 case LSQB:
Guido van Rossum8861b741996-07-30 16:49:37 +00001441 com_subscriptlist(c, CHILD(n, 1), OP_APPLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001442 break;
1443 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001444 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001445 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001446 }
1447}
1448
1449static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001450com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001451{
1452 int i;
1453 REQ(n, power);
1454 com_atom(c, CHILD(n, 0));
1455 for (i = 1; i < NCH(n); i++) {
1456 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1457 com_factor(c, CHILD(n, i+1));
1458 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001459 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001460 break;
1461 }
1462 else
1463 com_apply_trailer(c, CHILD(n, i));
1464 }
1465}
1466
1467static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001468com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001469{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001470 REQ(n, factor);
1471 if (TYPE(CHILD(n, 0)) == PLUS) {
1472 com_factor(c, CHILD(n, 1));
1473 com_addbyte(c, UNARY_POSITIVE);
1474 }
1475 else if (TYPE(CHILD(n, 0)) == MINUS) {
1476 com_factor(c, CHILD(n, 1));
1477 com_addbyte(c, UNARY_NEGATIVE);
1478 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001479 else if (TYPE(CHILD(n, 0)) == TILDE) {
1480 com_factor(c, CHILD(n, 1));
1481 com_addbyte(c, UNARY_INVERT);
1482 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001483 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001484 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001485 }
1486}
1487
1488static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001489com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001490{
1491 int i;
1492 int op;
1493 REQ(n, term);
1494 com_factor(c, CHILD(n, 0));
1495 for (i = 2; i < NCH(n); i += 2) {
1496 com_factor(c, CHILD(n, i));
1497 switch (TYPE(CHILD(n, i-1))) {
1498 case STAR:
1499 op = BINARY_MULTIPLY;
1500 break;
1501 case SLASH:
1502 op = BINARY_DIVIDE;
1503 break;
1504 case PERCENT:
1505 op = BINARY_MODULO;
1506 break;
1507 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001508 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001509 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001510 op = 255;
1511 }
1512 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001513 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001514 }
1515}
1516
1517static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001518com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001519{
1520 int i;
1521 int op;
1522 REQ(n, arith_expr);
1523 com_term(c, CHILD(n, 0));
1524 for (i = 2; i < NCH(n); i += 2) {
1525 com_term(c, CHILD(n, i));
1526 switch (TYPE(CHILD(n, i-1))) {
1527 case PLUS:
1528 op = BINARY_ADD;
1529 break;
1530 case MINUS:
1531 op = BINARY_SUBTRACT;
1532 break;
1533 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001534 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001535 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001536 op = 255;
1537 }
1538 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001539 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001540 }
1541}
1542
1543static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001544com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001545{
1546 int i;
1547 int op;
1548 REQ(n, shift_expr);
1549 com_arith_expr(c, CHILD(n, 0));
1550 for (i = 2; i < NCH(n); i += 2) {
1551 com_arith_expr(c, CHILD(n, i));
1552 switch (TYPE(CHILD(n, i-1))) {
1553 case LEFTSHIFT:
1554 op = BINARY_LSHIFT;
1555 break;
1556 case RIGHTSHIFT:
1557 op = BINARY_RSHIFT;
1558 break;
1559 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001560 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001561 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001562 op = 255;
1563 }
1564 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001565 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001566 }
1567}
1568
1569static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001570com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001571{
1572 int i;
1573 int op;
1574 REQ(n, and_expr);
1575 com_shift_expr(c, CHILD(n, 0));
1576 for (i = 2; i < NCH(n); i += 2) {
1577 com_shift_expr(c, CHILD(n, i));
1578 if (TYPE(CHILD(n, i-1)) == AMPER) {
1579 op = BINARY_AND;
1580 }
1581 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001582 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001583 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001584 op = 255;
1585 }
1586 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001587 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001588 }
1589}
1590
1591static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001592com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001593{
1594 int i;
1595 int op;
1596 REQ(n, xor_expr);
1597 com_and_expr(c, CHILD(n, 0));
1598 for (i = 2; i < NCH(n); i += 2) {
1599 com_and_expr(c, CHILD(n, i));
1600 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1601 op = BINARY_XOR;
1602 }
1603 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001604 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001605 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001606 op = 255;
1607 }
1608 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001609 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001610 }
1611}
1612
1613static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001614com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001615{
1616 int i;
1617 int op;
1618 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001619 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001620 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001621 com_xor_expr(c, CHILD(n, i));
1622 if (TYPE(CHILD(n, i-1)) == VBAR) {
1623 op = BINARY_OR;
1624 }
1625 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001626 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001627 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001628 op = 255;
1629 }
1630 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001631 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001632 }
1633}
1634
1635static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001636cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001637{
1638 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001639 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001640 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1641 if (NCH(n) == 1) {
1642 n = CHILD(n, 0);
1643 switch (TYPE(n)) {
1644 case LESS: return LT;
1645 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001646 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001647 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001648 case LESSEQUAL: return LE;
1649 case GREATEREQUAL: return GE;
1650 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001651 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1652 if (strcmp(STR(n), "is") == 0) return IS;
1653 }
1654 }
1655 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001656 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001657 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1658 return NOT_IN;
1659 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1660 return IS_NOT;
1661 }
1662 }
1663 return BAD;
1664}
1665
1666static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001667com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001668{
1669 int i;
1670 enum cmp_op op;
1671 int anchor;
1672 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1673 com_expr(c, CHILD(n, 0));
1674 if (NCH(n) == 1)
1675 return;
1676
1677 /****************************************************************
1678 The following code is generated for all but the last
1679 comparison in a chain:
1680
1681 label: on stack: opcode: jump to:
1682
1683 a <code to load b>
1684 a, b DUP_TOP
1685 a, b, b ROT_THREE
1686 b, a, b COMPARE_OP
1687 b, 0-or-1 JUMP_IF_FALSE L1
1688 b, 1 POP_TOP
1689 b
1690
1691 We are now ready to repeat this sequence for the next
1692 comparison in the chain.
1693
1694 For the last we generate:
1695
1696 b <code to load c>
1697 b, c COMPARE_OP
1698 0-or-1
1699
1700 If there were any jumps to L1 (i.e., there was more than one
1701 comparison), we generate:
1702
1703 0-or-1 JUMP_FORWARD L2
1704 L1: b, 0 ROT_TWO
1705 0, b POP_TOP
1706 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00001707 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001708 ****************************************************************/
1709
1710 anchor = 0;
1711
1712 for (i = 2; i < NCH(n); i += 2) {
1713 com_expr(c, CHILD(n, i));
1714 if (i+2 < NCH(n)) {
1715 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001716 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001717 com_addbyte(c, ROT_THREE);
1718 }
1719 op = cmp_type(CHILD(n, i-1));
1720 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001721 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001722 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001723 }
1724 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001725 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001726 if (i+2 < NCH(n)) {
1727 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1728 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001729 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001730 }
1731 }
1732
1733 if (anchor) {
1734 int anchor2 = 0;
1735 com_addfwref(c, JUMP_FORWARD, &anchor2);
1736 com_backpatch(c, anchor);
1737 com_addbyte(c, ROT_TWO);
1738 com_addbyte(c, POP_TOP);
1739 com_backpatch(c, anchor2);
1740 }
1741}
1742
1743static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001744com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001745{
1746 REQ(n, not_test); /* 'not' not_test | comparison */
1747 if (NCH(n) == 1) {
1748 com_comparison(c, CHILD(n, 0));
1749 }
1750 else {
1751 com_not_test(c, CHILD(n, 1));
1752 com_addbyte(c, UNARY_NOT);
1753 }
1754}
1755
1756static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001757com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001758{
1759 int i;
1760 int anchor;
1761 REQ(n, and_test); /* not_test ('and' not_test)* */
1762 anchor = 0;
1763 i = 0;
1764 for (;;) {
1765 com_not_test(c, CHILD(n, i));
1766 if ((i += 2) >= NCH(n))
1767 break;
1768 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1769 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001770 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001771 }
1772 if (anchor)
1773 com_backpatch(c, anchor);
1774}
1775
1776static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001777com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001778{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001779 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00001780 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001781 PyObject *v;
Guido van Rossum57531fe1993-11-30 14:57:42 +00001782 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001783 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001784 v = (PyObject *) icompile(CHILD(n, 0), c);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001785 if (v == NULL) {
1786 c->c_errors++;
1787 i = 255;
1788 }
1789 else {
1790 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001791 Py_DECREF(v);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001792 }
1793 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001794 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001795 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001796 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001797 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001798 else {
1799 int anchor = 0;
1800 int i = 0;
1801 for (;;) {
1802 com_and_test(c, CHILD(n, i));
1803 if ((i += 2) >= NCH(n))
1804 break;
1805 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1806 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001807 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001808 }
1809 if (anchor)
1810 com_backpatch(c, anchor);
1811 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001812}
1813
1814static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001815com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001816{
1817 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001818 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001819 com_node(c, CHILD(n, 0));
1820 }
1821 else {
1822 int i;
1823 int len;
1824 len = (NCH(n) + 1) / 2;
1825 for (i = 0; i < NCH(n); i += 2)
1826 com_node(c, CHILD(n, i));
1827 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001828 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001829 }
1830}
1831
1832
1833/* Begin of assignment compilation */
1834
Tim Petersdbd9ba62000-07-09 03:09:57 +00001835static void com_assign_name(struct compiling *, node *, int);
1836static void com_assign(struct compiling *, node *, int);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001837
1838static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001839com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001840{
1841 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001842 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001843}
1844
1845static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001846com_assign_trailer(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001847{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001848 REQ(n, trailer);
1849 switch (TYPE(CHILD(n, 0))) {
1850 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001851 com_error(c, PyExc_SyntaxError,
1852 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001853 break;
1854 case DOT: /* '.' NAME */
1855 com_assign_attr(c, CHILD(n, 1), assigning);
1856 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001857 case LSQB: /* '[' subscriptlist ']' */
1858 com_subscriptlist(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001859 break;
1860 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001861 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001862 }
1863}
1864
1865static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001866com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001867{
1868 int i;
1869 if (TYPE(n) != testlist)
1870 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001871 if (assigning) {
1872 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001873 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001874 com_push(c, i-1);
1875 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001876 for (i = 0; i < NCH(n); i += 2)
1877 com_assign(c, CHILD(n, i), assigning);
1878}
1879
1880static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001881com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001882{
1883 REQ(n, NAME);
1884 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001885 if (assigning)
1886 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001887}
1888
1889static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001890com_assign(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001891{
1892 /* Loop to avoid trivial recursion */
1893 for (;;) {
1894 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001895
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001896 case exprlist:
1897 case testlist:
1898 if (NCH(n) > 1) {
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001899 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001900 return;
1901 }
1902 n = CHILD(n, 0);
1903 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001904
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001905 case test:
1906 case and_test:
1907 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001908 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001909 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001910 case xor_expr:
1911 case and_expr:
1912 case shift_expr:
1913 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001914 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00001915 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001916 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001917 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001918 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001919 return;
1920 }
1921 n = CHILD(n, 0);
1922 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001923
Guido van Rossum50564e81996-01-12 01:13:16 +00001924 case power: /* atom trailer* ('**' power)* */
1925/* ('+'|'-'|'~') factor | atom trailer* */
1926 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001927 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001928 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001929 return;
1930 }
Guido van Rossum50564e81996-01-12 01:13:16 +00001931 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001932 int i;
1933 com_node(c, CHILD(n, 0));
1934 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00001935 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001936 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001937 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00001938 return;
1939 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001940 com_apply_trailer(c, CHILD(n, i));
1941 } /* NB i is still alive */
1942 com_assign_trailer(c,
1943 CHILD(n, i), assigning);
1944 return;
1945 }
1946 n = CHILD(n, 0);
1947 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001948
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001949 case atom:
1950 switch (TYPE(CHILD(n, 0))) {
1951 case LPAR:
1952 n = CHILD(n, 1);
1953 if (TYPE(n) == RPAR) {
1954 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001955 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001956 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001957 return;
1958 }
1959 break;
1960 case LSQB:
1961 n = CHILD(n, 1);
1962 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001963 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001964 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001965 return;
1966 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001967 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001968 return;
1969 case NAME:
1970 com_assign_name(c, CHILD(n, 0), assigning);
1971 return;
1972 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001973 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001974 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001975 return;
1976 }
1977 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001978
1979 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001980 com_error(c, PyExc_SyntaxError,
1981 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001982 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001983
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001984 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001985 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001986 com_error(c, PyExc_SystemError,
1987 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001988 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001989
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001990 }
1991 }
1992}
Guido van Rossum7c531111997-03-11 18:42:21 +00001993
Tim Petersdbd9ba62000-07-09 03:09:57 +00001994/* Forward */ static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001995
1996static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001997com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001998{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001999 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002000 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002001 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002002 return;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002003 com_node(c, CHILD(n, NCH(n)-1));
2004 if (NCH(n) == 1) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002005 if (c->c_interactive)
2006 com_addbyte(c, PRINT_EXPR);
2007 else
2008 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002009 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002010 }
2011 else {
2012 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002013 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002014 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002015 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002016 com_push(c, 1);
2017 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002018 com_assign(c, CHILD(n, i), OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002019 }
2020 }
2021}
2022
2023static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002024com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002025{
2026 int a = 0, b = 0;
2027 int i;
2028 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2029 /* Generate code like for
2030
2031 if __debug__:
2032 if not <test>:
2033 raise AssertionError [, <message>]
2034
2035 where <message> is the second test, if present.
2036 */
2037 if (Py_OptimizeFlag)
2038 return;
2039 com_addopnamestr(c, LOAD_GLOBAL, "__debug__");
2040 com_push(c, 1);
2041 com_addfwref(c, JUMP_IF_FALSE, &a);
2042 com_addbyte(c, POP_TOP);
2043 com_pop(c, 1);
2044 com_node(c, CHILD(n, 1));
2045 com_addfwref(c, JUMP_IF_TRUE, &b);
2046 com_addbyte(c, POP_TOP);
2047 com_pop(c, 1);
2048 /* Raise that exception! */
2049 com_addopnamestr(c, LOAD_GLOBAL, "AssertionError");
2050 com_push(c, 1);
2051 i = NCH(n)/2; /* Either 2 or 4 */
2052 if (i > 1)
2053 com_node(c, CHILD(n, 3));
2054 com_addoparg(c, RAISE_VARARGS, i);
2055 com_pop(c, i);
2056 /* The interpreter does not fall through */
2057 /* All jumps converge here */
2058 com_backpatch(c, a);
2059 com_backpatch(c, b);
2060 com_addbyte(c, POP_TOP);
2061}
2062
2063static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002064com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002065{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002066 int i = 1;
2067 node* stream = NULL;
2068
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002069 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002070
2071 /* are we using the extended print form? */
2072 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2073 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002074 com_node(c, stream);
2075 /* stack: [...] => [... stream] */
2076 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002077 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2078 i = 4;
2079 else
2080 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002081 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002082 for (; i < NCH(n); i += 2) {
2083 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002084 com_addbyte(c, DUP_TOP);
2085 /* stack: [stream] => [stream stream] */
2086 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002087 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002088 /* stack: [stream stream] => [stream stream obj] */
2089 com_addbyte(c, ROT_TWO);
2090 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002091 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002092 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002093 com_pop(c, 2);
2094 }
2095 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002096 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002097 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002098 com_addbyte(c, PRINT_ITEM);
2099 com_pop(c, 1);
2100 }
2101 }
2102 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002103 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002104 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002105 /* must pop the extra stream object off the stack */
2106 com_addbyte(c, POP_TOP);
2107 /* stack: [... stream] => [...] */
2108 com_pop(c, 1);
2109 }
2110 }
2111 else {
2112 if (stream != NULL) {
2113 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002114 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002115 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002116 com_pop(c, 1);
2117 }
2118 else
2119 com_addbyte(c, PRINT_NEWLINE);
2120 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002121}
2122
2123static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002124com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002125{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002126 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002127 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002128 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002129 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002130 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002131 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002132 com_push(c, 1);
2133 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002134 else
2135 com_node(c, CHILD(n, 1));
2136 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002137 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002138}
2139
2140static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002141com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002142{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002143 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002144 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2145 if (NCH(n) > 1) {
2146 com_node(c, CHILD(n, 1));
2147 if (NCH(n) > 3) {
2148 com_node(c, CHILD(n, 3));
2149 if (NCH(n) > 5)
2150 com_node(c, CHILD(n, 5));
2151 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002152 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002153 i = NCH(n)/2;
2154 com_addoparg(c, RAISE_VARARGS, i);
2155 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002156}
2157
2158static void
Thomas Wouters52152252000-08-17 22:55:00 +00002159com_from_import(struct compiling *c, node *n)
2160{
2161 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2162 com_push(c, 1);
2163 if (NCH(n) > 1) {
2164 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2165 com_error(c, PyExc_SyntaxError, "invalid syntax");
2166 return;
2167 }
2168 com_addopname(c, STORE_NAME, CHILD(n, 2));
2169 } else
2170 com_addopname(c, STORE_NAME, CHILD(n, 0));
2171 com_pop(c, 1);
2172}
2173
2174static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002175com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002176{
2177 int i;
2178 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002179 /* 'import' dotted_name (',' dotted_name)* |
2180 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002181 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002182 /* 'from' dotted_name 'import' ... */
2183 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002184 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002185 com_push(c, 1);
Thomas Wouters52152252000-08-17 22:55:00 +00002186 if (TYPE(CHILD(n, 3)) == STAR)
2187 com_addbyte(c, IMPORT_STAR);
2188 else {
2189 for (i = 3; i < NCH(n); i += 2)
2190 com_from_import(c, CHILD(n, i));
2191 com_addbyte(c, POP_TOP);
2192 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002193 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002194 }
2195 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002196 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002197 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002198 node *subn = CHILD(n, i);
2199 REQ(subn, dotted_as_name);
2200 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002201 com_push(c, 1);
Thomas Wouters52152252000-08-17 22:55:00 +00002202 if (NCH(subn) > 1) {
Thomas Wouters8bad6122000-08-19 20:55:02 +00002203 if (strcmp(STR(CHILD(subn, 1)), "as") != 0 ||
2204 NCH(CHILD(subn, 0)) > 1) {
Thomas Wouters52152252000-08-17 22:55:00 +00002205 com_error(c, PyExc_SyntaxError,
2206 "invalid syntax");
2207 return;
2208 }
2209 com_addopname(c, STORE_NAME, CHILD(subn, 2));
2210 } else
2211 com_addopname(c, STORE_NAME,
2212 CHILD(CHILD(subn, 0),0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002213 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002214 }
2215 }
2216}
2217
2218static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002219com_global_stmt(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002220{
2221 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002222 REQ(n, global_stmt);
2223 /* 'global' NAME (',' NAME)* */
2224 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002225 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002226#ifdef PRIVATE_NAME_MANGLING
2227 char buffer[256];
2228 if (s != NULL && s[0] == '_' && s[1] == '_' &&
2229 c->c_private != NULL &&
Guido van Rossum582acec2000-06-28 22:07:35 +00002230 com_mangle(c, s, buffer, sizeof(buffer)))
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002231 s = buffer;
2232#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +00002233 if (PyDict_GetItemString(c->c_locals, s) != NULL) {
2234 com_error(c, PyExc_SyntaxError,
2235 "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002236 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002237 else if (PyDict_SetItemString(c->c_globals, s, Py_None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002238 c->c_errors++;
2239 }
2240}
2241
Guido van Rossum681d79a1995-07-18 14:51:37 +00002242static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002243com_newlocal_o(struct compiling *c, PyObject *nameval)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002244{
2245 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002246 PyObject *ival;
2247 if (PyList_Size(c->c_varnames) != c->c_nlocals) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002248 /* This is usually caused by an error on a previous call */
2249 if (c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002250 com_error(c, PyExc_SystemError,
2251 "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002252 }
2253 return 0;
2254 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002255 ival = PyInt_FromLong(i = c->c_nlocals++);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002256 if (ival == NULL)
2257 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002258 else if (PyDict_SetItem(c->c_locals, nameval, ival) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002259 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002260 else if (PyList_Append(c->c_varnames, nameval) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002261 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002262 Py_XDECREF(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002263 return i;
2264}
2265
2266static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002267com_addlocal_o(struct compiling *c, PyObject *nameval)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002268{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002269 PyObject *ival = PyDict_GetItem(c->c_locals, nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002270 if (ival != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002271 return PyInt_AsLong(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002272 return com_newlocal_o(c, nameval);
2273}
2274
2275static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002276com_newlocal(struct compiling *c, char *name)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002277{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002278 PyObject *nameval = PyString_InternFromString(name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002279 int i;
2280 if (nameval == NULL) {
2281 c->c_errors++;
2282 return 0;
2283 }
2284 i = com_newlocal_o(c, nameval);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002285 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002286 return i;
2287}
2288
Guido van Rossumc5e96291991-12-10 13:53:51 +00002289static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002290com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002291{
2292 REQ(n, exec_stmt);
2293 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2294 com_node(c, CHILD(n, 1));
2295 if (NCH(n) >= 4)
2296 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002297 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002298 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002299 com_push(c, 1);
2300 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002301 if (NCH(n) >= 6)
2302 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002303 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002304 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002305 com_push(c, 1);
2306 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002307 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002308 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002309}
2310
Guido van Rossum7c531111997-03-11 18:42:21 +00002311static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002312is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002313{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002314 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002315 int i;
2316
2317 /* Label to avoid tail recursion */
2318 next:
2319 switch (TYPE(n)) {
2320
2321 case suite:
2322 if (NCH(n) == 1) {
2323 n = CHILD(n, 0);
2324 goto next;
2325 }
2326 /* Fall through */
2327 case file_input:
2328 for (i = 0; i < NCH(n); i++) {
2329 node *ch = CHILD(n, i);
2330 if (TYPE(ch) == stmt) {
2331 n = ch;
2332 goto next;
2333 }
2334 }
2335 break;
2336
2337 case stmt:
2338 case simple_stmt:
2339 case small_stmt:
2340 n = CHILD(n, 0);
2341 goto next;
2342
2343 case expr_stmt:
2344 case testlist:
2345 case test:
2346 case and_test:
2347 case not_test:
2348 case comparison:
2349 case expr:
2350 case xor_expr:
2351 case and_expr:
2352 case shift_expr:
2353 case arith_expr:
2354 case term:
2355 case factor:
2356 case power:
2357 case atom:
2358 if (NCH(n) == 1) {
2359 n = CHILD(n, 0);
2360 goto next;
2361 }
2362 break;
2363
2364 case NAME:
2365 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2366 return 1;
2367 break;
2368
2369 case NUMBER:
2370 v = parsenumber(c, STR(n));
2371 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002372 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002373 break;
2374 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002375 i = PyObject_IsTrue(v);
2376 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002377 return i == 0;
2378
2379 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002380 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002381 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002382 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002383 break;
2384 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002385 i = PyObject_IsTrue(v);
2386 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002387 return i == 0;
2388
2389 }
2390 return 0;
2391}
2392
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002393static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002394com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002395{
2396 int i;
2397 int anchor = 0;
2398 REQ(n, if_stmt);
2399 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2400 for (i = 0; i+3 < NCH(n); i+=4) {
2401 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002402 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002403 if (is_constant_false(c, ch))
2404 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002405 if (i > 0)
2406 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002407 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002408 com_addfwref(c, JUMP_IF_FALSE, &a);
2409 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002410 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002411 com_node(c, CHILD(n, i+3));
2412 com_addfwref(c, JUMP_FORWARD, &anchor);
2413 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002414 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002415 com_addbyte(c, POP_TOP);
2416 }
2417 if (i+2 < NCH(n))
2418 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002419 if (anchor)
2420 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002421}
2422
2423static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002424com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002425{
2426 int break_anchor = 0;
2427 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002428 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002429 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2430 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002431 block_push(c, SETUP_LOOP);
2432 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002433 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002434 com_node(c, CHILD(n, 1));
2435 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2436 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002437 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002438 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002439 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002440 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002441 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2442 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002443 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002444 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002445 com_addbyte(c, POP_TOP);
2446 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002447 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002448 if (NCH(n) > 4)
2449 com_node(c, CHILD(n, 6));
2450 com_backpatch(c, break_anchor);
2451}
2452
2453static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002454com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002455{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002456 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002457 int break_anchor = 0;
2458 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002459 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002460 REQ(n, for_stmt);
2461 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2462 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002463 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002464 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002465 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002466 if (v == NULL)
2467 c->c_errors++;
2468 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002469 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002470 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002471 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002472 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002473 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002474 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002475 com_assign(c, CHILD(n, 1), OP_ASSIGN);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002476 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002477 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002478 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002479 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2480 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002481 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002482 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002483 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002484 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002485 if (NCH(n) > 8)
2486 com_node(c, CHILD(n, 8));
2487 com_backpatch(c, break_anchor);
2488}
2489
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002490/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002491
2492 SETUP_FINALLY L
2493 <code for S>
2494 POP_BLOCK
2495 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002496 L: <code for Sf>
2497 END_FINALLY
2498
2499 The special instructions use the block stack. Each block
2500 stack entry contains the instruction that created it (here
2501 SETUP_FINALLY), the level of the value stack at the time the
2502 block stack entry was created, and a label (here L).
2503
2504 SETUP_FINALLY:
2505 Pushes the current value stack level and the label
2506 onto the block stack.
2507 POP_BLOCK:
2508 Pops en entry from the block stack, and pops the value
2509 stack until its level is the same as indicated on the
2510 block stack. (The label is ignored.)
2511 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002512 Pops a variable number of entries from the *value* stack
2513 and re-raises the exception they specify. The number of
2514 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002515
2516 The block stack is unwound when an exception is raised:
2517 when a SETUP_FINALLY entry is found, the exception is pushed
2518 onto the value stack (and the exception condition is cleared),
2519 and the interpreter jumps to the label gotten from the block
2520 stack.
2521
2522 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002523 (The contents of the value stack is shown in [], with the top
2524 at the right; 'tb' is trace-back info, 'val' the exception's
2525 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002526
2527 Value stack Label Instruction Argument
2528 [] SETUP_EXCEPT L1
2529 [] <code for S>
2530 [] POP_BLOCK
2531 [] JUMP_FORWARD L0
2532
Guido van Rossum3f5da241990-12-20 15:06:42 +00002533 [tb, val, exc] L1: DUP )
2534 [tb, val, exc, exc] <evaluate E1> )
2535 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2536 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2537 [tb, val, exc, 1] POP )
2538 [tb, val, exc] POP
2539 [tb, val] <assign to V1> (or POP if no V1)
2540 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002541 [] <code for S1>
2542 JUMP_FORWARD L0
2543
Guido van Rossum3f5da241990-12-20 15:06:42 +00002544 [tb, val, exc, 0] L2: POP
2545 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002546 .............................etc.......................
2547
Guido van Rossum3f5da241990-12-20 15:06:42 +00002548 [tb, val, exc, 0] Ln+1: POP
2549 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002550
2551 [] L0: <next statement>
2552
2553 Of course, parts are not generated if Vi or Ei is not present.
2554*/
2555
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002556static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002557com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002558{
2559 int except_anchor = 0;
2560 int end_anchor = 0;
2561 int else_anchor = 0;
2562 int i;
2563 node *ch;
2564
2565 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2566 block_push(c, SETUP_EXCEPT);
2567 com_node(c, CHILD(n, 2));
2568 com_addbyte(c, POP_BLOCK);
2569 block_pop(c, SETUP_EXCEPT);
2570 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2571 com_backpatch(c, except_anchor);
2572 for (i = 3;
2573 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2574 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002575 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002576 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002577 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002578 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002579 break;
2580 }
2581 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002582 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002583 com_addoparg(c, SET_LINENO, ch->n_lineno);
2584 if (NCH(ch) > 1) {
2585 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002586 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002587 com_node(c, CHILD(ch, 1));
2588 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002589 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002590 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2591 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002592 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002593 }
2594 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002595 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002596 if (NCH(ch) > 3)
Guido van Rossum8861b741996-07-30 16:49:37 +00002597 com_assign(c, CHILD(ch, 3), OP_ASSIGN);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002598 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002599 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002600 com_pop(c, 1);
2601 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002602 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002603 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002604 com_node(c, CHILD(n, i+2));
2605 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2606 if (except_anchor) {
2607 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002608 /* We come in with [tb, val, exc, 0] on the
2609 stack; one pop and it's the same as
2610 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002611 com_addbyte(c, POP_TOP);
2612 }
2613 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002614 /* We actually come in here with [tb, val, exc] but the
2615 END_FINALLY will zap those and jump around.
2616 The c_stacklevel does not reflect them so we need not pop
2617 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002618 com_addbyte(c, END_FINALLY);
2619 com_backpatch(c, else_anchor);
2620 if (i < NCH(n))
2621 com_node(c, CHILD(n, i+2));
2622 com_backpatch(c, end_anchor);
2623}
2624
2625static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002626com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002627{
2628 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002629 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002630
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002631 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2632 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002633 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002634 com_addbyte(c, POP_BLOCK);
2635 block_pop(c, SETUP_FINALLY);
2636 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002637 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002638 /* While the generated code pushes only one item,
2639 the try-finally handling can enter here with
2640 up to three items. OK, here are the details:
2641 3 for an exception, 2 for RETURN, 1 for BREAK. */
2642 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002643 com_backpatch(c, finally_anchor);
2644 ch = CHILD(n, NCH(n)-1);
2645 com_addoparg(c, SET_LINENO, ch->n_lineno);
2646 com_node(c, ch);
2647 com_addbyte(c, END_FINALLY);
2648 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002649 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002650}
2651
2652static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002653com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002654{
2655 REQ(n, try_stmt);
2656 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2657 | 'try' ':' suite 'finally' ':' suite */
2658 if (TYPE(CHILD(n, 3)) != except_clause)
2659 com_try_finally(c, n);
2660 else
2661 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002662}
2663
Guido van Rossum8b993a91997-01-17 21:04:03 +00002664static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002665get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002666{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002667 int i;
2668
Guido van Rossum8b993a91997-01-17 21:04:03 +00002669 /* Label to avoid tail recursion */
2670 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002671 switch (TYPE(n)) {
2672
2673 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002674 if (NCH(n) == 1) {
2675 n = CHILD(n, 0);
2676 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002677 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002678 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002679 case file_input:
2680 for (i = 0; i < NCH(n); i++) {
2681 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002682 if (TYPE(ch) == stmt) {
2683 n = ch;
2684 goto next;
2685 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002686 }
2687 break;
2688
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002689 case stmt:
2690 case simple_stmt:
2691 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002692 n = CHILD(n, 0);
2693 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002694
2695 case expr_stmt:
2696 case testlist:
2697 case test:
2698 case and_test:
2699 case not_test:
2700 case comparison:
2701 case expr:
2702 case xor_expr:
2703 case and_expr:
2704 case shift_expr:
2705 case arith_expr:
2706 case term:
2707 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002708 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002709 if (NCH(n) == 1) {
2710 n = CHILD(n, 0);
2711 goto next;
2712 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002713 break;
2714
2715 case atom:
2716 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002717 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002718 break;
2719
2720 }
2721 return NULL;
2722}
2723
Guido van Rossum79f25d91997-04-29 20:08:16 +00002724static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002725get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002726{
Guido van Rossum541563e1999-01-28 15:08:09 +00002727 /* Don't generate doc-strings if run with -OO */
2728 if (Py_OptimizeFlag > 1)
2729 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002730 n = get_rawdocstring(n);
2731 if (n == NULL)
2732 return NULL;
2733 return parsestrplus(n);
2734}
2735
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002736static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002737com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002738{
2739 REQ(n, suite);
2740 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2741 if (NCH(n) == 1) {
2742 com_node(c, CHILD(n, 0));
2743 }
2744 else {
2745 int i;
2746 for (i = 0; i < NCH(n); i++) {
2747 node *ch = CHILD(n, i);
2748 if (TYPE(ch) == stmt)
2749 com_node(c, ch);
2750 }
2751 }
2752}
2753
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002754/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002755static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002756com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002757{
2758 int i = c->c_nblocks;
2759 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2760 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2761 }
2762 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002763 com_error(c, PyExc_SyntaxError,
2764 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002765 }
2766 /* XXX Could allow it inside a 'finally' clause
2767 XXX if we could pop the exception still on the stack */
2768}
2769
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002770static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002771com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002772{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002773 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002774 if (TYPE(n) == lambdef) {
2775 /* lambdef: 'lambda' [varargslist] ':' test */
2776 n = CHILD(n, 1);
2777 }
2778 else {
2779 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2780 n = CHILD(n, 2);
2781 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2782 n = CHILD(n, 1);
2783 }
2784 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002785 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002786 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002787 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002788 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2789 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002790 nargs = 0;
2791 ndefs = 0;
2792 for (i = 0; i < nch; i++) {
2793 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002794 if (TYPE(CHILD(n, i)) == STAR ||
2795 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002796 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002797 nargs++;
2798 i++;
2799 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002800 t = RPAR; /* Anything except EQUAL or COMMA */
2801 else
2802 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002803 if (t == EQUAL) {
2804 i++;
2805 ndefs++;
2806 com_node(c, CHILD(n, i));
2807 i++;
2808 if (i >= nch)
2809 break;
2810 t = TYPE(CHILD(n, i));
2811 }
2812 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00002813 /* Treat "(a=1, b)" as an error */
2814 if (ndefs)
2815 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00002816 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002817 }
2818 if (t != COMMA)
2819 break;
2820 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002821 return ndefs;
2822}
2823
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002824static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002825com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002826{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002827 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002828 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002829 v = (PyObject *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002830 if (v == NULL)
2831 c->c_errors++;
2832 else {
2833 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002834 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002835 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002836 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002837 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002838 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002839 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002840 com_pop(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002841 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002842 }
2843}
2844
2845static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002846com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002847{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002848 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002849 REQ(n, testlist);
2850 /* testlist: test (',' test)* [','] */
2851 for (i = 0; i < NCH(n); i += 2)
2852 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002853 i = (NCH(n)+1) / 2;
2854 com_addoparg(c, BUILD_TUPLE, i);
2855 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00002856}
2857
2858static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002859com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002860{
Guido van Rossum25831651993-05-19 14:50:45 +00002861 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002862 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002863 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002864 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00002865 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00002866 c->c_errors++;
2867 return;
2868 }
2869 /* Push the class name on the stack */
2870 i = com_addconst(c, v);
2871 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002872 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002873 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00002874 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002875 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00002876 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002877 com_push(c, 1);
2878 }
Guido van Rossum25831651993-05-19 14:50:45 +00002879 else
2880 com_bases(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002881 v = (PyObject *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002882 if (v == NULL)
2883 c->c_errors++;
2884 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002885 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002886 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002887 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002888 com_addoparg(c, MAKE_FUNCTION, 0);
2889 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002890 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002891 com_pop(c, 2);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002892 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002893 Py_DECREF(v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002894 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002895}
2896
2897static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002898com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002899{
2900 switch (TYPE(n)) {
2901
2902 /* Definition nodes */
2903
2904 case funcdef:
2905 com_funcdef(c, n);
2906 break;
2907 case classdef:
2908 com_classdef(c, n);
2909 break;
2910
2911 /* Trivial parse tree nodes */
2912
2913 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002914 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002915 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002916 com_node(c, CHILD(n, 0));
2917 break;
2918
2919 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002920 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2921 com_addoparg(c, SET_LINENO, n->n_lineno);
2922 {
2923 int i;
2924 for (i = 0; i < NCH(n)-1; i += 2)
2925 com_node(c, CHILD(n, i));
2926 }
2927 break;
2928
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002929 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002930 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002931 com_node(c, CHILD(n, 0));
2932 break;
2933
2934 /* Statement nodes */
2935
2936 case expr_stmt:
2937 com_expr_stmt(c, n);
2938 break;
2939 case print_stmt:
2940 com_print_stmt(c, n);
2941 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002942 case del_stmt: /* 'del' exprlist */
Guido van Rossum8861b741996-07-30 16:49:37 +00002943 com_assign(c, CHILD(n, 1), OP_DELETE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002944 break;
2945 case pass_stmt:
2946 break;
2947 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002948 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002949 com_error(c, PyExc_SyntaxError,
2950 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002951 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002952 com_addbyte(c, BREAK_LOOP);
2953 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002954 case continue_stmt:
2955 com_continue_stmt(c, n);
2956 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002957 case return_stmt:
2958 com_return_stmt(c, n);
2959 break;
2960 case raise_stmt:
2961 com_raise_stmt(c, n);
2962 break;
2963 case import_stmt:
2964 com_import_stmt(c, n);
2965 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002966 case global_stmt:
2967 com_global_stmt(c, n);
2968 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002969 case exec_stmt:
2970 com_exec_stmt(c, n);
2971 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002972 case assert_stmt:
2973 com_assert_stmt(c, n);
2974 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002975 case if_stmt:
2976 com_if_stmt(c, n);
2977 break;
2978 case while_stmt:
2979 com_while_stmt(c, n);
2980 break;
2981 case for_stmt:
2982 com_for_stmt(c, n);
2983 break;
2984 case try_stmt:
2985 com_try_stmt(c, n);
2986 break;
2987 case suite:
2988 com_suite(c, n);
2989 break;
2990
2991 /* Expression nodes */
2992
2993 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002994 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002995 break;
2996 case test:
2997 com_test(c, n);
2998 break;
2999 case and_test:
3000 com_and_test(c, n);
3001 break;
3002 case not_test:
3003 com_not_test(c, n);
3004 break;
3005 case comparison:
3006 com_comparison(c, n);
3007 break;
3008 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003009 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003010 break;
3011 case expr:
3012 com_expr(c, n);
3013 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003014 case xor_expr:
3015 com_xor_expr(c, n);
3016 break;
3017 case and_expr:
3018 com_and_expr(c, n);
3019 break;
3020 case shift_expr:
3021 com_shift_expr(c, n);
3022 break;
3023 case arith_expr:
3024 com_arith_expr(c, n);
3025 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003026 case term:
3027 com_term(c, n);
3028 break;
3029 case factor:
3030 com_factor(c, n);
3031 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003032 case power:
3033 com_power(c, n);
3034 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003035 case atom:
3036 com_atom(c, n);
3037 break;
3038
3039 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003040 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003041 com_error(c, PyExc_SystemError,
3042 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003043 }
3044}
3045
Tim Petersdbd9ba62000-07-09 03:09:57 +00003046static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003047
3048static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003049com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003050{
3051 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3052 if (TYPE(CHILD(n, 0)) == LPAR)
3053 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003054 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003055 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003056 com_pop(c, 1);
3057 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003058}
3059
3060static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003061com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003062{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003063 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003064 if (NCH(n) == 1) {
3065 com_fpdef(c, CHILD(n, 0));
3066 }
3067 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003068 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003069 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003070 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003071 for (i = 0; i < NCH(n); i += 2)
3072 com_fpdef(c, CHILD(n, i));
3073 }
3074}
3075
3076static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003077com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003078{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003079 int nch, i;
3080 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003081 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003082 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003083 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003084 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003085 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003086 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003087 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003088 node *ch = CHILD(n, i);
3089 node *fp;
3090 char *name;
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003091 PyObject *nameval;
Guido van Rossum50564e81996-01-12 01:13:16 +00003092 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003093 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003094 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3095 fp = CHILD(ch, 0);
3096 if (TYPE(fp) == NAME)
3097 name = STR(fp);
3098 else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003099 name = nbuf;
3100 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003101 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003102 }
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003103 nameval = PyString_InternFromString(name);
3104 if (nameval == NULL) {
3105 c->c_errors++;
3106 }
Peter Schneider-Kamp9a5086c2000-07-13 06:24:29 +00003107 if (PyDict_GetItem(c->c_locals, nameval)) {
Fred Drakedcf08e02000-08-15 15:49:44 +00003108 com_error(c, PyExc_SyntaxError,
3109 "duplicate argument in function definition");
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003110 }
3111 com_newlocal_o(c, nameval);
3112 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003113 c->c_argcount++;
3114 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003115 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003116 ch = CHILD(n, i);
3117 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003118 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003119 else
3120 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003121 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003122 /* Handle *arguments */
3123 if (i < nch) {
3124 node *ch;
3125 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003126 if (TYPE(ch) != DOUBLESTAR) {
3127 REQ(ch, STAR);
3128 ch = CHILD(n, i+1);
3129 if (TYPE(ch) == NAME) {
3130 c->c_flags |= CO_VARARGS;
3131 i += 3;
3132 com_newlocal(c, STR(ch));
3133 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003134 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003135 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003136 /* Handle **keywords */
3137 if (i < nch) {
3138 node *ch;
3139 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003140 if (TYPE(ch) != DOUBLESTAR) {
3141 REQ(ch, STAR);
3142 ch = CHILD(n, i+1);
3143 REQ(ch, STAR);
3144 ch = CHILD(n, i+2);
3145 }
3146 else
3147 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003148 REQ(ch, NAME);
3149 c->c_flags |= CO_VARKEYWORDS;
3150 com_newlocal(c, STR(ch));
3151 }
3152 if (complex) {
3153 /* Generate code for complex arguments only after
3154 having counted the simple arguments */
3155 int ilocal = 0;
3156 for (i = 0; i < nch; i++) {
3157 node *ch = CHILD(n, i);
3158 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003159 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003160 break;
3161 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3162 fp = CHILD(ch, 0);
3163 if (TYPE(fp) != NAME) {
3164 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003165 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003166 com_fpdef(c, ch);
3167 }
3168 ilocal++;
3169 if (++i >= nch)
3170 break;
3171 ch = CHILD(n, i);
3172 if (TYPE(ch) == EQUAL)
3173 i += 2;
3174 else
3175 REQ(ch, COMMA);
3176 }
3177 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003178}
3179
3180static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003181com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003182{
3183 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003184 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003185 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003186 doc = get_docstring(n);
3187 if (doc != NULL) {
3188 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003189 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003190 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003191 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003192 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003193 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003194 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003195 for (i = 0; i < NCH(n); i++) {
3196 node *ch = CHILD(n, i);
3197 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3198 com_node(c, ch);
3199 }
3200}
3201
3202/* Top-level compile-node interface */
3203
3204static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003205compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003206{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003207 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003208 node *ch;
3209 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003210 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003211 doc = get_docstring(CHILD(n, 4));
3212 if (doc != NULL) {
3213 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003214 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003215 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003216 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003217 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003218 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3219 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003220 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003221 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003222 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003223 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003224 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003225 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003226 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003227 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003228 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003229}
3230
3231static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003232compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003233{
Guido van Rossum590baa41993-11-30 13:40:46 +00003234 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003235 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003236 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003237
3238 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003239 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003240 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003241 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003242 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003243 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003244 else
3245 ch = CHILD(n, 2);
3246 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003247 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003248 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003249}
3250
3251static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003252compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003253{
3254 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003255 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003256 REQ(n, classdef);
3257 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3258 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003259#ifdef PRIVATE_NAME_MANGLING
3260 c->c_private = c->c_name;
3261#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003262 ch = CHILD(n, NCH(n)-1); /* The suite */
3263 doc = get_docstring(ch);
3264 if (doc != NULL) {
3265 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003266 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003267 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003268 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003269 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003270 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003271 }
3272 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003273 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003274 com_node(c, ch);
3275 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003276 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003277 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003278 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003279}
3280
3281static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003282compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003283{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003284 com_addoparg(c, SET_LINENO, n->n_lineno);
3285
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003286 switch (TYPE(n)) {
3287
Guido van Rossum4c417781991-01-21 16:09:22 +00003288 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003289 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003290 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003291 n = CHILD(n, 0);
3292 if (TYPE(n) != NEWLINE)
3293 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003294 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003295 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003296 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003297 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003298 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003299 break;
3300
Guido van Rossum4c417781991-01-21 16:09:22 +00003301 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003302 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003303 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003304 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003305 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003306 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003307 break;
3308
Guido van Rossum590baa41993-11-30 13:40:46 +00003309 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003310 com_node(c, CHILD(n, 0));
3311 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003312 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003313 break;
3314
Guido van Rossum590baa41993-11-30 13:40:46 +00003315 case lambdef: /* anonymous function definition */
3316 compile_lambdef(c, n);
3317 break;
3318
Guido van Rossum4c417781991-01-21 16:09:22 +00003319 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003320 compile_funcdef(c, n);
3321 break;
3322
Guido van Rossum4c417781991-01-21 16:09:22 +00003323 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003324 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003325 break;
3326
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003327 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003328 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003329 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003330 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003331 }
3332}
3333
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003334/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00003335
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003336 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
3337 instructions that refer to local variables with LOAD_FAST etc.
3338 The latter instructions are much faster because they don't need to
3339 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003340
Guido van Rossum681d79a1995-07-18 14:51:37 +00003341 To find all local variables, we check all STORE_NAME, IMPORT_FROM
3342 and DELETE_NAME instructions. This yields all local variables,
3343 function definitions, class definitions and import statements.
3344 Argument names have already been entered into the list by the
3345 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003346
3347 All remaining LOAD_NAME instructions must refer to non-local (global
3348 or builtin) variables, so are replaced by LOAD_GLOBAL.
3349
3350 There are two problems: 'from foo import *' and 'exec' may introduce
3351 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00003352 case, we can still optimize bona fide locals (since those
3353 statements will be surrounded by fast_2_locals() and
3354 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003355
Guido van Rossum681d79a1995-07-18 14:51:37 +00003356 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00003357
3358static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003359optimize(struct compiling *c)
Guido van Rossum282914b1991-04-04 10:42:56 +00003360{
Guido van Rossum0a697f61991-04-16 08:39:12 +00003361 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00003362 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00003363 int oparg = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003364 PyObject *name;
3365 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003366
Guido van Rossum282914b1991-04-04 10:42:56 +00003367#define NEXTOP() (*next_instr++)
3368#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossum79f25d91997-04-29 20:08:16 +00003369#define GETITEM(v, i) (PyList_GetItem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003370#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
3371
Guido van Rossum79f25d91997-04-29 20:08:16 +00003372 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003373
3374 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00003375
Guido van Rossum79f25d91997-04-29 20:08:16 +00003376 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003377 for (;;) {
3378 opcode = NEXTOP();
3379 if (opcode == STOP_CODE)
3380 break;
3381 if (HAS_ARG(opcode))
3382 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +00003383 dispatch_opcode1:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003384 switch (opcode) {
3385 case STORE_NAME:
3386 case DELETE_NAME:
3387 case IMPORT_FROM:
3388 com_addlocal_o(c, GETNAMEOBJ(oparg));
3389 break;
Thomas Wouters52152252000-08-17 22:55:00 +00003390 case IMPORT_STAR:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003391 case EXEC_STMT:
3392 c->c_flags &= ~CO_OPTIMIZED;
3393 break;
Fred Drakeef8ace32000-08-24 00:32:09 +00003394 case EXTENDED_ARG:
3395 opcode = NEXTOP();
3396 oparg = oparg<<16 | NEXTARG();
3397 goto dispatch_opcode1;
3398 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00003399 }
3400 }
3401
Thomas Wouters52152252000-08-17 22:55:00 +00003402 /* TBD: Is this still necessary ? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003403 if (PyDict_GetItemString(c->c_locals, "*") != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003404 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003405
Guido van Rossum79f25d91997-04-29 20:08:16 +00003406 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003407 for (;;) {
3408 cur_instr = next_instr;
3409 opcode = NEXTOP();
3410 if (opcode == STOP_CODE)
3411 break;
3412 if (HAS_ARG(opcode))
3413 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +00003414 dispatch_opcode2:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003415 if (opcode == LOAD_NAME ||
3416 opcode == STORE_NAME ||
3417 opcode == DELETE_NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003418 PyObject *v;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003419 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00003420 name = GETNAMEOBJ(oparg);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003421 v = PyDict_GetItem(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003422 if (v == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003423 if (opcode == LOAD_NAME &&
3424 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003425 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003426 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00003427 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003428 i = PyInt_AsLong(v);
Fred Drakeef8ace32000-08-24 00:32:09 +00003429 if (i >> 16) /* too big for 2 bytes */
3430 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003431 switch (opcode) {
3432 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
3433 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
3434 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
3435 }
3436 cur_instr[1] = i & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +00003437 cur_instr[2] = i >> 8;
3438 }
3439 if (opcode == EXTENDED_ARG) {
3440 opcode = NEXTOP();
3441 oparg = oparg<<16 | NEXTARG();
3442 goto dispatch_opcode2;
Guido van Rossum282914b1991-04-04 10:42:56 +00003443 }
3444 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003445
Guido van Rossum681d79a1995-07-18 14:51:37 +00003446 if (c->c_errors == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00003447 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00003448}
3449
Guido van Rossum79f25d91997-04-29 20:08:16 +00003450PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003451PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003452{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003453 return jcompile(n, filename, NULL);
3454}
3455
Guido van Rossum79f25d91997-04-29 20:08:16 +00003456static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003457icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003458{
3459 return jcompile(n, base->c_filename, base);
3460}
3461
Guido van Rossum79f25d91997-04-29 20:08:16 +00003462static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003463jcompile(node *n, char *filename, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003464{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003465 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003466 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003467 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003468 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003469#ifdef PRIVATE_NAME_MANGLING
3470 if (base)
3471 sc.c_private = base->c_private;
3472 else
3473 sc.c_private = NULL;
3474#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003475 compile_node(&sc, n);
3476 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003477 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003478 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003479 sc.c_flags |= CO_NEWLOCALS;
3480 }
3481 else if (TYPE(n) == classdef)
3482 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00003483 co = NULL;
3484 if (sc.c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003485 PyObject *consts, *names, *varnames, *filename, *name;
3486 consts = PyList_AsTuple(sc.c_consts);
3487 names = PyList_AsTuple(sc.c_names);
3488 varnames = PyList_AsTuple(sc.c_varnames);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003489 filename = PyString_InternFromString(sc.c_filename);
3490 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003491 if (!PyErr_Occurred())
3492 co = PyCode_New(sc.c_argcount,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003493 sc.c_nlocals,
Guido van Rossum8b993a91997-01-17 21:04:03 +00003494 sc.c_maxstacklevel,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003495 sc.c_flags,
3496 sc.c_code,
3497 consts,
3498 names,
3499 varnames,
3500 filename,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003501 name,
3502 sc.c_firstlineno,
3503 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003504 Py_XDECREF(consts);
3505 Py_XDECREF(names);
3506 Py_XDECREF(varnames);
3507 Py_XDECREF(filename);
3508 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003509 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003510 else if (!PyErr_Occurred()) {
3511 /* This could happen if someone called PyErr_Clear() after an
3512 error was reported above. That's not supposed to happen,
3513 but I just plugged one case and I'm not sure there can't be
3514 others. In that case, raise SystemError so that at least
3515 it gets reported instead dumping core. */
3516 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3517 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003518 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003519 return co;
3520}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003521
3522int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003523PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003524{
3525 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003526 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003527 int line = co->co_firstlineno;
3528 int addr = 0;
3529 while (--size >= 0) {
3530 addr += *p++;
3531 if (addr > addrq)
3532 break;
3533 line += *p++;
3534 }
3535 return line;
3536}