blob: 6e4c548dc5cefb7e09588753dfc864e381ad5238 [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
Guido van Rossum282914b1991-04-04 10:42:56 +000039
Guido van Rossumb05a5c71997-05-07 17:46:13 +000040/* Three symbols from graminit.h are also defined in Python.h, with
41 Py_ prefixes to their names. Python.h can't include graminit.h
42 (which defines too many confusing symbols), but we can check here
43 that they haven't changed (which is very unlikely, but possible). */
44#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000045 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000046#endif
47#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000048 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000049#endif
50#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000051 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000052#endif
53
Guido van Rossum8e793d91997-03-03 19:13:14 +000054int Py_OptimizeFlag = 0;
55
Guido van Rossum8861b741996-07-30 16:49:37 +000056#define OP_DELETE 0
57#define OP_ASSIGN 1
58#define OP_APPLY 2
59
Guido van Rossum79f25d91997-04-29 20:08:16 +000060#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000061
62static struct memberlist code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000063 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
64 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000065 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000066 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000067 {"co_code", T_OBJECT, OFF(co_code), READONLY},
68 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
69 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000070 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000071 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000072 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000073 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
74 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000075 {NULL} /* Sentinel */
76};
77
Guido van Rossum79f25d91997-04-29 20:08:16 +000078static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000079code_getattr(PyCodeObject *co, char *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +000080{
Guido van Rossum79f25d91997-04-29 20:08:16 +000081 return PyMember_Get((char *)co, code_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +000082}
Guido van Rossum10dc2e81990-11-18 17:27:39 +000083
84static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000085code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +000086{
Guido van Rossum79f25d91997-04-29 20:08:16 +000087 Py_XDECREF(co->co_code);
88 Py_XDECREF(co->co_consts);
89 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +000090 Py_XDECREF(co->co_varnames);
Guido van Rossum79f25d91997-04-29 20:08:16 +000091 Py_XDECREF(co->co_filename);
92 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +000093 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +000094 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +000095}
96
Guido van Rossum79f25d91997-04-29 20:08:16 +000097static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000098code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +000099{
100 char buf[500];
101 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000102 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000103 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000104
Guido van Rossuma396a882000-04-07 01:21:36 +0000105 if (co->co_firstlineno != 0)
106 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000107 if (co->co_filename && PyString_Check(co->co_filename))
108 filename = PyString_AsString(co->co_filename);
109 if (co->co_name && PyString_Check(co->co_name))
110 name = PyString_AsString(co->co_name);
Fred Drake615ae552000-06-30 16:20:13 +0000111 sprintf(buf, "<code object %.100s at %p, file \"%.300s\", line %d>",
112 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000113 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000114}
115
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000116static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000117code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000118{
119 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000120 cmp = PyObject_Compare(co->co_name, cp->co_name);
121 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000122 cmp = co->co_argcount - cp->co_argcount;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000123 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000124 cmp = co->co_nlocals - cp->co_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000125 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000126 cmp = co->co_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000127 if (cmp) return cmp;
Guido van Rossumd076c731998-10-07 19:42:25 +0000128 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000129 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000130 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000131 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000132 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000133 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000134 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000135 return cmp;
136}
137
138static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000139code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000140{
Guido van Rossum44679592000-04-10 16:20:31 +0000141 long h, h0, h1, h2, h3, h4;
142 h0 = PyObject_Hash(co->co_name);
143 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000144 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000145 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000146 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000147 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000148 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000149 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000150 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000151 if (h4 == -1) return -1;
Guido van Rossum44679592000-04-10 16:20:31 +0000152 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000153 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000154 if (h == -1) h = -2;
155 return h;
156}
157
Guido van Rossum79f25d91997-04-29 20:08:16 +0000158PyTypeObject PyCode_Type = {
159 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000160 0,
161 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000162 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000163 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000164 (destructor)code_dealloc, /*tp_dealloc*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000165 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000166 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000167 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000168 (cmpfunc)code_compare, /*tp_compare*/
169 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000170 0, /*tp_as_number*/
171 0, /*tp_as_sequence*/
172 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000173 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000174};
175
Guido van Rossum644a12b1997-04-09 19:24:53 +0000176#define NAME_CHARS \
177 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
178
Guido van Rossum79f25d91997-04-29 20:08:16 +0000179PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000180PyCode_New(int argcount, int nlocals, int stacksize, int flags,
181 PyObject *code, PyObject *consts, PyObject *names,
182 PyObject *varnames, PyObject *filename, PyObject *name,
183 int firstlineno, PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000184{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000185 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000186 int i;
Guido van Rossumd076c731998-10-07 19:42:25 +0000187 PyBufferProcs *pb;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000188 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000189 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000190 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000191 consts == NULL || !PyTuple_Check(consts) ||
192 names == NULL || !PyTuple_Check(names) ||
193 varnames == NULL || !PyTuple_Check(varnames) ||
194 name == NULL || !PyString_Check(name) ||
195 filename == NULL || !PyString_Check(filename) ||
196 lnotab == NULL || !PyString_Check(lnotab)) {
197 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000198 return NULL;
199 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000200 pb = code->ob_type->tp_as_buffer;
201 if (pb == NULL ||
202 pb->bf_getreadbuffer == NULL ||
203 pb->bf_getsegcount == NULL ||
204 (*pb->bf_getsegcount)(code, NULL) != 1)
205 {
206 PyErr_BadInternalCall();
207 return NULL;
208 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000209 /* Make sure names and varnames are all strings, & intern them */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000210 for (i = PyTuple_Size(names); --i >= 0; ) {
211 PyObject *v = PyTuple_GetItem(names, i);
212 if (v == NULL || !PyString_Check(v)) {
213 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000214 return NULL;
215 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000216 PyString_InternInPlace(&PyTuple_GET_ITEM(names, i));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000217 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000218 for (i = PyTuple_Size(varnames); --i >= 0; ) {
219 PyObject *v = PyTuple_GetItem(varnames, i);
220 if (v == NULL || !PyString_Check(v)) {
221 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000222 return NULL;
223 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000224 PyString_InternInPlace(&PyTuple_GET_ITEM(varnames, i));
225 }
226 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000227 for (i = PyTuple_Size(consts); --i >= 0; ) {
228 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000229 char *p;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000230 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000231 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000232 p = PyString_AsString(v);
Guido van Rossum582acec2000-06-28 22:07:35 +0000233 if (strspn(p, NAME_CHARS)
234 != (size_t)PyString_Size(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000235 continue;
236 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000237 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000238 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000239 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000240 co->co_argcount = argcount;
241 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000242 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000243 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000245 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000246 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000247 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000248 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000249 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000250 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000251 co->co_varnames = varnames;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000252 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000253 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000254 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000255 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000256 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000257 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000258 co->co_lnotab = lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000259 }
260 return co;
261}
262
263
264/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000265
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000266struct compiling {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000267 PyObject *c_code; /* string */
268 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000269 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000270 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000271 PyObject *c_name_dict; /* inverse of c_names */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000272 PyObject *c_globals; /* dictionary (value=None) */
273 PyObject *c_locals; /* dictionary (value=localID) */
274 PyObject *c_varnames; /* list (inverse of c_locals) */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000275 int c_nlocals; /* index of next local */
276 int c_argcount; /* number of top-level arguments */
277 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000278 int c_nexti; /* index into c_code */
279 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000280 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000281 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000282 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000283 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000284 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000285 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000286 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000287 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000288 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000289 int c_stacklevel; /* Current stack level */
290 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000291 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000292 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000293 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000294#ifdef PRIVATE_NAME_MANGLING
295 char *c_private; /* for private name mangling */
296#endif
Skip Montanaro803d6e52000-08-12 18:09:51 +0000297 int c_tmpname; /* temporary local name counter */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000298};
299
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000300
Guido van Rossum452a9831996-09-17 14:32:04 +0000301/* Error message including line number */
302
303static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000304com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000305{
Guido van Rossum582acec2000-06-28 22:07:35 +0000306 size_t n = strlen(msg);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000307 PyObject *v;
Guido van Rossum452a9831996-09-17 14:32:04 +0000308 char buffer[30];
309 char *s;
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 }
316 sprintf(buffer, " (line %d)", c->c_lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000317 v = PyString_FromStringAndSize((char *)NULL, n + strlen(buffer));
Guido van Rossum452a9831996-09-17 14:32:04 +0000318 if (v == NULL)
319 return; /* MemoryError, too bad */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000320 s = PyString_AS_STRING((PyStringObject *)v);
Guido van Rossum452a9831996-09-17 14:32:04 +0000321 strcpy(s, msg);
322 strcat(s, buffer);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000323 PyErr_SetObject(exc, v);
324 Py_DECREF(v);
Guido van Rossum452a9831996-09-17 14:32:04 +0000325}
326
327
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000328/* Interface to the block stack */
329
330static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000331block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000332{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000333 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000334 com_error(c, PyExc_SystemError,
335 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000336 }
337 else {
338 c->c_block[c->c_nblocks++] = type;
339 }
340}
341
342static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000343block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000344{
345 if (c->c_nblocks > 0)
346 c->c_nblocks--;
347 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000348 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000349 }
350}
351
352
Guido van Rossum681d79a1995-07-18 14:51:37 +0000353/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000354
Tim Petersdbd9ba62000-07-09 03:09:57 +0000355static int com_init(struct compiling *, char *);
356static void com_free(struct compiling *);
357static void com_push(struct compiling *, int);
358static void com_pop(struct compiling *, int);
359static void com_done(struct compiling *);
360static void com_node(struct compiling *, struct _node *);
361static void com_factor(struct compiling *, struct _node *);
362static void com_addbyte(struct compiling *, int);
363static void com_addint(struct compiling *, int);
364static void com_addoparg(struct compiling *, int, int);
365static void com_addfwref(struct compiling *, int, int *);
366static void com_backpatch(struct compiling *, int);
367static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
368static int com_addconst(struct compiling *, PyObject *);
369static int com_addname(struct compiling *, PyObject *);
370static void com_addopname(struct compiling *, int, node *);
371static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000372static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000373static int com_argdefs(struct compiling *, node *);
374static int com_newlocal(struct compiling *, char *);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000375static void com_assign(struct compiling *, node *, int);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000376static PyCodeObject *icompile(struct _node *, struct compiling *);
377static PyCodeObject *jcompile(struct _node *, char *,
378 struct compiling *);
379static PyObject *parsestrplus(node *);
380static PyObject *parsestr(char *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000381
382static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000383com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000384{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000385 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000386 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
387 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000388 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000389 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000390 goto fail;
391 if ((c->c_const_dict = PyDict_New()) == NULL)
392 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000393 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000394 goto fail;
395 if ((c->c_name_dict = PyDict_New()) == NULL)
396 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000397 if ((c->c_globals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000398 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000399 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000400 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000401 if ((c->c_varnames = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000402 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000403 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
404 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000405 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000406 c->c_nlocals = 0;
407 c->c_argcount = 0;
408 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000409 c->c_nexti = 0;
410 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000411 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000412 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000413 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000414 c->c_begin = 0;
415 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000416 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000417 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000418 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000419 c->c_stacklevel = 0;
420 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000421 c->c_firstlineno = 0;
422 c->c_last_addr = 0;
423 c->c_last_line = 0;
424 c-> c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000425 c->c_tmpname = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000426 return 1;
427
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000428 fail:
429 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000430 return 0;
431}
432
433static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000434com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000435{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000436 Py_XDECREF(c->c_code);
437 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000438 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000439 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000440 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000441 Py_XDECREF(c->c_globals);
442 Py_XDECREF(c->c_locals);
443 Py_XDECREF(c->c_varnames);
444 Py_XDECREF(c->c_lnotab);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000445}
446
447static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000448com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000449{
450 c->c_stacklevel += n;
451 if (c->c_stacklevel > c->c_maxstacklevel)
452 c->c_maxstacklevel = c->c_stacklevel;
453}
454
455static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000456com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000457{
458 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000459 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000460 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
461 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000462 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000463 c->c_stacklevel = 0;
464 }
465 else
466 c->c_stacklevel -= n;
467}
468
469static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000470com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000471{
472 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000473 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000474 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000475 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000476}
477
478static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000479com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000480{
481 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000482 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000483 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000484 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000485 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000486 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000487 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000488 com_error(c, PyExc_SystemError,
489 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000490 }
491 if (c->c_code == NULL)
492 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000493 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000494 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000495 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000496 c->c_errors++;
497 return;
498 }
499 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000500 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000501}
502
503static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000504com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000505{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000506 com_addbyte(c, x & 0xff);
507 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000508}
509
510static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000511com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000512{
513 int size;
514 char *p;
515 if (c->c_lnotab == NULL)
516 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000517 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000518 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000519 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000520 c->c_errors++;
521 return;
522 }
523 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000524 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000525 *p++ = addr;
526 *p++ = line;
527 c->c_lnotab_next += 2;
528}
529
530static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000531com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000532{
533 c->c_lineno = lineno;
534 if (c->c_firstlineno == 0) {
535 c->c_firstlineno = c->c_last_line = lineno;
536 }
537 else {
538 int incr_addr = c->c_nexti - c->c_last_addr;
539 int incr_line = lineno - c->c_last_line;
540 while (incr_addr > 0 || incr_line > 0) {
541 int trunc_addr = incr_addr;
542 int trunc_line = incr_line;
543 if (trunc_addr > 255)
544 trunc_addr = 255;
545 if (trunc_line > 255)
546 trunc_line = 255;
547 com_add_lnotab(c, trunc_addr, trunc_line);
548 incr_addr -= trunc_addr;
549 incr_line -= trunc_line;
550 }
551 c->c_last_addr = c->c_nexti;
552 c->c_last_line = lineno;
553 }
554}
555
556static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000557com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000558{
Guido van Rossum8e793d91997-03-03 19:13:14 +0000559 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000560 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000561 if (Py_OptimizeFlag)
562 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000563 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000564 com_addbyte(c, op);
565 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000566}
567
568static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000569com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000570{
571 /* Compile a forward reference for backpatching */
572 int here;
573 int anchor;
574 com_addbyte(c, op);
575 here = c->c_nexti;
576 anchor = *p_anchor;
577 *p_anchor = here;
578 com_addint(c, anchor == 0 ? 0 : here - anchor);
579}
580
581static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000582com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000583{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000584 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000585 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000586 int dist;
587 int prev;
588 for (;;) {
589 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000590 prev = code[anchor] + (code[anchor+1] << 8);
591 dist = target - (anchor+2);
592 code[anchor] = dist & 0xff;
593 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000594 if (!prev)
595 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000596 anchor -= prev;
597 }
598}
599
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000600/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000601
602static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000603com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000604{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000605 PyObject *w, *t, *np=NULL;
606 long n;
607
608 t = Py_BuildValue("(OO)", v, v->ob_type);
609 if (t == NULL)
610 goto fail;
611 w = PyDict_GetItem(dict, t);
612 if (w != NULL) {
613 n = PyInt_AsLong(w);
614 } else {
615 n = PyList_Size(list);
616 np = PyInt_FromLong(n);
617 if (np == NULL)
618 goto fail;
619 if (PyList_Append(list, v) != 0)
620 goto fail;
621 if (PyDict_SetItem(dict, t, np) != 0)
622 goto fail;
623 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000624 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000625 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000626 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000627 fail:
628 Py_XDECREF(np);
629 Py_XDECREF(t);
630 c->c_errors++;
631 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000632}
633
634static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000635com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000636{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000637 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000638}
639
640static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000641com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000642{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000643 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000644}
645
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000646#ifdef PRIVATE_NAME_MANGLING
647static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000648com_mangle(struct compiling *c, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000649{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000650 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000651 This is independent from how the name is used. */
652 char *p;
Guido van Rossum582acec2000-06-28 22:07:35 +0000653 size_t nlen, plen;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000654 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000655 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000656 return 0; /* Don't mangle __extremely_long_names */
657 if (name[nlen-1] == '_' && name[nlen-2] == '_')
658 return 0; /* Don't mangle __whatever__ */
659 p = c->c_private;
660 /* Strip leading underscores from class name */
661 while (*p == '_')
662 p++;
663 if (*p == '\0')
664 return 0; /* Don't mangle if class is just underscores */
665 plen = strlen(p);
666 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000667 plen = maxlen-nlen-2; /* Truncate class name if too long */
668 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000669 buffer[0] = '_';
670 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000671 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000672 /* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
673 return 1;
674}
675#endif
676
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000677static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000678com_addopnamestr(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000679{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000680 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000681 int i;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000682#ifdef PRIVATE_NAME_MANGLING
683 char buffer[256];
684 if (name != NULL && name[0] == '_' && name[1] == '_' &&
685 c->c_private != NULL &&
Guido van Rossum582acec2000-06-28 22:07:35 +0000686 com_mangle(c, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000687 name = buffer;
688#endif
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000689 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000690 c->c_errors++;
691 i = 255;
692 }
693 else {
694 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000695 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000696 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000697 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
698 switch (op) {
699 case LOAD_NAME:
700 case STORE_NAME:
701 case DELETE_NAME:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000702 if (PyDict_GetItemString(c->c_globals, name) != NULL) {
Guido van Rossumc5e96291991-12-10 13:53:51 +0000703 switch (op) {
704 case LOAD_NAME: op = LOAD_GLOBAL; break;
705 case STORE_NAME: op = STORE_GLOBAL; break;
706 case DELETE_NAME: op = DELETE_GLOBAL; break;
707 }
708 }
709 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000710 com_addoparg(c, op, i);
711}
712
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000713static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000714com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000715{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000716 char *name;
717 char buffer[1000];
718 /* XXX it is possible to write this code without the 1000
719 chars on the total length of dotted names, I just can't be
720 bothered right now */
721 if (TYPE(n) == STAR)
722 name = "*";
723 else if (TYPE(n) == dotted_name) {
724 char *p = buffer;
725 int i;
726 name = buffer;
727 for (i = 0; i < NCH(n); i += 2) {
728 char *s = STR(CHILD(n, i));
729 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000730 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000731 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +0000732 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000733 break;
734 }
735 if (p != buffer)
736 *p++ = '.';
737 strcpy(p, s);
738 p = strchr(p, '\0');
739 }
740 }
741 else {
742 REQ(n, NAME);
743 name = STR(n);
744 }
745 com_addopnamestr(c, op, name);
746}
747
Guido van Rossum79f25d91997-04-29 20:08:16 +0000748static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000749parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000750{
Tim Petersdbd9ba62000-07-09 03:09:57 +0000751 extern double atof(const char *);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000752 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000753 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000754 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +0000755#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +0000756 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +0000757 int imflag;
758#endif
759
Guido van Rossum282914b1991-04-04 10:42:56 +0000760 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000761 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +0000762#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +0000763 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +0000764#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000765 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000766 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000767 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000768 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000769 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000770 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000771 if (*end == '\0') {
772 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000773 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000774 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000775 return NULL;
776 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000777 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000778 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000779 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +0000780#ifndef WITHOUT_COMPLEX
781 if (imflag) {
782 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000783 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +0000784 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000785 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000786 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +0000787 }
Guido van Rossumac1fc951997-10-08 15:23:55 +0000788 else
Guido van Rossum50564e81996-01-12 01:13:16 +0000789#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +0000790 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000791 PyFPE_START_PROTECT("atof", return 0)
792 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000793 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000794 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000795 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000796}
797
Guido van Rossum79f25d91997-04-29 20:08:16 +0000798static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000799parsestr(char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000800{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000801 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +0000802 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000803 char *buf;
804 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000805 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000806 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +0000807 int first = *s;
808 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000809 int rawmode = 0;
810 int unicode = 0;
811 if (isalpha(quote) || quote == '_') {
812 if (quote == 'u' || quote == 'U') {
813 quote = *++s;
814 unicode = 1;
815 }
816 if (quote == 'r' || quote == 'R') {
817 quote = *++s;
818 rawmode = 1;
819 }
820 }
Guido van Rossum8054fad1993-10-26 15:19:44 +0000821 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000822 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000823 return NULL;
824 }
825 s++;
826 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +0000827 if (len > INT_MAX) {
828 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
829 return NULL;
830 }
Guido van Rossum8054fad1993-10-26 15:19:44 +0000831 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000832 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000833 return NULL;
834 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000835 if (len >= 4 && s[0] == quote && s[1] == quote) {
836 s += 2;
837 len -= 2;
838 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000839 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000840 return NULL;
841 }
842 }
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +0000843 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000844 if (rawmode)
845 return PyUnicode_DecodeRawUnicodeEscape(
846 s, len, NULL);
847 else
848 return PyUnicode_DecodeUnicodeEscape(
849 s, len, NULL);
850 }
851 else if (rawmode || strchr(s, '\\') == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000852 return PyString_FromStringAndSize(s, len);
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000853 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000854 v = PyString_FromStringAndSize((char *)NULL, len);
855 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000856 end = s + len;
857 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000858 if (*s != '\\') {
859 *p++ = *s++;
860 continue;
861 }
862 s++;
863 switch (*s++) {
864 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000865 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000866 case '\\': *p++ = '\\'; break;
867 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000868 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000869 case 'b': *p++ = '\b'; break;
870 case 'f': *p++ = '\014'; break; /* FF */
871 case 't': *p++ = '\t'; break;
872 case 'n': *p++ = '\n'; break;
873 case 'r': *p++ = '\r'; break;
874 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000875 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
876 case '0': case '1': case '2': case '3':
877 case '4': case '5': case '6': case '7':
878 c = s[-1] - '0';
879 if ('0' <= *s && *s <= '7') {
880 c = (c<<3) + *s++ - '0';
881 if ('0' <= *s && *s <= '7')
882 c = (c<<3) + *s++ - '0';
883 }
884 *p++ = c;
885 break;
886 case 'x':
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000887 if (isxdigit(Py_CHARMASK(*s))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000888 unsigned int x = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000889 do {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000890 c = Py_CHARMASK(*s);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000891 s++;
Guido van Rossumed1100f1997-10-20 23:24:07 +0000892 x = (x<<4) & ~0xF;
893 if (isdigit(c))
894 x += c - '0';
895 else if (islower(c))
896 x += 10 + c - 'a';
897 else
898 x += 10 + c - 'A';
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000899 } while (isxdigit(Py_CHARMASK(*s)));
Guido van Rossumed1100f1997-10-20 23:24:07 +0000900 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000901 break;
902 }
903 /* FALLTHROUGH */
904 default: *p++ = '\\'; *p++ = s[-1]; break;
905 }
906 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000907 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000908 return v;
909}
910
Guido van Rossum79f25d91997-04-29 20:08:16 +0000911static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000912parsestrplus(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000913{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000914 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000915 int i;
916 REQ(CHILD(n, 0), STRING);
917 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
918 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +0000919 for (i = 1; i < NCH(n); i++) {
920 PyObject *s;
921 s = parsestr(STR(CHILD(n, i)));
922 if (s == NULL)
923 goto onError;
924 if (PyString_Check(v) && PyString_Check(s)) {
925 PyString_ConcatAndDel(&v, s);
926 if (v == NULL)
927 goto onError;
928 }
929 else {
930 PyObject *temp;
931 temp = PyUnicode_Concat(v, s);
932 Py_DECREF(s);
933 if (temp == NULL)
934 goto onError;
935 Py_DECREF(v);
936 v = temp;
937 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000938 }
939 }
940 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +0000941
942 onError:
943 Py_XDECREF(v);
944 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000945}
946
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000947static void
Skip Montanaro803d6e52000-08-12 18:09:51 +0000948com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000949{
Skip Montanaro803d6e52000-08-12 18:09:51 +0000950 PyObject *v;
951 int anchor = 0;
952 int save_begin = c->c_begin;
953
954 /* list_iter: for v in expr [list_iter] */
955 com_node(c, CHILD(n, 3)); /* expr */
956 v = PyInt_FromLong(0L);
957 if (v == NULL)
958 c->c_errors++;
959 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
960 com_push(c, 1);
961 Py_XDECREF(v);
962 c->c_begin = c->c_nexti;
963 com_addoparg(c, SET_LINENO, n->n_lineno);
964 com_addfwref(c, FOR_LOOP, &anchor);
965 com_push(c, 1);
966 com_assign(c, CHILD(n, 1), OP_ASSIGN);
967 c->c_loops++;
968 com_list_iter(c, n, e, t);
969 c->c_loops--;
970 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
971 c->c_begin = save_begin;
972 com_backpatch(c, anchor);
973 com_pop(c, 2); /* FOR_LOOP has popped these */
974}
975
976static void
977com_list_if(struct compiling *c, node *n, node *e, char *t)
978{
979 int anchor = 0;
980 int a = 0;
981 /* list_iter: 'if' test [list_iter] */
982 com_addoparg(c, SET_LINENO, n->n_lineno);
983 com_node(c, CHILD(n, 1));
984 com_addfwref(c, JUMP_IF_FALSE, &a);
985 com_addbyte(c, POP_TOP);
986 com_pop(c, 1);
987 com_list_iter(c, n, e, t);
988 com_addfwref(c, JUMP_FORWARD, &anchor);
989 com_backpatch(c, a);
990 /* We jump here with an extra entry which we now pop */
991 com_addbyte(c, POP_TOP);
992 com_backpatch(c, anchor);
993}
994
995static void
996com_list_iter(struct compiling *c,
997 node *p, /* parent of list_iter node */
998 node *e, /* element expression node */
999 char *t /* name of result list temp local */)
1000{
1001 /* list_iter is the last child in a listmaker, list_for, or list_if */
1002 node *n = CHILD(p, NCH(p)-1);
1003 if (TYPE(n) == list_iter) {
1004 n = CHILD(n, 0);
1005 switch (TYPE(n)) {
1006 case list_for:
1007 com_list_for(c, n, e, t);
1008 break;
1009 case list_if:
1010 com_list_if(c, n, e, t);
1011 break;
1012 default:
1013 com_error(c, PyExc_SystemError,
1014 "invalid list_iter node type");
1015 }
1016 }
1017 else {
1018 com_addopnamestr(c, LOAD_NAME, t);
1019 com_push(c, 1);
1020 com_node(c, e);
1021 com_addoparg(c, CALL_FUNCTION, 1);
1022 com_addbyte(c, POP_TOP);
1023 com_pop(c, 2);
1024 }
1025}
1026
1027static void
1028com_list_comprehension(struct compiling *c, node *n)
1029{
1030 /* listmaker: test list_iter */
1031 char tmpname[12];
1032 sprintf(tmpname, "__%d__", ++c->c_tmpname);
1033 com_addoparg(c, BUILD_LIST, 0);
1034 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1035 com_push(c, 2);
1036 com_addopnamestr(c, LOAD_ATTR, "append");
1037 com_addopnamestr(c, STORE_NAME, tmpname);
1038 com_pop(c, 1);
1039 com_list_iter(c, n, CHILD(n, 0), tmpname);
1040 com_addopnamestr(c, DELETE_NAME, tmpname);
1041 --c->c_tmpname;
1042}
1043
1044static void
1045com_listmaker(struct compiling *c, node *n)
1046{
1047 /* listmaker: test ( list_iter | (',' test)* [','] ) */
1048 if (TYPE(CHILD(n, 1)) == list_iter)
1049 com_list_comprehension(c, n);
1050 else {
1051 int len = 0;
1052 int i;
1053 for (i = 0; i < NCH(n); i += 2, len++)
1054 com_node(c, CHILD(n, i));
1055 com_addoparg(c, BUILD_LIST, len);
1056 com_pop(c, len-1);
1057 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001058}
1059
1060static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001061com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001062{
1063 int i;
1064 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1065 for (i = 0; i+2 < NCH(n); i += 4) {
1066 /* We must arrange things just right for STORE_SUBSCR.
1067 It wants the stack to look like (value) (dict) (key) */
1068 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001069 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001070 com_node(c, CHILD(n, i+2)); /* value */
1071 com_addbyte(c, ROT_TWO);
1072 com_node(c, CHILD(n, i)); /* key */
1073 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001074 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001075 }
1076}
1077
1078static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001079com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001080{
1081 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001082 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001083 int i;
1084 REQ(n, atom);
1085 ch = CHILD(n, 0);
1086 switch (TYPE(ch)) {
1087 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001088 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001089 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001090 com_push(c, 1);
1091 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001092 else
1093 com_node(c, CHILD(n, 1));
1094 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001095 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001096 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001097 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001098 com_push(c, 1);
1099 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001100 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001101 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001102 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001103 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001104 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001105 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001106 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001107 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001108 break;
1109 case BACKQUOTE:
1110 com_node(c, CHILD(n, 1));
1111 com_addbyte(c, UNARY_CONVERT);
1112 break;
1113 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001114 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001115 i = 255;
1116 }
1117 else {
1118 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001119 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001120 }
1121 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001122 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001123 break;
1124 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001125 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001126 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001127 c->c_errors++;
1128 i = 255;
1129 }
1130 else {
1131 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001132 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001133 }
1134 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001135 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001136 break;
1137 case NAME:
1138 com_addopname(c, LOAD_NAME, ch);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001139 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001140 break;
1141 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001142 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001143 com_error(c, PyExc_SystemError,
1144 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001145 }
1146}
1147
1148static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001149com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001150{
1151 if (NCH(n) == 1) {
1152 com_addbyte(c, op);
1153 }
1154 else if (NCH(n) == 2) {
1155 if (TYPE(CHILD(n, 0)) != COLON) {
1156 com_node(c, CHILD(n, 0));
1157 com_addbyte(c, op+1);
1158 }
1159 else {
1160 com_node(c, CHILD(n, 1));
1161 com_addbyte(c, op+2);
1162 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001163 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001164 }
1165 else {
1166 com_node(c, CHILD(n, 0));
1167 com_node(c, CHILD(n, 2));
1168 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001169 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001170 }
1171}
1172
Guido van Rossum635abd21997-01-06 22:56:52 +00001173static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001174com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001175{
1176 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001177 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001178 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001179 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001180 com_error(c, PyExc_SyntaxError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001181 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001182 }
1183 else {
1184 com_node(c, CHILD(n, 0));
1185 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001186 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001187 }
1188 m = n;
1189 do {
1190 m = CHILD(m, 0);
1191 } while (NCH(m) == 1);
1192 if (TYPE(m) != NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001193 com_error(c, PyExc_SyntaxError,
1194 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001195 }
1196 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001197 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001198 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001199 *pkeywords = PyDict_New();
Guido van Rossum635abd21997-01-06 22:56:52 +00001200 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001201 c->c_errors++;
1202 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001203 if (PyDict_GetItem(*pkeywords, v) != NULL)
1204 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001205 "duplicate keyword argument");
1206 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001207 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001208 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001209 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001210 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001211 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001212 }
1213 }
1214 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001215}
1216
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001217static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001218com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001219{
1220 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001221 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001222 }
1223 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001224 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001225 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001226 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001227 int star_flag = 0;
1228 int starstar_flag = 0;
1229 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001230 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001231 na = 0;
1232 nk = 0;
1233 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001234 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001235 if (TYPE(ch) == STAR ||
1236 TYPE(ch) == DOUBLESTAR)
1237 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001238 if (ch->n_lineno != lineno) {
1239 lineno = ch->n_lineno;
1240 com_addoparg(c, SET_LINENO, lineno);
1241 }
1242 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001243 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001244 na++;
1245 else
1246 nk++;
1247 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001248 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001249 while (i < NCH(n)) {
1250 node *tok = CHILD(n, i);
1251 node *ch = CHILD(n, i+1);
1252 i += 3;
1253 switch (TYPE(tok)) {
1254 case STAR: star_flag = 1; break;
1255 case DOUBLESTAR: starstar_flag = 1; break;
1256 }
1257 com_node(c, ch);
1258 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001259 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001260 com_error(c, PyExc_SyntaxError,
1261 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001262 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001263 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001264 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001265 star_flag + (starstar_flag << 1);
1266 else
1267 opcode = CALL_FUNCTION;
1268 com_addoparg(c, opcode, na | (nk << 8));
1269 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001270 }
1271}
1272
1273static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001274com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001275{
1276 com_addopname(c, LOAD_ATTR, n);
1277}
1278
1279static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001280com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001281{
1282 int i=0;
1283 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001284 node *ch;
1285
1286 /* first argument */
1287 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001288 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001289 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001290 i++;
1291 }
1292 else {
1293 com_node(c, CHILD(n,i));
1294 i++;
1295 REQ(CHILD(n,i),COLON);
1296 i++;
1297 }
1298 /* second argument */
1299 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1300 com_node(c, CHILD(n,i));
1301 i++;
1302 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001303 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001304 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001305 com_push(c, 1);
1306 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001307 /* remaining arguments */
1308 for (; i < NCH(n); i++) {
1309 ns++;
1310 ch=CHILD(n,i);
1311 REQ(ch, sliceop);
1312 if (NCH(ch) == 1) {
1313 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001314 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001315 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001316 }
1317 else
1318 com_node(c, CHILD(ch,1));
1319 }
1320 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001321 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001322}
1323
1324static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001325com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001326{
1327 node *ch;
1328 REQ(n, subscript);
1329 ch = CHILD(n,0);
1330 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001331 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001332 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001333 com_push(c, 1);
1334 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001335 else {
1336 /* check for slice */
1337 if ((TYPE(ch) == COLON || NCH(n) > 1))
1338 com_sliceobj(c, n);
1339 else {
1340 REQ(ch, test);
1341 com_node(c, ch);
1342 }
1343 }
1344}
1345
1346static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001347com_subscriptlist(struct compiling *c, node *n, int assigning)
Guido van Rossum8861b741996-07-30 16:49:37 +00001348{
1349 int i, op;
1350 REQ(n, subscriptlist);
1351 /* Check to make backward compatible slice behavior for '[i:j]' */
1352 if (NCH(n) == 1) {
1353 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001354 /* 'Basic' slice, should have exactly one colon. */
1355 if ((TYPE(CHILD(sub, 0)) == COLON
1356 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1357 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1358 {
Guido van Rossum8861b741996-07-30 16:49:37 +00001359 if (assigning == OP_APPLY)
1360 op = SLICE;
1361 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001362 op = ((assigning == OP_ASSIGN) ?
1363 STORE_SLICE : DELETE_SLICE);
Guido van Rossum8861b741996-07-30 16:49:37 +00001364 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001365 if (op == STORE_SLICE)
1366 com_pop(c, 2);
1367 else if (op == DELETE_SLICE)
1368 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001369 return;
1370 }
1371 }
1372 /* Else normal subscriptlist. Compile each subscript. */
1373 for (i = 0; i < NCH(n); i += 2)
1374 com_subscript(c, CHILD(n, i));
1375 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001376 if (NCH(n) > 1) {
1377 i = (NCH(n)+1) / 2;
1378 com_addoparg(c, BUILD_TUPLE, i);
1379 com_pop(c, i-1);
1380 }
1381 if (assigning == OP_APPLY) {
Guido van Rossum8861b741996-07-30 16:49:37 +00001382 op = BINARY_SUBSCR;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001383 i = 1;
1384 }
1385 else if (assigning == OP_ASSIGN) {
1386 op = STORE_SUBSCR;
1387 i = 3;
1388 }
1389 else {
1390 op = DELETE_SUBSCR;
1391 i = 2;
1392 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001393 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001394 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001395}
1396
1397static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001398com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001399{
1400 REQ(n, trailer);
1401 switch (TYPE(CHILD(n, 0))) {
1402 case LPAR:
1403 com_call_function(c, CHILD(n, 1));
1404 break;
1405 case DOT:
1406 com_select_member(c, CHILD(n, 1));
1407 break;
1408 case LSQB:
Guido van Rossum8861b741996-07-30 16:49:37 +00001409 com_subscriptlist(c, CHILD(n, 1), OP_APPLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001410 break;
1411 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001412 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001413 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001414 }
1415}
1416
1417static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001418com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001419{
1420 int i;
1421 REQ(n, power);
1422 com_atom(c, CHILD(n, 0));
1423 for (i = 1; i < NCH(n); i++) {
1424 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1425 com_factor(c, CHILD(n, i+1));
1426 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001427 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001428 break;
1429 }
1430 else
1431 com_apply_trailer(c, CHILD(n, i));
1432 }
1433}
1434
1435static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001436com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001437{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001438 REQ(n, factor);
1439 if (TYPE(CHILD(n, 0)) == PLUS) {
1440 com_factor(c, CHILD(n, 1));
1441 com_addbyte(c, UNARY_POSITIVE);
1442 }
1443 else if (TYPE(CHILD(n, 0)) == MINUS) {
1444 com_factor(c, CHILD(n, 1));
1445 com_addbyte(c, UNARY_NEGATIVE);
1446 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001447 else if (TYPE(CHILD(n, 0)) == TILDE) {
1448 com_factor(c, CHILD(n, 1));
1449 com_addbyte(c, UNARY_INVERT);
1450 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001451 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001452 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001453 }
1454}
1455
1456static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001457com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001458{
1459 int i;
1460 int op;
1461 REQ(n, term);
1462 com_factor(c, CHILD(n, 0));
1463 for (i = 2; i < NCH(n); i += 2) {
1464 com_factor(c, CHILD(n, i));
1465 switch (TYPE(CHILD(n, i-1))) {
1466 case STAR:
1467 op = BINARY_MULTIPLY;
1468 break;
1469 case SLASH:
1470 op = BINARY_DIVIDE;
1471 break;
1472 case PERCENT:
1473 op = BINARY_MODULO;
1474 break;
1475 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001476 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001477 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001478 op = 255;
1479 }
1480 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001481 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001482 }
1483}
1484
1485static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001486com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001487{
1488 int i;
1489 int op;
1490 REQ(n, arith_expr);
1491 com_term(c, CHILD(n, 0));
1492 for (i = 2; i < NCH(n); i += 2) {
1493 com_term(c, CHILD(n, i));
1494 switch (TYPE(CHILD(n, i-1))) {
1495 case PLUS:
1496 op = BINARY_ADD;
1497 break;
1498 case MINUS:
1499 op = BINARY_SUBTRACT;
1500 break;
1501 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001502 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001503 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001504 op = 255;
1505 }
1506 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001507 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001508 }
1509}
1510
1511static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001512com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001513{
1514 int i;
1515 int op;
1516 REQ(n, shift_expr);
1517 com_arith_expr(c, CHILD(n, 0));
1518 for (i = 2; i < NCH(n); i += 2) {
1519 com_arith_expr(c, CHILD(n, i));
1520 switch (TYPE(CHILD(n, i-1))) {
1521 case LEFTSHIFT:
1522 op = BINARY_LSHIFT;
1523 break;
1524 case RIGHTSHIFT:
1525 op = BINARY_RSHIFT;
1526 break;
1527 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001528 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001529 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001530 op = 255;
1531 }
1532 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001533 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001534 }
1535}
1536
1537static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001538com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001539{
1540 int i;
1541 int op;
1542 REQ(n, and_expr);
1543 com_shift_expr(c, CHILD(n, 0));
1544 for (i = 2; i < NCH(n); i += 2) {
1545 com_shift_expr(c, CHILD(n, i));
1546 if (TYPE(CHILD(n, i-1)) == AMPER) {
1547 op = BINARY_AND;
1548 }
1549 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001550 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001551 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001552 op = 255;
1553 }
1554 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001555 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001556 }
1557}
1558
1559static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001560com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001561{
1562 int i;
1563 int op;
1564 REQ(n, xor_expr);
1565 com_and_expr(c, CHILD(n, 0));
1566 for (i = 2; i < NCH(n); i += 2) {
1567 com_and_expr(c, CHILD(n, i));
1568 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1569 op = BINARY_XOR;
1570 }
1571 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001572 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001573 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001574 op = 255;
1575 }
1576 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001577 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001578 }
1579}
1580
1581static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001582com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001583{
1584 int i;
1585 int op;
1586 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001587 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001588 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001589 com_xor_expr(c, CHILD(n, i));
1590 if (TYPE(CHILD(n, i-1)) == VBAR) {
1591 op = BINARY_OR;
1592 }
1593 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001594 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001595 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001596 op = 255;
1597 }
1598 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001599 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001600 }
1601}
1602
1603static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001604cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001605{
1606 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001607 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001608 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1609 if (NCH(n) == 1) {
1610 n = CHILD(n, 0);
1611 switch (TYPE(n)) {
1612 case LESS: return LT;
1613 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001614 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001615 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001616 case LESSEQUAL: return LE;
1617 case GREATEREQUAL: return GE;
1618 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001619 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1620 if (strcmp(STR(n), "is") == 0) return IS;
1621 }
1622 }
1623 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001624 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001625 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1626 return NOT_IN;
1627 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1628 return IS_NOT;
1629 }
1630 }
1631 return BAD;
1632}
1633
1634static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001635com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001636{
1637 int i;
1638 enum cmp_op op;
1639 int anchor;
1640 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1641 com_expr(c, CHILD(n, 0));
1642 if (NCH(n) == 1)
1643 return;
1644
1645 /****************************************************************
1646 The following code is generated for all but the last
1647 comparison in a chain:
1648
1649 label: on stack: opcode: jump to:
1650
1651 a <code to load b>
1652 a, b DUP_TOP
1653 a, b, b ROT_THREE
1654 b, a, b COMPARE_OP
1655 b, 0-or-1 JUMP_IF_FALSE L1
1656 b, 1 POP_TOP
1657 b
1658
1659 We are now ready to repeat this sequence for the next
1660 comparison in the chain.
1661
1662 For the last we generate:
1663
1664 b <code to load c>
1665 b, c COMPARE_OP
1666 0-or-1
1667
1668 If there were any jumps to L1 (i.e., there was more than one
1669 comparison), we generate:
1670
1671 0-or-1 JUMP_FORWARD L2
1672 L1: b, 0 ROT_TWO
1673 0, b POP_TOP
1674 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00001675 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001676 ****************************************************************/
1677
1678 anchor = 0;
1679
1680 for (i = 2; i < NCH(n); i += 2) {
1681 com_expr(c, CHILD(n, i));
1682 if (i+2 < NCH(n)) {
1683 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001684 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001685 com_addbyte(c, ROT_THREE);
1686 }
1687 op = cmp_type(CHILD(n, i-1));
1688 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001689 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001690 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001691 }
1692 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001693 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001694 if (i+2 < NCH(n)) {
1695 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1696 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001697 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001698 }
1699 }
1700
1701 if (anchor) {
1702 int anchor2 = 0;
1703 com_addfwref(c, JUMP_FORWARD, &anchor2);
1704 com_backpatch(c, anchor);
1705 com_addbyte(c, ROT_TWO);
1706 com_addbyte(c, POP_TOP);
1707 com_backpatch(c, anchor2);
1708 }
1709}
1710
1711static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001712com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001713{
1714 REQ(n, not_test); /* 'not' not_test | comparison */
1715 if (NCH(n) == 1) {
1716 com_comparison(c, CHILD(n, 0));
1717 }
1718 else {
1719 com_not_test(c, CHILD(n, 1));
1720 com_addbyte(c, UNARY_NOT);
1721 }
1722}
1723
1724static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001725com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001726{
1727 int i;
1728 int anchor;
1729 REQ(n, and_test); /* not_test ('and' not_test)* */
1730 anchor = 0;
1731 i = 0;
1732 for (;;) {
1733 com_not_test(c, CHILD(n, i));
1734 if ((i += 2) >= NCH(n))
1735 break;
1736 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1737 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001738 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001739 }
1740 if (anchor)
1741 com_backpatch(c, anchor);
1742}
1743
1744static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001745com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001746{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001747 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00001748 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001749 PyObject *v;
Guido van Rossum57531fe1993-11-30 14:57:42 +00001750 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001751 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001752 v = (PyObject *) icompile(CHILD(n, 0), c);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001753 if (v == NULL) {
1754 c->c_errors++;
1755 i = 255;
1756 }
1757 else {
1758 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001759 Py_DECREF(v);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001760 }
1761 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001762 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001763 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001764 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001765 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001766 else {
1767 int anchor = 0;
1768 int i = 0;
1769 for (;;) {
1770 com_and_test(c, CHILD(n, i));
1771 if ((i += 2) >= NCH(n))
1772 break;
1773 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1774 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001775 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001776 }
1777 if (anchor)
1778 com_backpatch(c, anchor);
1779 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001780}
1781
1782static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001783com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001784{
1785 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001786 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001787 com_node(c, CHILD(n, 0));
1788 }
1789 else {
1790 int i;
1791 int len;
1792 len = (NCH(n) + 1) / 2;
1793 for (i = 0; i < NCH(n); i += 2)
1794 com_node(c, CHILD(n, i));
1795 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001796 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001797 }
1798}
1799
1800
1801/* Begin of assignment compilation */
1802
Tim Petersdbd9ba62000-07-09 03:09:57 +00001803static void com_assign_name(struct compiling *, node *, int);
1804static void com_assign(struct compiling *, node *, int);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001805
1806static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001807com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001808{
1809 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001810 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001811}
1812
1813static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001814com_assign_trailer(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001815{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001816 REQ(n, trailer);
1817 switch (TYPE(CHILD(n, 0))) {
1818 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001819 com_error(c, PyExc_SyntaxError,
1820 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001821 break;
1822 case DOT: /* '.' NAME */
1823 com_assign_attr(c, CHILD(n, 1), assigning);
1824 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001825 case LSQB: /* '[' subscriptlist ']' */
1826 com_subscriptlist(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001827 break;
1828 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001829 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001830 }
1831}
1832
1833static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001834com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001835{
1836 int i;
1837 if (TYPE(n) != testlist)
1838 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001839 if (assigning) {
1840 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001841 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001842 com_push(c, i-1);
1843 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001844 for (i = 0; i < NCH(n); i += 2)
1845 com_assign(c, CHILD(n, i), assigning);
1846}
1847
1848static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001849com_assign_list(struct compiling *c, node *n, int assigning)
1850{
1851 int i;
1852 if (assigning) {
1853 i = (NCH(n)+1)/2;
1854 com_addoparg(c, UNPACK_SEQUENCE, i);
1855 com_push(c, i-1);
1856 }
1857 for (i = 0; i < NCH(n); i += 2)
1858 com_assign(c, CHILD(n, i), assigning);
1859}
1860
1861static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001862com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001863{
1864 REQ(n, NAME);
1865 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001866 if (assigning)
1867 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001868}
1869
1870static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001871com_assign(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001872{
1873 /* Loop to avoid trivial recursion */
1874 for (;;) {
1875 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001876
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001877 case exprlist:
1878 case testlist:
1879 if (NCH(n) > 1) {
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001880 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001881 return;
1882 }
1883 n = CHILD(n, 0);
1884 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001885
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001886 case test:
1887 case and_test:
1888 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001889 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001890 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001891 case xor_expr:
1892 case and_expr:
1893 case shift_expr:
1894 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001895 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00001896 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001897 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001898 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001899 "can't assign to operator");
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 Rossum50564e81996-01-12 01:13:16 +00001905 case power: /* atom trailer* ('**' power)* */
1906/* ('+'|'-'|'~') factor | atom trailer* */
1907 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001908 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001909 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001910 return;
1911 }
Guido van Rossum50564e81996-01-12 01:13:16 +00001912 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001913 int i;
1914 com_node(c, CHILD(n, 0));
1915 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00001916 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
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 Rossum50564e81996-01-12 01:13:16 +00001919 return;
1920 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001921 com_apply_trailer(c, CHILD(n, i));
1922 } /* NB i is still alive */
1923 com_assign_trailer(c,
1924 CHILD(n, i), assigning);
1925 return;
1926 }
1927 n = CHILD(n, 0);
1928 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001929
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001930 case atom:
1931 switch (TYPE(CHILD(n, 0))) {
1932 case LPAR:
1933 n = CHILD(n, 1);
1934 if (TYPE(n) == RPAR) {
1935 /* XXX Should allow () = () ??? */
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 ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001938 return;
1939 }
1940 break;
1941 case LSQB:
1942 n = CHILD(n, 1);
1943 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001944 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001945 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001946 return;
1947 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001948 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001949 return;
1950 case NAME:
1951 com_assign_name(c, CHILD(n, 0), assigning);
1952 return;
1953 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001954 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001955 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001956 return;
1957 }
1958 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001959
1960 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001961 com_error(c, PyExc_SyntaxError,
1962 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001963 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001964
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001965 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001966 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001967 com_error(c, PyExc_SystemError,
1968 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001969 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001970
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001971 }
1972 }
1973}
Guido van Rossum7c531111997-03-11 18:42:21 +00001974
Tim Petersdbd9ba62000-07-09 03:09:57 +00001975/* Forward */ static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001976
1977static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001978com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001979{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001980 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001981 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001982 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001983 return;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001984 com_node(c, CHILD(n, NCH(n)-1));
1985 if (NCH(n) == 1) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001986 if (c->c_interactive)
1987 com_addbyte(c, PRINT_EXPR);
1988 else
1989 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001990 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001991 }
1992 else {
1993 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001994 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001995 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001996 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001997 com_push(c, 1);
1998 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001999 com_assign(c, CHILD(n, i), OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002000 }
2001 }
2002}
2003
2004static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002005com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002006{
2007 int a = 0, b = 0;
2008 int i;
2009 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2010 /* Generate code like for
2011
2012 if __debug__:
2013 if not <test>:
2014 raise AssertionError [, <message>]
2015
2016 where <message> is the second test, if present.
2017 */
2018 if (Py_OptimizeFlag)
2019 return;
2020 com_addopnamestr(c, LOAD_GLOBAL, "__debug__");
2021 com_push(c, 1);
2022 com_addfwref(c, JUMP_IF_FALSE, &a);
2023 com_addbyte(c, POP_TOP);
2024 com_pop(c, 1);
2025 com_node(c, CHILD(n, 1));
2026 com_addfwref(c, JUMP_IF_TRUE, &b);
2027 com_addbyte(c, POP_TOP);
2028 com_pop(c, 1);
2029 /* Raise that exception! */
2030 com_addopnamestr(c, LOAD_GLOBAL, "AssertionError");
2031 com_push(c, 1);
2032 i = NCH(n)/2; /* Either 2 or 4 */
2033 if (i > 1)
2034 com_node(c, CHILD(n, 3));
2035 com_addoparg(c, RAISE_VARARGS, i);
2036 com_pop(c, i);
2037 /* The interpreter does not fall through */
2038 /* All jumps converge here */
2039 com_backpatch(c, a);
2040 com_backpatch(c, b);
2041 com_addbyte(c, POP_TOP);
2042}
2043
2044static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002045com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002046{
2047 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002048 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
2049 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002050 com_node(c, CHILD(n, i));
2051 com_addbyte(c, PRINT_ITEM);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002052 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002053 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002054 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002055 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002056 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002057}
2058
2059static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002060com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002061{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002062 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002063 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002064 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002065 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002066 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002067 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002068 com_push(c, 1);
2069 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002070 else
2071 com_node(c, CHILD(n, 1));
2072 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002073 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002074}
2075
2076static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002077com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002078{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002079 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002080 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2081 if (NCH(n) > 1) {
2082 com_node(c, CHILD(n, 1));
2083 if (NCH(n) > 3) {
2084 com_node(c, CHILD(n, 3));
2085 if (NCH(n) > 5)
2086 com_node(c, CHILD(n, 5));
2087 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002088 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002089 i = NCH(n)/2;
2090 com_addoparg(c, RAISE_VARARGS, i);
2091 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002092}
2093
2094static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002095com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002096{
2097 int i;
2098 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002099 /* 'import' dotted_name (',' dotted_name)* |
2100 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002101 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002102 /* 'from' dotted_name 'import' ... */
2103 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002104 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002105 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002106 for (i = 3; i < NCH(n); i += 2)
2107 com_addopname(c, IMPORT_FROM, CHILD(n, i));
2108 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002109 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002110 }
2111 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002112 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002113 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002114 REQ(CHILD(n, i), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002115 com_addopname(c, IMPORT_NAME, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002116 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002117 com_addopname(c, STORE_NAME, CHILD(CHILD(n, i), 0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002118 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002119 }
2120 }
2121}
2122
2123static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002124com_global_stmt(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002125{
2126 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002127 REQ(n, global_stmt);
2128 /* 'global' NAME (',' NAME)* */
2129 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002130 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002131#ifdef PRIVATE_NAME_MANGLING
2132 char buffer[256];
2133 if (s != NULL && s[0] == '_' && s[1] == '_' &&
2134 c->c_private != NULL &&
Guido van Rossum582acec2000-06-28 22:07:35 +00002135 com_mangle(c, s, buffer, sizeof(buffer)))
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002136 s = buffer;
2137#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +00002138 if (PyDict_GetItemString(c->c_locals, s) != NULL) {
2139 com_error(c, PyExc_SyntaxError,
2140 "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002141 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002142 else if (PyDict_SetItemString(c->c_globals, s, Py_None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002143 c->c_errors++;
2144 }
2145}
2146
Guido van Rossum681d79a1995-07-18 14:51:37 +00002147static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002148com_newlocal_o(struct compiling *c, PyObject *nameval)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002149{
2150 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002151 PyObject *ival;
2152 if (PyList_Size(c->c_varnames) != c->c_nlocals) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002153 /* This is usually caused by an error on a previous call */
2154 if (c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002155 com_error(c, PyExc_SystemError,
2156 "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002157 }
2158 return 0;
2159 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002160 ival = PyInt_FromLong(i = c->c_nlocals++);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002161 if (ival == NULL)
2162 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002163 else if (PyDict_SetItem(c->c_locals, nameval, ival) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002164 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002165 else if (PyList_Append(c->c_varnames, nameval) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002166 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002167 Py_XDECREF(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002168 return i;
2169}
2170
2171static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002172com_addlocal_o(struct compiling *c, PyObject *nameval)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002173{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002174 PyObject *ival = PyDict_GetItem(c->c_locals, nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002175 if (ival != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002176 return PyInt_AsLong(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002177 return com_newlocal_o(c, nameval);
2178}
2179
2180static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002181com_newlocal(struct compiling *c, char *name)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002182{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002183 PyObject *nameval = PyString_InternFromString(name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002184 int i;
2185 if (nameval == NULL) {
2186 c->c_errors++;
2187 return 0;
2188 }
2189 i = com_newlocal_o(c, nameval);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002190 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002191 return i;
2192}
2193
Guido van Rossumc5e96291991-12-10 13:53:51 +00002194static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002195com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002196{
2197 REQ(n, exec_stmt);
2198 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2199 com_node(c, CHILD(n, 1));
2200 if (NCH(n) >= 4)
2201 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002202 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002203 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002204 com_push(c, 1);
2205 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002206 if (NCH(n) >= 6)
2207 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002208 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002209 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002210 com_push(c, 1);
2211 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002212 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002213 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002214}
2215
Guido van Rossum7c531111997-03-11 18:42:21 +00002216static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002217is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002218{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002219 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002220 int i;
2221
2222 /* Label to avoid tail recursion */
2223 next:
2224 switch (TYPE(n)) {
2225
2226 case suite:
2227 if (NCH(n) == 1) {
2228 n = CHILD(n, 0);
2229 goto next;
2230 }
2231 /* Fall through */
2232 case file_input:
2233 for (i = 0; i < NCH(n); i++) {
2234 node *ch = CHILD(n, i);
2235 if (TYPE(ch) == stmt) {
2236 n = ch;
2237 goto next;
2238 }
2239 }
2240 break;
2241
2242 case stmt:
2243 case simple_stmt:
2244 case small_stmt:
2245 n = CHILD(n, 0);
2246 goto next;
2247
2248 case expr_stmt:
2249 case testlist:
2250 case test:
2251 case and_test:
2252 case not_test:
2253 case comparison:
2254 case expr:
2255 case xor_expr:
2256 case and_expr:
2257 case shift_expr:
2258 case arith_expr:
2259 case term:
2260 case factor:
2261 case power:
2262 case atom:
2263 if (NCH(n) == 1) {
2264 n = CHILD(n, 0);
2265 goto next;
2266 }
2267 break;
2268
2269 case NAME:
2270 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2271 return 1;
2272 break;
2273
2274 case NUMBER:
2275 v = parsenumber(c, STR(n));
2276 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002277 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002278 break;
2279 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002280 i = PyObject_IsTrue(v);
2281 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002282 return i == 0;
2283
2284 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002285 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002286 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002287 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002288 break;
2289 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002290 i = PyObject_IsTrue(v);
2291 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002292 return i == 0;
2293
2294 }
2295 return 0;
2296}
2297
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002298static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002299com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002300{
2301 int i;
2302 int anchor = 0;
2303 REQ(n, if_stmt);
2304 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2305 for (i = 0; i+3 < NCH(n); i+=4) {
2306 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002307 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002308 if (is_constant_false(c, ch))
2309 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002310 if (i > 0)
2311 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002312 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002313 com_addfwref(c, JUMP_IF_FALSE, &a);
2314 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002315 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002316 com_node(c, CHILD(n, i+3));
2317 com_addfwref(c, JUMP_FORWARD, &anchor);
2318 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002319 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002320 com_addbyte(c, POP_TOP);
2321 }
2322 if (i+2 < NCH(n))
2323 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002324 if (anchor)
2325 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002326}
2327
2328static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002329com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002330{
2331 int break_anchor = 0;
2332 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002333 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002334 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2335 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002336 block_push(c, SETUP_LOOP);
2337 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002338 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002339 com_node(c, CHILD(n, 1));
2340 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2341 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002342 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002343 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002344 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002345 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002346 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2347 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002348 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002349 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002350 com_addbyte(c, POP_TOP);
2351 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002352 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002353 if (NCH(n) > 4)
2354 com_node(c, CHILD(n, 6));
2355 com_backpatch(c, break_anchor);
2356}
2357
2358static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002359com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002360{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002361 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002362 int break_anchor = 0;
2363 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002364 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002365 REQ(n, for_stmt);
2366 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2367 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002368 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002369 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002370 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002371 if (v == NULL)
2372 c->c_errors++;
2373 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002374 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002375 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002376 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002377 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002378 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002379 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002380 com_assign(c, CHILD(n, 1), OP_ASSIGN);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002381 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002382 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002383 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002384 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2385 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002386 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002387 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002388 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002389 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002390 if (NCH(n) > 8)
2391 com_node(c, CHILD(n, 8));
2392 com_backpatch(c, break_anchor);
2393}
2394
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002395/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002396
2397 SETUP_FINALLY L
2398 <code for S>
2399 POP_BLOCK
2400 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002401 L: <code for Sf>
2402 END_FINALLY
2403
2404 The special instructions use the block stack. Each block
2405 stack entry contains the instruction that created it (here
2406 SETUP_FINALLY), the level of the value stack at the time the
2407 block stack entry was created, and a label (here L).
2408
2409 SETUP_FINALLY:
2410 Pushes the current value stack level and the label
2411 onto the block stack.
2412 POP_BLOCK:
2413 Pops en entry from the block stack, and pops the value
2414 stack until its level is the same as indicated on the
2415 block stack. (The label is ignored.)
2416 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002417 Pops a variable number of entries from the *value* stack
2418 and re-raises the exception they specify. The number of
2419 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002420
2421 The block stack is unwound when an exception is raised:
2422 when a SETUP_FINALLY entry is found, the exception is pushed
2423 onto the value stack (and the exception condition is cleared),
2424 and the interpreter jumps to the label gotten from the block
2425 stack.
2426
2427 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002428 (The contents of the value stack is shown in [], with the top
2429 at the right; 'tb' is trace-back info, 'val' the exception's
2430 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002431
2432 Value stack Label Instruction Argument
2433 [] SETUP_EXCEPT L1
2434 [] <code for S>
2435 [] POP_BLOCK
2436 [] JUMP_FORWARD L0
2437
Guido van Rossum3f5da241990-12-20 15:06:42 +00002438 [tb, val, exc] L1: DUP )
2439 [tb, val, exc, exc] <evaluate E1> )
2440 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2441 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2442 [tb, val, exc, 1] POP )
2443 [tb, val, exc] POP
2444 [tb, val] <assign to V1> (or POP if no V1)
2445 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002446 [] <code for S1>
2447 JUMP_FORWARD L0
2448
Guido van Rossum3f5da241990-12-20 15:06:42 +00002449 [tb, val, exc, 0] L2: POP
2450 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002451 .............................etc.......................
2452
Guido van Rossum3f5da241990-12-20 15:06:42 +00002453 [tb, val, exc, 0] Ln+1: POP
2454 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002455
2456 [] L0: <next statement>
2457
2458 Of course, parts are not generated if Vi or Ei is not present.
2459*/
2460
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002461static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002462com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002463{
2464 int except_anchor = 0;
2465 int end_anchor = 0;
2466 int else_anchor = 0;
2467 int i;
2468 node *ch;
2469
2470 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2471 block_push(c, SETUP_EXCEPT);
2472 com_node(c, CHILD(n, 2));
2473 com_addbyte(c, POP_BLOCK);
2474 block_pop(c, SETUP_EXCEPT);
2475 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2476 com_backpatch(c, except_anchor);
2477 for (i = 3;
2478 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2479 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002480 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002481 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002482 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002483 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002484 break;
2485 }
2486 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002487 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002488 com_addoparg(c, SET_LINENO, ch->n_lineno);
2489 if (NCH(ch) > 1) {
2490 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002491 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002492 com_node(c, CHILD(ch, 1));
2493 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002494 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002495 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2496 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002497 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002498 }
2499 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002500 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002501 if (NCH(ch) > 3)
Guido van Rossum8861b741996-07-30 16:49:37 +00002502 com_assign(c, CHILD(ch, 3), OP_ASSIGN);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002503 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002504 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002505 com_pop(c, 1);
2506 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002507 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002508 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002509 com_node(c, CHILD(n, i+2));
2510 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2511 if (except_anchor) {
2512 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002513 /* We come in with [tb, val, exc, 0] on the
2514 stack; one pop and it's the same as
2515 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002516 com_addbyte(c, POP_TOP);
2517 }
2518 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002519 /* We actually come in here with [tb, val, exc] but the
2520 END_FINALLY will zap those and jump around.
2521 The c_stacklevel does not reflect them so we need not pop
2522 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002523 com_addbyte(c, END_FINALLY);
2524 com_backpatch(c, else_anchor);
2525 if (i < NCH(n))
2526 com_node(c, CHILD(n, i+2));
2527 com_backpatch(c, end_anchor);
2528}
2529
2530static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002531com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002532{
2533 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002534 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002535
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002536 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2537 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002538 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002539 com_addbyte(c, POP_BLOCK);
2540 block_pop(c, SETUP_FINALLY);
2541 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002542 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002543 /* While the generated code pushes only one item,
2544 the try-finally handling can enter here with
2545 up to three items. OK, here are the details:
2546 3 for an exception, 2 for RETURN, 1 for BREAK. */
2547 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002548 com_backpatch(c, finally_anchor);
2549 ch = CHILD(n, NCH(n)-1);
2550 com_addoparg(c, SET_LINENO, ch->n_lineno);
2551 com_node(c, ch);
2552 com_addbyte(c, END_FINALLY);
2553 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002554 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002555}
2556
2557static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002558com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002559{
2560 REQ(n, try_stmt);
2561 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2562 | 'try' ':' suite 'finally' ':' suite */
2563 if (TYPE(CHILD(n, 3)) != except_clause)
2564 com_try_finally(c, n);
2565 else
2566 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002567}
2568
Guido van Rossum8b993a91997-01-17 21:04:03 +00002569static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002570get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002571{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002572 int i;
2573
Guido van Rossum8b993a91997-01-17 21:04:03 +00002574 /* Label to avoid tail recursion */
2575 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002576 switch (TYPE(n)) {
2577
2578 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002579 if (NCH(n) == 1) {
2580 n = CHILD(n, 0);
2581 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002582 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002583 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002584 case file_input:
2585 for (i = 0; i < NCH(n); i++) {
2586 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002587 if (TYPE(ch) == stmt) {
2588 n = ch;
2589 goto next;
2590 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002591 }
2592 break;
2593
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002594 case stmt:
2595 case simple_stmt:
2596 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002597 n = CHILD(n, 0);
2598 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002599
2600 case expr_stmt:
2601 case testlist:
2602 case test:
2603 case and_test:
2604 case not_test:
2605 case comparison:
2606 case expr:
2607 case xor_expr:
2608 case and_expr:
2609 case shift_expr:
2610 case arith_expr:
2611 case term:
2612 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002613 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002614 if (NCH(n) == 1) {
2615 n = CHILD(n, 0);
2616 goto next;
2617 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002618 break;
2619
2620 case atom:
2621 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002622 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002623 break;
2624
2625 }
2626 return NULL;
2627}
2628
Guido van Rossum79f25d91997-04-29 20:08:16 +00002629static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002630get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002631{
Guido van Rossum541563e1999-01-28 15:08:09 +00002632 /* Don't generate doc-strings if run with -OO */
2633 if (Py_OptimizeFlag > 1)
2634 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002635 n = get_rawdocstring(n);
2636 if (n == NULL)
2637 return NULL;
2638 return parsestrplus(n);
2639}
2640
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002641static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002642com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002643{
2644 REQ(n, suite);
2645 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2646 if (NCH(n) == 1) {
2647 com_node(c, CHILD(n, 0));
2648 }
2649 else {
2650 int i;
2651 for (i = 0; i < NCH(n); i++) {
2652 node *ch = CHILD(n, i);
2653 if (TYPE(ch) == stmt)
2654 com_node(c, ch);
2655 }
2656 }
2657}
2658
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002659/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002660static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002661com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002662{
2663 int i = c->c_nblocks;
2664 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2665 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2666 }
2667 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002668 com_error(c, PyExc_SyntaxError,
2669 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002670 }
2671 /* XXX Could allow it inside a 'finally' clause
2672 XXX if we could pop the exception still on the stack */
2673}
2674
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002675static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002676com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002677{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002678 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002679 if (TYPE(n) == lambdef) {
2680 /* lambdef: 'lambda' [varargslist] ':' test */
2681 n = CHILD(n, 1);
2682 }
2683 else {
2684 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2685 n = CHILD(n, 2);
2686 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2687 n = CHILD(n, 1);
2688 }
2689 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002690 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002691 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002692 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002693 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2694 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002695 nargs = 0;
2696 ndefs = 0;
2697 for (i = 0; i < nch; i++) {
2698 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002699 if (TYPE(CHILD(n, i)) == STAR ||
2700 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002701 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002702 nargs++;
2703 i++;
2704 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002705 t = RPAR; /* Anything except EQUAL or COMMA */
2706 else
2707 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002708 if (t == EQUAL) {
2709 i++;
2710 ndefs++;
2711 com_node(c, CHILD(n, i));
2712 i++;
2713 if (i >= nch)
2714 break;
2715 t = TYPE(CHILD(n, i));
2716 }
2717 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00002718 /* Treat "(a=1, b)" as an error */
2719 if (ndefs)
2720 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00002721 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002722 }
2723 if (t != COMMA)
2724 break;
2725 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002726 return ndefs;
2727}
2728
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002729static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002730com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002731{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002732 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002733 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002734 v = (PyObject *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002735 if (v == NULL)
2736 c->c_errors++;
2737 else {
2738 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002739 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002740 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002741 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002742 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002743 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002744 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002745 com_pop(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002746 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002747 }
2748}
2749
2750static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002751com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002752{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002753 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002754 REQ(n, testlist);
2755 /* testlist: test (',' test)* [','] */
2756 for (i = 0; i < NCH(n); i += 2)
2757 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002758 i = (NCH(n)+1) / 2;
2759 com_addoparg(c, BUILD_TUPLE, i);
2760 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00002761}
2762
2763static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002764com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002765{
Guido van Rossum25831651993-05-19 14:50:45 +00002766 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002767 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002768 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002769 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00002770 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00002771 c->c_errors++;
2772 return;
2773 }
2774 /* Push the class name on the stack */
2775 i = com_addconst(c, v);
2776 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002777 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002778 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00002779 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002780 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00002781 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002782 com_push(c, 1);
2783 }
Guido van Rossum25831651993-05-19 14:50:45 +00002784 else
2785 com_bases(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002786 v = (PyObject *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002787 if (v == NULL)
2788 c->c_errors++;
2789 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002790 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002791 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002792 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002793 com_addoparg(c, MAKE_FUNCTION, 0);
2794 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002795 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002796 com_pop(c, 2);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002797 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002798 Py_DECREF(v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002799 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002800}
2801
2802static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002803com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002804{
2805 switch (TYPE(n)) {
2806
2807 /* Definition nodes */
2808
2809 case funcdef:
2810 com_funcdef(c, n);
2811 break;
2812 case classdef:
2813 com_classdef(c, n);
2814 break;
2815
2816 /* Trivial parse tree nodes */
2817
2818 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002819 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002820 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002821 com_node(c, CHILD(n, 0));
2822 break;
2823
2824 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002825 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2826 com_addoparg(c, SET_LINENO, n->n_lineno);
2827 {
2828 int i;
2829 for (i = 0; i < NCH(n)-1; i += 2)
2830 com_node(c, CHILD(n, i));
2831 }
2832 break;
2833
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002834 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002835 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002836 com_node(c, CHILD(n, 0));
2837 break;
2838
2839 /* Statement nodes */
2840
2841 case expr_stmt:
2842 com_expr_stmt(c, n);
2843 break;
2844 case print_stmt:
2845 com_print_stmt(c, n);
2846 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002847 case del_stmt: /* 'del' exprlist */
Guido van Rossum8861b741996-07-30 16:49:37 +00002848 com_assign(c, CHILD(n, 1), OP_DELETE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002849 break;
2850 case pass_stmt:
2851 break;
2852 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002853 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002854 com_error(c, PyExc_SyntaxError,
2855 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002856 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002857 com_addbyte(c, BREAK_LOOP);
2858 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002859 case continue_stmt:
2860 com_continue_stmt(c, n);
2861 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002862 case return_stmt:
2863 com_return_stmt(c, n);
2864 break;
2865 case raise_stmt:
2866 com_raise_stmt(c, n);
2867 break;
2868 case import_stmt:
2869 com_import_stmt(c, n);
2870 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002871 case global_stmt:
2872 com_global_stmt(c, n);
2873 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002874 case exec_stmt:
2875 com_exec_stmt(c, n);
2876 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002877 case assert_stmt:
2878 com_assert_stmt(c, n);
2879 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002880 case if_stmt:
2881 com_if_stmt(c, n);
2882 break;
2883 case while_stmt:
2884 com_while_stmt(c, n);
2885 break;
2886 case for_stmt:
2887 com_for_stmt(c, n);
2888 break;
2889 case try_stmt:
2890 com_try_stmt(c, n);
2891 break;
2892 case suite:
2893 com_suite(c, n);
2894 break;
2895
2896 /* Expression nodes */
2897
2898 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002899 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002900 break;
2901 case test:
2902 com_test(c, n);
2903 break;
2904 case and_test:
2905 com_and_test(c, n);
2906 break;
2907 case not_test:
2908 com_not_test(c, n);
2909 break;
2910 case comparison:
2911 com_comparison(c, n);
2912 break;
2913 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002914 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002915 break;
2916 case expr:
2917 com_expr(c, n);
2918 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002919 case xor_expr:
2920 com_xor_expr(c, n);
2921 break;
2922 case and_expr:
2923 com_and_expr(c, n);
2924 break;
2925 case shift_expr:
2926 com_shift_expr(c, n);
2927 break;
2928 case arith_expr:
2929 com_arith_expr(c, n);
2930 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002931 case term:
2932 com_term(c, n);
2933 break;
2934 case factor:
2935 com_factor(c, n);
2936 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00002937 case power:
2938 com_power(c, n);
2939 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002940 case atom:
2941 com_atom(c, n);
2942 break;
2943
2944 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002945 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002946 com_error(c, PyExc_SystemError,
2947 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002948 }
2949}
2950
Tim Petersdbd9ba62000-07-09 03:09:57 +00002951static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002952
2953static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002954com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002955{
2956 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
2957 if (TYPE(CHILD(n, 0)) == LPAR)
2958 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002959 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002960 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002961 com_pop(c, 1);
2962 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002963}
2964
2965static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002966com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002967{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00002968 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002969 if (NCH(n) == 1) {
2970 com_fpdef(c, CHILD(n, 0));
2971 }
2972 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002973 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002974 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002975 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002976 for (i = 0; i < NCH(n); i += 2)
2977 com_fpdef(c, CHILD(n, i));
2978 }
2979}
2980
2981static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002982com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002983{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002984 int nch, i;
2985 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00002986 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002987 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00002988 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002989 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002990 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002991 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002992 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002993 node *ch = CHILD(n, i);
2994 node *fp;
2995 char *name;
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00002996 PyObject *nameval;
Guido van Rossum50564e81996-01-12 01:13:16 +00002997 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002998 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002999 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3000 fp = CHILD(ch, 0);
3001 if (TYPE(fp) == NAME)
3002 name = STR(fp);
3003 else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003004 name = nbuf;
3005 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003006 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003007 }
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003008 nameval = PyString_InternFromString(name);
3009 if (nameval == NULL) {
3010 c->c_errors++;
3011 }
Peter Schneider-Kamp9a5086c2000-07-13 06:24:29 +00003012 if (PyDict_GetItem(c->c_locals, nameval)) {
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003013 com_error(c, PyExc_SyntaxError,"duplicate argument in function definition");
3014 }
3015 com_newlocal_o(c, nameval);
3016 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003017 c->c_argcount++;
3018 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003019 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003020 ch = CHILD(n, i);
3021 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003022 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003023 else
3024 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003025 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003026 /* Handle *arguments */
3027 if (i < nch) {
3028 node *ch;
3029 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003030 if (TYPE(ch) != DOUBLESTAR) {
3031 REQ(ch, STAR);
3032 ch = CHILD(n, i+1);
3033 if (TYPE(ch) == NAME) {
3034 c->c_flags |= CO_VARARGS;
3035 i += 3;
3036 com_newlocal(c, STR(ch));
3037 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003038 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003039 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003040 /* Handle **keywords */
3041 if (i < nch) {
3042 node *ch;
3043 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003044 if (TYPE(ch) != DOUBLESTAR) {
3045 REQ(ch, STAR);
3046 ch = CHILD(n, i+1);
3047 REQ(ch, STAR);
3048 ch = CHILD(n, i+2);
3049 }
3050 else
3051 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003052 REQ(ch, NAME);
3053 c->c_flags |= CO_VARKEYWORDS;
3054 com_newlocal(c, STR(ch));
3055 }
3056 if (complex) {
3057 /* Generate code for complex arguments only after
3058 having counted the simple arguments */
3059 int ilocal = 0;
3060 for (i = 0; i < nch; i++) {
3061 node *ch = CHILD(n, i);
3062 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003063 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003064 break;
3065 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3066 fp = CHILD(ch, 0);
3067 if (TYPE(fp) != NAME) {
3068 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003069 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003070 com_fpdef(c, ch);
3071 }
3072 ilocal++;
3073 if (++i >= nch)
3074 break;
3075 ch = CHILD(n, i);
3076 if (TYPE(ch) == EQUAL)
3077 i += 2;
3078 else
3079 REQ(ch, COMMA);
3080 }
3081 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003082}
3083
3084static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003085com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003086{
3087 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003088 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003089 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003090 doc = get_docstring(n);
3091 if (doc != NULL) {
3092 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003093 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003094 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003095 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003096 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003097 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003098 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003099 for (i = 0; i < NCH(n); i++) {
3100 node *ch = CHILD(n, i);
3101 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3102 com_node(c, ch);
3103 }
3104}
3105
3106/* Top-level compile-node interface */
3107
3108static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003109compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003110{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003111 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003112 node *ch;
3113 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003114 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003115 doc = get_docstring(CHILD(n, 4));
3116 if (doc != NULL) {
3117 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003118 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003119 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003120 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003121 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003122 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3123 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003124 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003125 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003126 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003127 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003128 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003129 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003130 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003131 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003132 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003133}
3134
3135static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003136compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003137{
Guido van Rossum590baa41993-11-30 13:40:46 +00003138 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003139 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003140 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003141
3142 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003143 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003144 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003145 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003146 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003147 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003148 else
3149 ch = CHILD(n, 2);
3150 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003151 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003152 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003153}
3154
3155static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003156compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003157{
3158 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003159 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003160 REQ(n, classdef);
3161 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3162 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003163#ifdef PRIVATE_NAME_MANGLING
3164 c->c_private = c->c_name;
3165#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003166 ch = CHILD(n, NCH(n)-1); /* The suite */
3167 doc = get_docstring(ch);
3168 if (doc != NULL) {
3169 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003170 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003171 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003172 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003173 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003174 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003175 }
3176 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003177 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003178 com_node(c, ch);
3179 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003180 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003181 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003182 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003183}
3184
3185static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003186compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003187{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003188 com_addoparg(c, SET_LINENO, n->n_lineno);
3189
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003190 switch (TYPE(n)) {
3191
Guido van Rossum4c417781991-01-21 16:09:22 +00003192 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003193 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003194 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003195 n = CHILD(n, 0);
3196 if (TYPE(n) != NEWLINE)
3197 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003198 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003199 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003200 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003201 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003202 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003203 break;
3204
Guido van Rossum4c417781991-01-21 16:09:22 +00003205 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003206 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003207 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003208 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003209 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003210 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003211 break;
3212
Guido van Rossum590baa41993-11-30 13:40:46 +00003213 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003214 com_node(c, CHILD(n, 0));
3215 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003216 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003217 break;
3218
Guido van Rossum590baa41993-11-30 13:40:46 +00003219 case lambdef: /* anonymous function definition */
3220 compile_lambdef(c, n);
3221 break;
3222
Guido van Rossum4c417781991-01-21 16:09:22 +00003223 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003224 compile_funcdef(c, n);
3225 break;
3226
Guido van Rossum4c417781991-01-21 16:09:22 +00003227 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003228 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003229 break;
3230
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003231 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003232 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003233 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003234 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003235 }
3236}
3237
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003238/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00003239
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003240 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
3241 instructions that refer to local variables with LOAD_FAST etc.
3242 The latter instructions are much faster because they don't need to
3243 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003244
Guido van Rossum681d79a1995-07-18 14:51:37 +00003245 To find all local variables, we check all STORE_NAME, IMPORT_FROM
3246 and DELETE_NAME instructions. This yields all local variables,
3247 function definitions, class definitions and import statements.
3248 Argument names have already been entered into the list by the
3249 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003250
3251 All remaining LOAD_NAME instructions must refer to non-local (global
3252 or builtin) variables, so are replaced by LOAD_GLOBAL.
3253
3254 There are two problems: 'from foo import *' and 'exec' may introduce
3255 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00003256 case, we can still optimize bona fide locals (since those
3257 statements will be surrounded by fast_2_locals() and
3258 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003259
Guido van Rossum681d79a1995-07-18 14:51:37 +00003260 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00003261
3262static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003263optimize(struct compiling *c)
Guido van Rossum282914b1991-04-04 10:42:56 +00003264{
Guido van Rossum0a697f61991-04-16 08:39:12 +00003265 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00003266 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00003267 int oparg = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003268 PyObject *name;
3269 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003270
Guido van Rossum282914b1991-04-04 10:42:56 +00003271#define NEXTOP() (*next_instr++)
3272#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossum79f25d91997-04-29 20:08:16 +00003273#define GETITEM(v, i) (PyList_GetItem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003274#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
3275
Guido van Rossum79f25d91997-04-29 20:08:16 +00003276 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003277
3278 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00003279
Guido van Rossum79f25d91997-04-29 20:08:16 +00003280 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003281 for (;;) {
3282 opcode = NEXTOP();
3283 if (opcode == STOP_CODE)
3284 break;
3285 if (HAS_ARG(opcode))
3286 oparg = NEXTARG();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003287 switch (opcode) {
3288 case STORE_NAME:
3289 case DELETE_NAME:
3290 case IMPORT_FROM:
3291 com_addlocal_o(c, GETNAMEOBJ(oparg));
3292 break;
3293 case EXEC_STMT:
3294 c->c_flags &= ~CO_OPTIMIZED;
3295 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00003296 }
3297 }
3298
Guido van Rossum79f25d91997-04-29 20:08:16 +00003299 if (PyDict_GetItemString(c->c_locals, "*") != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003300 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003301
Guido van Rossum79f25d91997-04-29 20:08:16 +00003302 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003303 for (;;) {
3304 cur_instr = next_instr;
3305 opcode = NEXTOP();
3306 if (opcode == STOP_CODE)
3307 break;
3308 if (HAS_ARG(opcode))
3309 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003310 if (opcode == LOAD_NAME ||
3311 opcode == STORE_NAME ||
3312 opcode == DELETE_NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003313 PyObject *v;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003314 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00003315 name = GETNAMEOBJ(oparg);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003316 v = PyDict_GetItem(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003317 if (v == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003318 if (opcode == LOAD_NAME &&
3319 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003320 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003321 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00003322 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003323 i = PyInt_AsLong(v);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003324 switch (opcode) {
3325 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
3326 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
3327 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
3328 }
3329 cur_instr[1] = i & 0xff;
3330 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00003331 }
3332 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003333
Guido van Rossum681d79a1995-07-18 14:51:37 +00003334 if (c->c_errors == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00003335 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00003336}
3337
Guido van Rossum79f25d91997-04-29 20:08:16 +00003338PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003339PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003340{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003341 return jcompile(n, filename, NULL);
3342}
3343
Guido van Rossum79f25d91997-04-29 20:08:16 +00003344static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003345icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003346{
3347 return jcompile(n, base->c_filename, base);
3348}
3349
Guido van Rossum79f25d91997-04-29 20:08:16 +00003350static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003351jcompile(node *n, char *filename, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003352{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003353 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003354 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003355 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003356 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003357#ifdef PRIVATE_NAME_MANGLING
3358 if (base)
3359 sc.c_private = base->c_private;
3360 else
3361 sc.c_private = NULL;
3362#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003363 compile_node(&sc, n);
3364 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003365 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003366 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003367 sc.c_flags |= CO_NEWLOCALS;
3368 }
3369 else if (TYPE(n) == classdef)
3370 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00003371 co = NULL;
3372 if (sc.c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003373 PyObject *consts, *names, *varnames, *filename, *name;
3374 consts = PyList_AsTuple(sc.c_consts);
3375 names = PyList_AsTuple(sc.c_names);
3376 varnames = PyList_AsTuple(sc.c_varnames);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003377 filename = PyString_InternFromString(sc.c_filename);
3378 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003379 if (!PyErr_Occurred())
3380 co = PyCode_New(sc.c_argcount,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003381 sc.c_nlocals,
Guido van Rossum8b993a91997-01-17 21:04:03 +00003382 sc.c_maxstacklevel,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003383 sc.c_flags,
3384 sc.c_code,
3385 consts,
3386 names,
3387 varnames,
3388 filename,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003389 name,
3390 sc.c_firstlineno,
3391 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003392 Py_XDECREF(consts);
3393 Py_XDECREF(names);
3394 Py_XDECREF(varnames);
3395 Py_XDECREF(filename);
3396 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003397 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003398 else if (!PyErr_Occurred()) {
3399 /* This could happen if someone called PyErr_Clear() after an
3400 error was reported above. That's not supposed to happen,
3401 but I just plugged one case and I'm not sure there can't be
3402 others. In that case, raise SystemError so that at least
3403 it gets reported instead dumping core. */
3404 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3405 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003406 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003407 return co;
3408}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003409
3410int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003411PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003412{
3413 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003414 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003415 int line = co->co_firstlineno;
3416 int addr = 0;
3417 while (--size >= 0) {
3418 addr += *p++;
3419 if (addr > addrq)
3420 break;
3421 line += *p++;
3422 }
3423 return line;
3424}