blob: 706564780d522a97247fe40f1c3762cc6325ad5c [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);
Fred Drakedcf08e02000-08-15 15:49:44 +0000307 PyObject *v, *tb, *tmp;
Guido van Rossum635abd21997-01-06 22:56:52 +0000308 c->c_errors++;
Guido van Rossum452a9831996-09-17 14:32:04 +0000309 if (c->c_lineno <= 1) {
310 /* Unknown line number or single interactive command */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000311 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000312 return;
313 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000314 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000315 if (v == NULL)
316 return; /* MemoryError, too bad */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000317 PyErr_SetObject(exc, v);
318 Py_DECREF(v);
Fred Drakedcf08e02000-08-15 15:49:44 +0000319
320 /* add attributes for the line number and filename for the error */
321 PyErr_Fetch(&exc, &v, &tb);
322 PyErr_NormalizeException(&exc, &v, &tb);
323 tmp = PyInt_FromLong(c->c_lineno);
324 if (tmp == NULL)
325 PyErr_Clear();
326 else {
327 if (PyObject_SetAttrString(v, "lineno", tmp))
328 PyErr_Clear();
329 Py_DECREF(tmp);
330 }
331 if (c->c_filename != NULL) {
332 tmp = PyString_FromString(c->c_filename);
333 if (tmp == NULL)
334 PyErr_Clear();
335 else {
336 if (PyObject_SetAttrString(v, "filename", tmp))
337 PyErr_Clear();
338 Py_DECREF(tmp);
339 }
340 }
341 PyErr_Restore(exc, v, tb);
Guido van Rossum452a9831996-09-17 14:32:04 +0000342}
343
344
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000345/* Interface to the block stack */
346
347static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000348block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000349{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000350 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000351 com_error(c, PyExc_SystemError,
352 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000353 }
354 else {
355 c->c_block[c->c_nblocks++] = type;
356 }
357}
358
359static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000360block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000361{
362 if (c->c_nblocks > 0)
363 c->c_nblocks--;
364 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000365 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000366 }
367}
368
369
Guido van Rossum681d79a1995-07-18 14:51:37 +0000370/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000371
Tim Petersdbd9ba62000-07-09 03:09:57 +0000372static int com_init(struct compiling *, char *);
373static void com_free(struct compiling *);
374static void com_push(struct compiling *, int);
375static void com_pop(struct compiling *, int);
376static void com_done(struct compiling *);
377static void com_node(struct compiling *, struct _node *);
378static void com_factor(struct compiling *, struct _node *);
379static void com_addbyte(struct compiling *, int);
380static void com_addint(struct compiling *, int);
381static void com_addoparg(struct compiling *, int, int);
382static void com_addfwref(struct compiling *, int, int *);
383static void com_backpatch(struct compiling *, int);
384static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
385static int com_addconst(struct compiling *, PyObject *);
386static int com_addname(struct compiling *, PyObject *);
387static void com_addopname(struct compiling *, int, node *);
388static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000389static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000390static int com_argdefs(struct compiling *, node *);
391static int com_newlocal(struct compiling *, char *);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000392static void com_assign(struct compiling *, node *, int);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000393static PyCodeObject *icompile(struct _node *, struct compiling *);
394static PyCodeObject *jcompile(struct _node *, char *,
395 struct compiling *);
396static PyObject *parsestrplus(node *);
397static PyObject *parsestr(char *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000398
399static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000400com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000401{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000402 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000403 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
404 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000405 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000406 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000407 goto fail;
408 if ((c->c_const_dict = PyDict_New()) == NULL)
409 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000410 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000411 goto fail;
412 if ((c->c_name_dict = PyDict_New()) == NULL)
413 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000414 if ((c->c_globals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000415 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000416 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000417 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000418 if ((c->c_varnames = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000419 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000420 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
421 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000422 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000423 c->c_nlocals = 0;
424 c->c_argcount = 0;
425 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000426 c->c_nexti = 0;
427 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000428 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000429 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000430 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000431 c->c_begin = 0;
432 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000433 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000434 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000435 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000436 c->c_stacklevel = 0;
437 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000438 c->c_firstlineno = 0;
439 c->c_last_addr = 0;
440 c->c_last_line = 0;
441 c-> c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000442 c->c_tmpname = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000443 return 1;
444
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000445 fail:
446 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000447 return 0;
448}
449
450static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000451com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000452{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000453 Py_XDECREF(c->c_code);
454 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000455 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000456 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000457 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000458 Py_XDECREF(c->c_globals);
459 Py_XDECREF(c->c_locals);
460 Py_XDECREF(c->c_varnames);
461 Py_XDECREF(c->c_lnotab);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000462}
463
464static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000465com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000466{
467 c->c_stacklevel += n;
468 if (c->c_stacklevel > c->c_maxstacklevel)
469 c->c_maxstacklevel = c->c_stacklevel;
470}
471
472static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000473com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000474{
475 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000476 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000477 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
478 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000479 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000480 c->c_stacklevel = 0;
481 }
482 else
483 c->c_stacklevel -= n;
484}
485
486static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000487com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000488{
489 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000490 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000491 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000492 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000493}
494
495static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000496com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000497{
498 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000499 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000500 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000501 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000502 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000503 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000504 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000505 com_error(c, PyExc_SystemError,
506 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000507 }
508 if (c->c_code == NULL)
509 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000510 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000511 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000512 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000513 c->c_errors++;
514 return;
515 }
516 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000517 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000518}
519
520static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000521com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000522{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000523 com_addbyte(c, x & 0xff);
524 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000525}
526
527static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000528com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000529{
530 int size;
531 char *p;
532 if (c->c_lnotab == NULL)
533 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000534 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000535 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000536 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000537 c->c_errors++;
538 return;
539 }
540 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000541 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000542 *p++ = addr;
543 *p++ = line;
544 c->c_lnotab_next += 2;
545}
546
547static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000548com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000549{
550 c->c_lineno = lineno;
551 if (c->c_firstlineno == 0) {
552 c->c_firstlineno = c->c_last_line = lineno;
553 }
554 else {
555 int incr_addr = c->c_nexti - c->c_last_addr;
556 int incr_line = lineno - c->c_last_line;
557 while (incr_addr > 0 || incr_line > 0) {
558 int trunc_addr = incr_addr;
559 int trunc_line = incr_line;
560 if (trunc_addr > 255)
561 trunc_addr = 255;
562 if (trunc_line > 255)
563 trunc_line = 255;
564 com_add_lnotab(c, trunc_addr, trunc_line);
565 incr_addr -= trunc_addr;
566 incr_line -= trunc_line;
567 }
568 c->c_last_addr = c->c_nexti;
569 c->c_last_line = lineno;
570 }
571}
572
573static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000574com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000575{
Guido van Rossum8e793d91997-03-03 19:13:14 +0000576 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000577 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000578 if (Py_OptimizeFlag)
579 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000580 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000581 com_addbyte(c, op);
582 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000583}
584
585static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000586com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000587{
588 /* Compile a forward reference for backpatching */
589 int here;
590 int anchor;
591 com_addbyte(c, op);
592 here = c->c_nexti;
593 anchor = *p_anchor;
594 *p_anchor = here;
595 com_addint(c, anchor == 0 ? 0 : here - anchor);
596}
597
598static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000599com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000600{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000601 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000602 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000603 int dist;
604 int prev;
605 for (;;) {
606 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000607 prev = code[anchor] + (code[anchor+1] << 8);
608 dist = target - (anchor+2);
609 code[anchor] = dist & 0xff;
610 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000611 if (!prev)
612 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000613 anchor -= prev;
614 }
615}
616
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000617/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000618
619static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000620com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000621{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000622 PyObject *w, *t, *np=NULL;
623 long n;
624
625 t = Py_BuildValue("(OO)", v, v->ob_type);
626 if (t == NULL)
627 goto fail;
628 w = PyDict_GetItem(dict, t);
629 if (w != NULL) {
630 n = PyInt_AsLong(w);
631 } else {
632 n = PyList_Size(list);
633 np = PyInt_FromLong(n);
634 if (np == NULL)
635 goto fail;
636 if (PyList_Append(list, v) != 0)
637 goto fail;
638 if (PyDict_SetItem(dict, t, np) != 0)
639 goto fail;
640 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000641 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000642 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000643 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000644 fail:
645 Py_XDECREF(np);
646 Py_XDECREF(t);
647 c->c_errors++;
648 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000649}
650
651static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000652com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000653{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000654 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000655}
656
657static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000658com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000659{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000660 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000661}
662
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000663#ifdef PRIVATE_NAME_MANGLING
664static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000665com_mangle(struct compiling *c, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000666{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000667 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000668 This is independent from how the name is used. */
669 char *p;
Guido van Rossum582acec2000-06-28 22:07:35 +0000670 size_t nlen, plen;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000671 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000672 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000673 return 0; /* Don't mangle __extremely_long_names */
674 if (name[nlen-1] == '_' && name[nlen-2] == '_')
675 return 0; /* Don't mangle __whatever__ */
676 p = c->c_private;
677 /* Strip leading underscores from class name */
678 while (*p == '_')
679 p++;
680 if (*p == '\0')
681 return 0; /* Don't mangle if class is just underscores */
682 plen = strlen(p);
683 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000684 plen = maxlen-nlen-2; /* Truncate class name if too long */
685 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000686 buffer[0] = '_';
687 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000688 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000689 /* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
690 return 1;
691}
692#endif
693
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000694static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000695com_addopnamestr(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000696{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000697 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000698 int i;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000699#ifdef PRIVATE_NAME_MANGLING
700 char buffer[256];
701 if (name != NULL && name[0] == '_' && name[1] == '_' &&
702 c->c_private != NULL &&
Guido van Rossum582acec2000-06-28 22:07:35 +0000703 com_mangle(c, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000704 name = buffer;
705#endif
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000706 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000707 c->c_errors++;
708 i = 255;
709 }
710 else {
711 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000712 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000713 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000714 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
715 switch (op) {
716 case LOAD_NAME:
717 case STORE_NAME:
718 case DELETE_NAME:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000719 if (PyDict_GetItemString(c->c_globals, name) != NULL) {
Guido van Rossumc5e96291991-12-10 13:53:51 +0000720 switch (op) {
721 case LOAD_NAME: op = LOAD_GLOBAL; break;
722 case STORE_NAME: op = STORE_GLOBAL; break;
723 case DELETE_NAME: op = DELETE_GLOBAL; break;
724 }
725 }
726 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000727 com_addoparg(c, op, i);
728}
729
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000730static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000731com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000732{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000733 char *name;
734 char buffer[1000];
735 /* XXX it is possible to write this code without the 1000
736 chars on the total length of dotted names, I just can't be
737 bothered right now */
738 if (TYPE(n) == STAR)
739 name = "*";
740 else if (TYPE(n) == dotted_name) {
741 char *p = buffer;
742 int i;
743 name = buffer;
744 for (i = 0; i < NCH(n); i += 2) {
745 char *s = STR(CHILD(n, i));
746 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000747 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000748 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +0000749 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000750 break;
751 }
752 if (p != buffer)
753 *p++ = '.';
754 strcpy(p, s);
755 p = strchr(p, '\0');
756 }
757 }
758 else {
759 REQ(n, NAME);
760 name = STR(n);
761 }
762 com_addopnamestr(c, op, name);
763}
764
Guido van Rossum79f25d91997-04-29 20:08:16 +0000765static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000766parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000767{
Tim Petersdbd9ba62000-07-09 03:09:57 +0000768 extern double atof(const char *);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000769 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000770 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000771 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +0000772#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +0000773 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +0000774 int imflag;
775#endif
776
Guido van Rossum282914b1991-04-04 10:42:56 +0000777 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000778 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +0000779#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +0000780 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +0000781#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000782 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000783 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000784 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000785 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000786 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000787 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000788 if (*end == '\0') {
789 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000790 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000791 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000792 return NULL;
793 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000794 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000795 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000796 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +0000797#ifndef WITHOUT_COMPLEX
798 if (imflag) {
799 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000800 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +0000801 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000802 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000803 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +0000804 }
Guido van Rossumac1fc951997-10-08 15:23:55 +0000805 else
Guido van Rossum50564e81996-01-12 01:13:16 +0000806#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +0000807 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000808 PyFPE_START_PROTECT("atof", return 0)
809 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000810 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000811 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000812 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000813}
814
Guido van Rossum79f25d91997-04-29 20:08:16 +0000815static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000816parsestr(char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000817{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000818 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +0000819 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000820 char *buf;
821 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000822 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000823 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +0000824 int first = *s;
825 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000826 int rawmode = 0;
827 int unicode = 0;
828 if (isalpha(quote) || quote == '_') {
829 if (quote == 'u' || quote == 'U') {
830 quote = *++s;
831 unicode = 1;
832 }
833 if (quote == 'r' || quote == 'R') {
834 quote = *++s;
835 rawmode = 1;
836 }
837 }
Guido van Rossum8054fad1993-10-26 15:19:44 +0000838 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000839 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000840 return NULL;
841 }
842 s++;
843 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +0000844 if (len > INT_MAX) {
845 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
846 return NULL;
847 }
Guido van Rossum8054fad1993-10-26 15:19:44 +0000848 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000849 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000850 return NULL;
851 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000852 if (len >= 4 && s[0] == quote && s[1] == quote) {
853 s += 2;
854 len -= 2;
855 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000856 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000857 return NULL;
858 }
859 }
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +0000860 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000861 if (rawmode)
862 return PyUnicode_DecodeRawUnicodeEscape(
863 s, len, NULL);
864 else
865 return PyUnicode_DecodeUnicodeEscape(
866 s, len, NULL);
867 }
868 else if (rawmode || strchr(s, '\\') == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000869 return PyString_FromStringAndSize(s, len);
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000870 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000871 v = PyString_FromStringAndSize((char *)NULL, len);
872 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000873 end = s + len;
874 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000875 if (*s != '\\') {
876 *p++ = *s++;
877 continue;
878 }
879 s++;
880 switch (*s++) {
881 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000882 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000883 case '\\': *p++ = '\\'; break;
884 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000885 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000886 case 'b': *p++ = '\b'; break;
887 case 'f': *p++ = '\014'; break; /* FF */
888 case 't': *p++ = '\t'; break;
889 case 'n': *p++ = '\n'; break;
890 case 'r': *p++ = '\r'; break;
891 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000892 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
893 case '0': case '1': case '2': case '3':
894 case '4': case '5': case '6': case '7':
895 c = s[-1] - '0';
896 if ('0' <= *s && *s <= '7') {
897 c = (c<<3) + *s++ - '0';
898 if ('0' <= *s && *s <= '7')
899 c = (c<<3) + *s++ - '0';
900 }
901 *p++ = c;
902 break;
903 case 'x':
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000904 if (isxdigit(Py_CHARMASK(*s))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000905 unsigned int x = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000906 do {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000907 c = Py_CHARMASK(*s);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000908 s++;
Guido van Rossumed1100f1997-10-20 23:24:07 +0000909 x = (x<<4) & ~0xF;
910 if (isdigit(c))
911 x += c - '0';
912 else if (islower(c))
913 x += 10 + c - 'a';
914 else
915 x += 10 + c - 'A';
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000916 } while (isxdigit(Py_CHARMASK(*s)));
Guido van Rossumed1100f1997-10-20 23:24:07 +0000917 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000918 break;
919 }
920 /* FALLTHROUGH */
921 default: *p++ = '\\'; *p++ = s[-1]; break;
922 }
923 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000924 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000925 return v;
926}
927
Guido van Rossum79f25d91997-04-29 20:08:16 +0000928static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000929parsestrplus(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000930{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000931 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000932 int i;
933 REQ(CHILD(n, 0), STRING);
934 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
935 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +0000936 for (i = 1; i < NCH(n); i++) {
937 PyObject *s;
938 s = parsestr(STR(CHILD(n, i)));
939 if (s == NULL)
940 goto onError;
941 if (PyString_Check(v) && PyString_Check(s)) {
942 PyString_ConcatAndDel(&v, s);
943 if (v == NULL)
944 goto onError;
945 }
946 else {
947 PyObject *temp;
948 temp = PyUnicode_Concat(v, s);
949 Py_DECREF(s);
950 if (temp == NULL)
951 goto onError;
952 Py_DECREF(v);
953 v = temp;
954 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000955 }
956 }
957 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +0000958
959 onError:
960 Py_XDECREF(v);
961 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000962}
963
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000964static void
Skip Montanaro803d6e52000-08-12 18:09:51 +0000965com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000966{
Skip Montanaro803d6e52000-08-12 18:09:51 +0000967 PyObject *v;
968 int anchor = 0;
969 int save_begin = c->c_begin;
970
971 /* list_iter: for v in expr [list_iter] */
972 com_node(c, CHILD(n, 3)); /* expr */
973 v = PyInt_FromLong(0L);
974 if (v == NULL)
975 c->c_errors++;
976 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
977 com_push(c, 1);
978 Py_XDECREF(v);
979 c->c_begin = c->c_nexti;
980 com_addoparg(c, SET_LINENO, n->n_lineno);
981 com_addfwref(c, FOR_LOOP, &anchor);
982 com_push(c, 1);
983 com_assign(c, CHILD(n, 1), OP_ASSIGN);
984 c->c_loops++;
985 com_list_iter(c, n, e, t);
986 c->c_loops--;
987 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
988 c->c_begin = save_begin;
989 com_backpatch(c, anchor);
990 com_pop(c, 2); /* FOR_LOOP has popped these */
991}
992
993static void
994com_list_if(struct compiling *c, node *n, node *e, char *t)
995{
996 int anchor = 0;
997 int a = 0;
998 /* list_iter: 'if' test [list_iter] */
999 com_addoparg(c, SET_LINENO, n->n_lineno);
1000 com_node(c, CHILD(n, 1));
1001 com_addfwref(c, JUMP_IF_FALSE, &a);
1002 com_addbyte(c, POP_TOP);
1003 com_pop(c, 1);
1004 com_list_iter(c, n, e, t);
1005 com_addfwref(c, JUMP_FORWARD, &anchor);
1006 com_backpatch(c, a);
1007 /* We jump here with an extra entry which we now pop */
1008 com_addbyte(c, POP_TOP);
1009 com_backpatch(c, anchor);
1010}
1011
1012static void
1013com_list_iter(struct compiling *c,
1014 node *p, /* parent of list_iter node */
1015 node *e, /* element expression node */
1016 char *t /* name of result list temp local */)
1017{
1018 /* list_iter is the last child in a listmaker, list_for, or list_if */
1019 node *n = CHILD(p, NCH(p)-1);
1020 if (TYPE(n) == list_iter) {
1021 n = CHILD(n, 0);
1022 switch (TYPE(n)) {
1023 case list_for:
1024 com_list_for(c, n, e, t);
1025 break;
1026 case list_if:
1027 com_list_if(c, n, e, t);
1028 break;
1029 default:
1030 com_error(c, PyExc_SystemError,
1031 "invalid list_iter node type");
1032 }
1033 }
1034 else {
1035 com_addopnamestr(c, LOAD_NAME, t);
1036 com_push(c, 1);
1037 com_node(c, e);
1038 com_addoparg(c, CALL_FUNCTION, 1);
1039 com_addbyte(c, POP_TOP);
1040 com_pop(c, 2);
1041 }
1042}
1043
1044static void
1045com_list_comprehension(struct compiling *c, node *n)
1046{
1047 /* listmaker: test list_iter */
1048 char tmpname[12];
1049 sprintf(tmpname, "__%d__", ++c->c_tmpname);
1050 com_addoparg(c, BUILD_LIST, 0);
1051 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1052 com_push(c, 2);
1053 com_addopnamestr(c, LOAD_ATTR, "append");
1054 com_addopnamestr(c, STORE_NAME, tmpname);
1055 com_pop(c, 1);
1056 com_list_iter(c, n, CHILD(n, 0), tmpname);
1057 com_addopnamestr(c, DELETE_NAME, tmpname);
1058 --c->c_tmpname;
1059}
1060
1061static void
1062com_listmaker(struct compiling *c, node *n)
1063{
1064 /* listmaker: test ( list_iter | (',' test)* [','] ) */
Thomas Wouters87df80d2000-08-13 17:05:17 +00001065 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_iter)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001066 com_list_comprehension(c, n);
1067 else {
1068 int len = 0;
1069 int i;
1070 for (i = 0; i < NCH(n); i += 2, len++)
1071 com_node(c, CHILD(n, i));
1072 com_addoparg(c, BUILD_LIST, len);
1073 com_pop(c, len-1);
1074 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001075}
1076
1077static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001078com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001079{
1080 int i;
1081 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1082 for (i = 0; i+2 < NCH(n); i += 4) {
1083 /* We must arrange things just right for STORE_SUBSCR.
1084 It wants the stack to look like (value) (dict) (key) */
1085 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001086 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001087 com_node(c, CHILD(n, i+2)); /* value */
1088 com_addbyte(c, ROT_TWO);
1089 com_node(c, CHILD(n, i)); /* key */
1090 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001091 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001092 }
1093}
1094
1095static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001096com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001097{
1098 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001099 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001100 int i;
1101 REQ(n, atom);
1102 ch = CHILD(n, 0);
1103 switch (TYPE(ch)) {
1104 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001105 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001106 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001107 com_push(c, 1);
1108 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001109 else
1110 com_node(c, CHILD(n, 1));
1111 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001112 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001113 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001114 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001115 com_push(c, 1);
1116 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001117 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001118 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001119 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001120 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001121 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001122 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001123 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001124 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001125 break;
1126 case BACKQUOTE:
1127 com_node(c, CHILD(n, 1));
1128 com_addbyte(c, UNARY_CONVERT);
1129 break;
1130 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001131 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001132 i = 255;
1133 }
1134 else {
1135 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001136 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001137 }
1138 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001139 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001140 break;
1141 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001142 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001143 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001144 c->c_errors++;
1145 i = 255;
1146 }
1147 else {
1148 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001149 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001150 }
1151 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001152 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001153 break;
1154 case NAME:
1155 com_addopname(c, LOAD_NAME, ch);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001156 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001157 break;
1158 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001159 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001160 com_error(c, PyExc_SystemError,
1161 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001162 }
1163}
1164
1165static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001166com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001167{
1168 if (NCH(n) == 1) {
1169 com_addbyte(c, op);
1170 }
1171 else if (NCH(n) == 2) {
1172 if (TYPE(CHILD(n, 0)) != COLON) {
1173 com_node(c, CHILD(n, 0));
1174 com_addbyte(c, op+1);
1175 }
1176 else {
1177 com_node(c, CHILD(n, 1));
1178 com_addbyte(c, op+2);
1179 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001180 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001181 }
1182 else {
1183 com_node(c, CHILD(n, 0));
1184 com_node(c, CHILD(n, 2));
1185 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001186 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001187 }
1188}
1189
Guido van Rossum635abd21997-01-06 22:56:52 +00001190static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001191com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001192{
1193 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001194 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001195 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001196 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001197 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001198 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001199 }
1200 else {
1201 com_node(c, CHILD(n, 0));
1202 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001203 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001204 }
1205 m = n;
1206 do {
1207 m = CHILD(m, 0);
1208 } while (NCH(m) == 1);
1209 if (TYPE(m) != NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001210 com_error(c, PyExc_SyntaxError,
1211 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001212 }
1213 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001214 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001215 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001216 *pkeywords = PyDict_New();
Guido van Rossum635abd21997-01-06 22:56:52 +00001217 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001218 c->c_errors++;
1219 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001220 if (PyDict_GetItem(*pkeywords, v) != NULL)
1221 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001222 "duplicate keyword argument");
1223 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001224 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001225 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001226 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001227 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001228 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001229 }
1230 }
1231 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001232}
1233
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001234static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001235com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001236{
1237 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001238 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001239 }
1240 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001241 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001242 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001243 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001244 int star_flag = 0;
1245 int starstar_flag = 0;
1246 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001247 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001248 na = 0;
1249 nk = 0;
1250 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001251 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001252 if (TYPE(ch) == STAR ||
1253 TYPE(ch) == DOUBLESTAR)
1254 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001255 if (ch->n_lineno != lineno) {
1256 lineno = ch->n_lineno;
1257 com_addoparg(c, SET_LINENO, lineno);
1258 }
1259 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001260 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001261 na++;
1262 else
1263 nk++;
1264 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001265 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001266 while (i < NCH(n)) {
1267 node *tok = CHILD(n, i);
1268 node *ch = CHILD(n, i+1);
1269 i += 3;
1270 switch (TYPE(tok)) {
1271 case STAR: star_flag = 1; break;
1272 case DOUBLESTAR: starstar_flag = 1; break;
1273 }
1274 com_node(c, ch);
1275 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001276 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001277 com_error(c, PyExc_SyntaxError,
1278 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001279 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001280 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001281 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001282 star_flag + (starstar_flag << 1);
1283 else
1284 opcode = CALL_FUNCTION;
1285 com_addoparg(c, opcode, na | (nk << 8));
1286 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001287 }
1288}
1289
1290static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001291com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001292{
1293 com_addopname(c, LOAD_ATTR, n);
1294}
1295
1296static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001297com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001298{
1299 int i=0;
1300 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001301 node *ch;
1302
1303 /* first argument */
1304 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001305 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001306 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001307 i++;
1308 }
1309 else {
1310 com_node(c, CHILD(n,i));
1311 i++;
1312 REQ(CHILD(n,i),COLON);
1313 i++;
1314 }
1315 /* second argument */
1316 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1317 com_node(c, CHILD(n,i));
1318 i++;
1319 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001320 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001321 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001322 com_push(c, 1);
1323 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001324 /* remaining arguments */
1325 for (; i < NCH(n); i++) {
1326 ns++;
1327 ch=CHILD(n,i);
1328 REQ(ch, sliceop);
1329 if (NCH(ch) == 1) {
1330 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001331 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001332 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001333 }
1334 else
1335 com_node(c, CHILD(ch,1));
1336 }
1337 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001338 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001339}
1340
1341static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001342com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001343{
1344 node *ch;
1345 REQ(n, subscript);
1346 ch = CHILD(n,0);
1347 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001348 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001349 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001350 com_push(c, 1);
1351 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001352 else {
1353 /* check for slice */
1354 if ((TYPE(ch) == COLON || NCH(n) > 1))
1355 com_sliceobj(c, n);
1356 else {
1357 REQ(ch, test);
1358 com_node(c, ch);
1359 }
1360 }
1361}
1362
1363static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001364com_subscriptlist(struct compiling *c, node *n, int assigning)
Guido van Rossum8861b741996-07-30 16:49:37 +00001365{
1366 int i, op;
1367 REQ(n, subscriptlist);
1368 /* Check to make backward compatible slice behavior for '[i:j]' */
1369 if (NCH(n) == 1) {
1370 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001371 /* 'Basic' slice, should have exactly one colon. */
1372 if ((TYPE(CHILD(sub, 0)) == COLON
1373 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1374 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1375 {
Guido van Rossum8861b741996-07-30 16:49:37 +00001376 if (assigning == OP_APPLY)
1377 op = SLICE;
1378 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001379 op = ((assigning == OP_ASSIGN) ?
1380 STORE_SLICE : DELETE_SLICE);
Guido van Rossum8861b741996-07-30 16:49:37 +00001381 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001382 if (op == STORE_SLICE)
1383 com_pop(c, 2);
1384 else if (op == DELETE_SLICE)
1385 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001386 return;
1387 }
1388 }
1389 /* Else normal subscriptlist. Compile each subscript. */
1390 for (i = 0; i < NCH(n); i += 2)
1391 com_subscript(c, CHILD(n, i));
1392 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001393 if (NCH(n) > 1) {
1394 i = (NCH(n)+1) / 2;
1395 com_addoparg(c, BUILD_TUPLE, i);
1396 com_pop(c, i-1);
1397 }
1398 if (assigning == OP_APPLY) {
Guido van Rossum8861b741996-07-30 16:49:37 +00001399 op = BINARY_SUBSCR;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001400 i = 1;
1401 }
1402 else if (assigning == OP_ASSIGN) {
1403 op = STORE_SUBSCR;
1404 i = 3;
1405 }
1406 else {
1407 op = DELETE_SUBSCR;
1408 i = 2;
1409 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001410 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001411 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001412}
1413
1414static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001415com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001416{
1417 REQ(n, trailer);
1418 switch (TYPE(CHILD(n, 0))) {
1419 case LPAR:
1420 com_call_function(c, CHILD(n, 1));
1421 break;
1422 case DOT:
1423 com_select_member(c, CHILD(n, 1));
1424 break;
1425 case LSQB:
Guido van Rossum8861b741996-07-30 16:49:37 +00001426 com_subscriptlist(c, CHILD(n, 1), OP_APPLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001427 break;
1428 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001429 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001430 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001431 }
1432}
1433
1434static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001435com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001436{
1437 int i;
1438 REQ(n, power);
1439 com_atom(c, CHILD(n, 0));
1440 for (i = 1; i < NCH(n); i++) {
1441 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1442 com_factor(c, CHILD(n, i+1));
1443 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001444 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001445 break;
1446 }
1447 else
1448 com_apply_trailer(c, CHILD(n, i));
1449 }
1450}
1451
1452static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001453com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001454{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001455 REQ(n, factor);
1456 if (TYPE(CHILD(n, 0)) == PLUS) {
1457 com_factor(c, CHILD(n, 1));
1458 com_addbyte(c, UNARY_POSITIVE);
1459 }
1460 else if (TYPE(CHILD(n, 0)) == MINUS) {
1461 com_factor(c, CHILD(n, 1));
1462 com_addbyte(c, UNARY_NEGATIVE);
1463 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001464 else if (TYPE(CHILD(n, 0)) == TILDE) {
1465 com_factor(c, CHILD(n, 1));
1466 com_addbyte(c, UNARY_INVERT);
1467 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001468 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001469 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001470 }
1471}
1472
1473static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001474com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001475{
1476 int i;
1477 int op;
1478 REQ(n, term);
1479 com_factor(c, CHILD(n, 0));
1480 for (i = 2; i < NCH(n); i += 2) {
1481 com_factor(c, CHILD(n, i));
1482 switch (TYPE(CHILD(n, i-1))) {
1483 case STAR:
1484 op = BINARY_MULTIPLY;
1485 break;
1486 case SLASH:
1487 op = BINARY_DIVIDE;
1488 break;
1489 case PERCENT:
1490 op = BINARY_MODULO;
1491 break;
1492 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001493 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001494 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001495 op = 255;
1496 }
1497 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001498 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001499 }
1500}
1501
1502static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001503com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001504{
1505 int i;
1506 int op;
1507 REQ(n, arith_expr);
1508 com_term(c, CHILD(n, 0));
1509 for (i = 2; i < NCH(n); i += 2) {
1510 com_term(c, CHILD(n, i));
1511 switch (TYPE(CHILD(n, i-1))) {
1512 case PLUS:
1513 op = BINARY_ADD;
1514 break;
1515 case MINUS:
1516 op = BINARY_SUBTRACT;
1517 break;
1518 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001519 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001520 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001521 op = 255;
1522 }
1523 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001524 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001525 }
1526}
1527
1528static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001529com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001530{
1531 int i;
1532 int op;
1533 REQ(n, shift_expr);
1534 com_arith_expr(c, CHILD(n, 0));
1535 for (i = 2; i < NCH(n); i += 2) {
1536 com_arith_expr(c, CHILD(n, i));
1537 switch (TYPE(CHILD(n, i-1))) {
1538 case LEFTSHIFT:
1539 op = BINARY_LSHIFT;
1540 break;
1541 case RIGHTSHIFT:
1542 op = BINARY_RSHIFT;
1543 break;
1544 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001545 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001546 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001547 op = 255;
1548 }
1549 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001550 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001551 }
1552}
1553
1554static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001555com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001556{
1557 int i;
1558 int op;
1559 REQ(n, and_expr);
1560 com_shift_expr(c, CHILD(n, 0));
1561 for (i = 2; i < NCH(n); i += 2) {
1562 com_shift_expr(c, CHILD(n, i));
1563 if (TYPE(CHILD(n, i-1)) == AMPER) {
1564 op = BINARY_AND;
1565 }
1566 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001567 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001568 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001569 op = 255;
1570 }
1571 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001572 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001573 }
1574}
1575
1576static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001577com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001578{
1579 int i;
1580 int op;
1581 REQ(n, xor_expr);
1582 com_and_expr(c, CHILD(n, 0));
1583 for (i = 2; i < NCH(n); i += 2) {
1584 com_and_expr(c, CHILD(n, i));
1585 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1586 op = BINARY_XOR;
1587 }
1588 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001589 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001590 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001591 op = 255;
1592 }
1593 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001594 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001595 }
1596}
1597
1598static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001599com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001600{
1601 int i;
1602 int op;
1603 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001604 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001605 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001606 com_xor_expr(c, CHILD(n, i));
1607 if (TYPE(CHILD(n, i-1)) == VBAR) {
1608 op = BINARY_OR;
1609 }
1610 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001611 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001612 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001613 op = 255;
1614 }
1615 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001616 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001617 }
1618}
1619
1620static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001621cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001622{
1623 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001624 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001625 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1626 if (NCH(n) == 1) {
1627 n = CHILD(n, 0);
1628 switch (TYPE(n)) {
1629 case LESS: return LT;
1630 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001631 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001632 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001633 case LESSEQUAL: return LE;
1634 case GREATEREQUAL: return GE;
1635 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001636 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1637 if (strcmp(STR(n), "is") == 0) return IS;
1638 }
1639 }
1640 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001641 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001642 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1643 return NOT_IN;
1644 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1645 return IS_NOT;
1646 }
1647 }
1648 return BAD;
1649}
1650
1651static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001652com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001653{
1654 int i;
1655 enum cmp_op op;
1656 int anchor;
1657 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1658 com_expr(c, CHILD(n, 0));
1659 if (NCH(n) == 1)
1660 return;
1661
1662 /****************************************************************
1663 The following code is generated for all but the last
1664 comparison in a chain:
1665
1666 label: on stack: opcode: jump to:
1667
1668 a <code to load b>
1669 a, b DUP_TOP
1670 a, b, b ROT_THREE
1671 b, a, b COMPARE_OP
1672 b, 0-or-1 JUMP_IF_FALSE L1
1673 b, 1 POP_TOP
1674 b
1675
1676 We are now ready to repeat this sequence for the next
1677 comparison in the chain.
1678
1679 For the last we generate:
1680
1681 b <code to load c>
1682 b, c COMPARE_OP
1683 0-or-1
1684
1685 If there were any jumps to L1 (i.e., there was more than one
1686 comparison), we generate:
1687
1688 0-or-1 JUMP_FORWARD L2
1689 L1: b, 0 ROT_TWO
1690 0, b POP_TOP
1691 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00001692 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001693 ****************************************************************/
1694
1695 anchor = 0;
1696
1697 for (i = 2; i < NCH(n); i += 2) {
1698 com_expr(c, CHILD(n, i));
1699 if (i+2 < NCH(n)) {
1700 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001701 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001702 com_addbyte(c, ROT_THREE);
1703 }
1704 op = cmp_type(CHILD(n, i-1));
1705 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001706 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001707 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001708 }
1709 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001710 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001711 if (i+2 < NCH(n)) {
1712 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1713 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001714 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001715 }
1716 }
1717
1718 if (anchor) {
1719 int anchor2 = 0;
1720 com_addfwref(c, JUMP_FORWARD, &anchor2);
1721 com_backpatch(c, anchor);
1722 com_addbyte(c, ROT_TWO);
1723 com_addbyte(c, POP_TOP);
1724 com_backpatch(c, anchor2);
1725 }
1726}
1727
1728static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001729com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001730{
1731 REQ(n, not_test); /* 'not' not_test | comparison */
1732 if (NCH(n) == 1) {
1733 com_comparison(c, CHILD(n, 0));
1734 }
1735 else {
1736 com_not_test(c, CHILD(n, 1));
1737 com_addbyte(c, UNARY_NOT);
1738 }
1739}
1740
1741static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001742com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001743{
1744 int i;
1745 int anchor;
1746 REQ(n, and_test); /* not_test ('and' not_test)* */
1747 anchor = 0;
1748 i = 0;
1749 for (;;) {
1750 com_not_test(c, CHILD(n, i));
1751 if ((i += 2) >= NCH(n))
1752 break;
1753 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1754 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001755 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001756 }
1757 if (anchor)
1758 com_backpatch(c, anchor);
1759}
1760
1761static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001762com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001763{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001764 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00001765 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001766 PyObject *v;
Guido van Rossum57531fe1993-11-30 14:57:42 +00001767 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001768 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001769 v = (PyObject *) icompile(CHILD(n, 0), c);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001770 if (v == NULL) {
1771 c->c_errors++;
1772 i = 255;
1773 }
1774 else {
1775 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001776 Py_DECREF(v);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001777 }
1778 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001779 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001780 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001781 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001782 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001783 else {
1784 int anchor = 0;
1785 int i = 0;
1786 for (;;) {
1787 com_and_test(c, CHILD(n, i));
1788 if ((i += 2) >= NCH(n))
1789 break;
1790 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1791 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001792 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001793 }
1794 if (anchor)
1795 com_backpatch(c, anchor);
1796 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001797}
1798
1799static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001800com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001801{
1802 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001803 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001804 com_node(c, CHILD(n, 0));
1805 }
1806 else {
1807 int i;
1808 int len;
1809 len = (NCH(n) + 1) / 2;
1810 for (i = 0; i < NCH(n); i += 2)
1811 com_node(c, CHILD(n, i));
1812 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001813 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001814 }
1815}
1816
1817
1818/* Begin of assignment compilation */
1819
Tim Petersdbd9ba62000-07-09 03:09:57 +00001820static void com_assign_name(struct compiling *, node *, int);
1821static void com_assign(struct compiling *, node *, int);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001822
1823static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001824com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001825{
1826 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001827 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001828}
1829
1830static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001831com_assign_trailer(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001832{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001833 REQ(n, trailer);
1834 switch (TYPE(CHILD(n, 0))) {
1835 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001836 com_error(c, PyExc_SyntaxError,
1837 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001838 break;
1839 case DOT: /* '.' NAME */
1840 com_assign_attr(c, CHILD(n, 1), assigning);
1841 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001842 case LSQB: /* '[' subscriptlist ']' */
1843 com_subscriptlist(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001844 break;
1845 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001846 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001847 }
1848}
1849
1850static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001851com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001852{
1853 int i;
1854 if (TYPE(n) != testlist)
1855 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001856 if (assigning) {
1857 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001858 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001859 com_push(c, i-1);
1860 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001861 for (i = 0; i < NCH(n); i += 2)
1862 com_assign(c, CHILD(n, i), assigning);
1863}
1864
1865static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001866com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001867{
1868 REQ(n, NAME);
1869 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001870 if (assigning)
1871 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001872}
1873
1874static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001875com_assign(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001876{
1877 /* Loop to avoid trivial recursion */
1878 for (;;) {
1879 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001880
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001881 case exprlist:
1882 case testlist:
1883 if (NCH(n) > 1) {
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001884 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001885 return;
1886 }
1887 n = CHILD(n, 0);
1888 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001889
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001890 case test:
1891 case and_test:
1892 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001893 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001894 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001895 case xor_expr:
1896 case and_expr:
1897 case shift_expr:
1898 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001899 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00001900 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001901 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001902 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001903 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001904 return;
1905 }
1906 n = CHILD(n, 0);
1907 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001908
Guido van Rossum50564e81996-01-12 01:13:16 +00001909 case power: /* atom trailer* ('**' power)* */
1910/* ('+'|'-'|'~') factor | atom trailer* */
1911 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001912 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001913 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001914 return;
1915 }
Guido van Rossum50564e81996-01-12 01:13:16 +00001916 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001917 int i;
1918 com_node(c, CHILD(n, 0));
1919 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00001920 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001921 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001922 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00001923 return;
1924 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001925 com_apply_trailer(c, CHILD(n, i));
1926 } /* NB i is still alive */
1927 com_assign_trailer(c,
1928 CHILD(n, i), assigning);
1929 return;
1930 }
1931 n = CHILD(n, 0);
1932 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001933
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001934 case atom:
1935 switch (TYPE(CHILD(n, 0))) {
1936 case LPAR:
1937 n = CHILD(n, 1);
1938 if (TYPE(n) == RPAR) {
1939 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001940 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001941 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001942 return;
1943 }
1944 break;
1945 case LSQB:
1946 n = CHILD(n, 1);
1947 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001948 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001949 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001950 return;
1951 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001952 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001953 return;
1954 case NAME:
1955 com_assign_name(c, CHILD(n, 0), assigning);
1956 return;
1957 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001958 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001959 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001960 return;
1961 }
1962 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001963
1964 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001965 com_error(c, PyExc_SyntaxError,
1966 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001967 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001968
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001969 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001970 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001971 com_error(c, PyExc_SystemError,
1972 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001973 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001974
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001975 }
1976 }
1977}
Guido van Rossum7c531111997-03-11 18:42:21 +00001978
Tim Petersdbd9ba62000-07-09 03:09:57 +00001979/* Forward */ static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001980
1981static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001982com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001983{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001984 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001985 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001986 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001987 return;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001988 com_node(c, CHILD(n, NCH(n)-1));
1989 if (NCH(n) == 1) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001990 if (c->c_interactive)
1991 com_addbyte(c, PRINT_EXPR);
1992 else
1993 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001994 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001995 }
1996 else {
1997 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001998 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001999 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002000 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002001 com_push(c, 1);
2002 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002003 com_assign(c, CHILD(n, i), OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002004 }
2005 }
2006}
2007
2008static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002009com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002010{
2011 int a = 0, b = 0;
2012 int i;
2013 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2014 /* Generate code like for
2015
2016 if __debug__:
2017 if not <test>:
2018 raise AssertionError [, <message>]
2019
2020 where <message> is the second test, if present.
2021 */
2022 if (Py_OptimizeFlag)
2023 return;
2024 com_addopnamestr(c, LOAD_GLOBAL, "__debug__");
2025 com_push(c, 1);
2026 com_addfwref(c, JUMP_IF_FALSE, &a);
2027 com_addbyte(c, POP_TOP);
2028 com_pop(c, 1);
2029 com_node(c, CHILD(n, 1));
2030 com_addfwref(c, JUMP_IF_TRUE, &b);
2031 com_addbyte(c, POP_TOP);
2032 com_pop(c, 1);
2033 /* Raise that exception! */
2034 com_addopnamestr(c, LOAD_GLOBAL, "AssertionError");
2035 com_push(c, 1);
2036 i = NCH(n)/2; /* Either 2 or 4 */
2037 if (i > 1)
2038 com_node(c, CHILD(n, 3));
2039 com_addoparg(c, RAISE_VARARGS, i);
2040 com_pop(c, i);
2041 /* The interpreter does not fall through */
2042 /* All jumps converge here */
2043 com_backpatch(c, a);
2044 com_backpatch(c, b);
2045 com_addbyte(c, POP_TOP);
2046}
2047
2048static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002049com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002050{
2051 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002052 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
2053 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002054 com_node(c, CHILD(n, i));
2055 com_addbyte(c, PRINT_ITEM);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002056 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002057 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002058 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002059 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002060 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002061}
2062
2063static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002064com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002065{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002066 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002067 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002068 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002069 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002070 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002071 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002072 com_push(c, 1);
2073 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002074 else
2075 com_node(c, CHILD(n, 1));
2076 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002077 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002078}
2079
2080static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002081com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002082{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002083 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002084 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2085 if (NCH(n) > 1) {
2086 com_node(c, CHILD(n, 1));
2087 if (NCH(n) > 3) {
2088 com_node(c, CHILD(n, 3));
2089 if (NCH(n) > 5)
2090 com_node(c, CHILD(n, 5));
2091 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002092 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002093 i = NCH(n)/2;
2094 com_addoparg(c, RAISE_VARARGS, i);
2095 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002096}
2097
2098static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002099com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002100{
2101 int i;
2102 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002103 /* 'import' dotted_name (',' dotted_name)* |
2104 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002105 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002106 /* 'from' dotted_name 'import' ... */
2107 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002108 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002109 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002110 for (i = 3; i < NCH(n); i += 2)
2111 com_addopname(c, IMPORT_FROM, CHILD(n, i));
2112 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002113 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002114 }
2115 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002116 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002117 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002118 REQ(CHILD(n, i), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002119 com_addopname(c, IMPORT_NAME, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002120 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002121 com_addopname(c, STORE_NAME, CHILD(CHILD(n, i), 0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002122 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002123 }
2124 }
2125}
2126
2127static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002128com_global_stmt(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002129{
2130 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002131 REQ(n, global_stmt);
2132 /* 'global' NAME (',' NAME)* */
2133 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002134 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002135#ifdef PRIVATE_NAME_MANGLING
2136 char buffer[256];
2137 if (s != NULL && s[0] == '_' && s[1] == '_' &&
2138 c->c_private != NULL &&
Guido van Rossum582acec2000-06-28 22:07:35 +00002139 com_mangle(c, s, buffer, sizeof(buffer)))
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002140 s = buffer;
2141#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +00002142 if (PyDict_GetItemString(c->c_locals, s) != NULL) {
2143 com_error(c, PyExc_SyntaxError,
2144 "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002145 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002146 else if (PyDict_SetItemString(c->c_globals, s, Py_None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002147 c->c_errors++;
2148 }
2149}
2150
Guido van Rossum681d79a1995-07-18 14:51:37 +00002151static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002152com_newlocal_o(struct compiling *c, PyObject *nameval)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002153{
2154 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002155 PyObject *ival;
2156 if (PyList_Size(c->c_varnames) != c->c_nlocals) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002157 /* This is usually caused by an error on a previous call */
2158 if (c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002159 com_error(c, PyExc_SystemError,
2160 "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002161 }
2162 return 0;
2163 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002164 ival = PyInt_FromLong(i = c->c_nlocals++);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002165 if (ival == NULL)
2166 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002167 else if (PyDict_SetItem(c->c_locals, nameval, ival) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002168 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002169 else if (PyList_Append(c->c_varnames, nameval) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002170 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002171 Py_XDECREF(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002172 return i;
2173}
2174
2175static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002176com_addlocal_o(struct compiling *c, PyObject *nameval)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002177{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002178 PyObject *ival = PyDict_GetItem(c->c_locals, nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002179 if (ival != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002180 return PyInt_AsLong(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002181 return com_newlocal_o(c, nameval);
2182}
2183
2184static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002185com_newlocal(struct compiling *c, char *name)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002186{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002187 PyObject *nameval = PyString_InternFromString(name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002188 int i;
2189 if (nameval == NULL) {
2190 c->c_errors++;
2191 return 0;
2192 }
2193 i = com_newlocal_o(c, nameval);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002194 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002195 return i;
2196}
2197
Guido van Rossumc5e96291991-12-10 13:53:51 +00002198static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002199com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002200{
2201 REQ(n, exec_stmt);
2202 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2203 com_node(c, CHILD(n, 1));
2204 if (NCH(n) >= 4)
2205 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002206 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002207 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002208 com_push(c, 1);
2209 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002210 if (NCH(n) >= 6)
2211 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002212 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002213 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002214 com_push(c, 1);
2215 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002216 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002217 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002218}
2219
Guido van Rossum7c531111997-03-11 18:42:21 +00002220static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002221is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002222{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002223 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002224 int i;
2225
2226 /* Label to avoid tail recursion */
2227 next:
2228 switch (TYPE(n)) {
2229
2230 case suite:
2231 if (NCH(n) == 1) {
2232 n = CHILD(n, 0);
2233 goto next;
2234 }
2235 /* Fall through */
2236 case file_input:
2237 for (i = 0; i < NCH(n); i++) {
2238 node *ch = CHILD(n, i);
2239 if (TYPE(ch) == stmt) {
2240 n = ch;
2241 goto next;
2242 }
2243 }
2244 break;
2245
2246 case stmt:
2247 case simple_stmt:
2248 case small_stmt:
2249 n = CHILD(n, 0);
2250 goto next;
2251
2252 case expr_stmt:
2253 case testlist:
2254 case test:
2255 case and_test:
2256 case not_test:
2257 case comparison:
2258 case expr:
2259 case xor_expr:
2260 case and_expr:
2261 case shift_expr:
2262 case arith_expr:
2263 case term:
2264 case factor:
2265 case power:
2266 case atom:
2267 if (NCH(n) == 1) {
2268 n = CHILD(n, 0);
2269 goto next;
2270 }
2271 break;
2272
2273 case NAME:
2274 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2275 return 1;
2276 break;
2277
2278 case NUMBER:
2279 v = parsenumber(c, STR(n));
2280 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002281 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002282 break;
2283 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002284 i = PyObject_IsTrue(v);
2285 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002286 return i == 0;
2287
2288 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002289 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002290 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002291 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002292 break;
2293 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002294 i = PyObject_IsTrue(v);
2295 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002296 return i == 0;
2297
2298 }
2299 return 0;
2300}
2301
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002302static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002303com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002304{
2305 int i;
2306 int anchor = 0;
2307 REQ(n, if_stmt);
2308 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2309 for (i = 0; i+3 < NCH(n); i+=4) {
2310 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002311 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002312 if (is_constant_false(c, ch))
2313 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002314 if (i > 0)
2315 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002316 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002317 com_addfwref(c, JUMP_IF_FALSE, &a);
2318 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002319 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002320 com_node(c, CHILD(n, i+3));
2321 com_addfwref(c, JUMP_FORWARD, &anchor);
2322 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002323 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002324 com_addbyte(c, POP_TOP);
2325 }
2326 if (i+2 < NCH(n))
2327 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002328 if (anchor)
2329 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002330}
2331
2332static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002333com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002334{
2335 int break_anchor = 0;
2336 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002337 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002338 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2339 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002340 block_push(c, SETUP_LOOP);
2341 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002342 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002343 com_node(c, CHILD(n, 1));
2344 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2345 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002346 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002347 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002348 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002349 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002350 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2351 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002352 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002353 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002354 com_addbyte(c, POP_TOP);
2355 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002356 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002357 if (NCH(n) > 4)
2358 com_node(c, CHILD(n, 6));
2359 com_backpatch(c, break_anchor);
2360}
2361
2362static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002363com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002364{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002365 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002366 int break_anchor = 0;
2367 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002368 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002369 REQ(n, for_stmt);
2370 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2371 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002372 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002373 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002374 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002375 if (v == NULL)
2376 c->c_errors++;
2377 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002378 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002379 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002380 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002381 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002382 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002383 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002384 com_assign(c, CHILD(n, 1), OP_ASSIGN);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002385 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002386 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002387 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002388 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2389 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002390 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002391 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002392 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002393 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002394 if (NCH(n) > 8)
2395 com_node(c, CHILD(n, 8));
2396 com_backpatch(c, break_anchor);
2397}
2398
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002399/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002400
2401 SETUP_FINALLY L
2402 <code for S>
2403 POP_BLOCK
2404 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002405 L: <code for Sf>
2406 END_FINALLY
2407
2408 The special instructions use the block stack. Each block
2409 stack entry contains the instruction that created it (here
2410 SETUP_FINALLY), the level of the value stack at the time the
2411 block stack entry was created, and a label (here L).
2412
2413 SETUP_FINALLY:
2414 Pushes the current value stack level and the label
2415 onto the block stack.
2416 POP_BLOCK:
2417 Pops en entry from the block stack, and pops the value
2418 stack until its level is the same as indicated on the
2419 block stack. (The label is ignored.)
2420 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002421 Pops a variable number of entries from the *value* stack
2422 and re-raises the exception they specify. The number of
2423 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002424
2425 The block stack is unwound when an exception is raised:
2426 when a SETUP_FINALLY entry is found, the exception is pushed
2427 onto the value stack (and the exception condition is cleared),
2428 and the interpreter jumps to the label gotten from the block
2429 stack.
2430
2431 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002432 (The contents of the value stack is shown in [], with the top
2433 at the right; 'tb' is trace-back info, 'val' the exception's
2434 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002435
2436 Value stack Label Instruction Argument
2437 [] SETUP_EXCEPT L1
2438 [] <code for S>
2439 [] POP_BLOCK
2440 [] JUMP_FORWARD L0
2441
Guido van Rossum3f5da241990-12-20 15:06:42 +00002442 [tb, val, exc] L1: DUP )
2443 [tb, val, exc, exc] <evaluate E1> )
2444 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2445 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2446 [tb, val, exc, 1] POP )
2447 [tb, val, exc] POP
2448 [tb, val] <assign to V1> (or POP if no V1)
2449 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002450 [] <code for S1>
2451 JUMP_FORWARD L0
2452
Guido van Rossum3f5da241990-12-20 15:06:42 +00002453 [tb, val, exc, 0] L2: POP
2454 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002455 .............................etc.......................
2456
Guido van Rossum3f5da241990-12-20 15:06:42 +00002457 [tb, val, exc, 0] Ln+1: POP
2458 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002459
2460 [] L0: <next statement>
2461
2462 Of course, parts are not generated if Vi or Ei is not present.
2463*/
2464
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002465static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002466com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002467{
2468 int except_anchor = 0;
2469 int end_anchor = 0;
2470 int else_anchor = 0;
2471 int i;
2472 node *ch;
2473
2474 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2475 block_push(c, SETUP_EXCEPT);
2476 com_node(c, CHILD(n, 2));
2477 com_addbyte(c, POP_BLOCK);
2478 block_pop(c, SETUP_EXCEPT);
2479 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2480 com_backpatch(c, except_anchor);
2481 for (i = 3;
2482 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2483 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002484 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002485 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002486 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002487 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002488 break;
2489 }
2490 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002491 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002492 com_addoparg(c, SET_LINENO, ch->n_lineno);
2493 if (NCH(ch) > 1) {
2494 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002495 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002496 com_node(c, CHILD(ch, 1));
2497 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002498 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002499 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2500 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002501 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002502 }
2503 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002504 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002505 if (NCH(ch) > 3)
Guido van Rossum8861b741996-07-30 16:49:37 +00002506 com_assign(c, CHILD(ch, 3), OP_ASSIGN);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002507 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002508 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002509 com_pop(c, 1);
2510 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002511 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002512 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002513 com_node(c, CHILD(n, i+2));
2514 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2515 if (except_anchor) {
2516 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002517 /* We come in with [tb, val, exc, 0] on the
2518 stack; one pop and it's the same as
2519 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002520 com_addbyte(c, POP_TOP);
2521 }
2522 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002523 /* We actually come in here with [tb, val, exc] but the
2524 END_FINALLY will zap those and jump around.
2525 The c_stacklevel does not reflect them so we need not pop
2526 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002527 com_addbyte(c, END_FINALLY);
2528 com_backpatch(c, else_anchor);
2529 if (i < NCH(n))
2530 com_node(c, CHILD(n, i+2));
2531 com_backpatch(c, end_anchor);
2532}
2533
2534static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002535com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002536{
2537 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002538 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002539
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002540 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2541 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002542 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002543 com_addbyte(c, POP_BLOCK);
2544 block_pop(c, SETUP_FINALLY);
2545 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002546 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002547 /* While the generated code pushes only one item,
2548 the try-finally handling can enter here with
2549 up to three items. OK, here are the details:
2550 3 for an exception, 2 for RETURN, 1 for BREAK. */
2551 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002552 com_backpatch(c, finally_anchor);
2553 ch = CHILD(n, NCH(n)-1);
2554 com_addoparg(c, SET_LINENO, ch->n_lineno);
2555 com_node(c, ch);
2556 com_addbyte(c, END_FINALLY);
2557 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002558 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002559}
2560
2561static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002562com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002563{
2564 REQ(n, try_stmt);
2565 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2566 | 'try' ':' suite 'finally' ':' suite */
2567 if (TYPE(CHILD(n, 3)) != except_clause)
2568 com_try_finally(c, n);
2569 else
2570 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002571}
2572
Guido van Rossum8b993a91997-01-17 21:04:03 +00002573static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002574get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002575{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002576 int i;
2577
Guido van Rossum8b993a91997-01-17 21:04:03 +00002578 /* Label to avoid tail recursion */
2579 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002580 switch (TYPE(n)) {
2581
2582 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002583 if (NCH(n) == 1) {
2584 n = CHILD(n, 0);
2585 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002586 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002587 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002588 case file_input:
2589 for (i = 0; i < NCH(n); i++) {
2590 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002591 if (TYPE(ch) == stmt) {
2592 n = ch;
2593 goto next;
2594 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002595 }
2596 break;
2597
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002598 case stmt:
2599 case simple_stmt:
2600 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002601 n = CHILD(n, 0);
2602 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002603
2604 case expr_stmt:
2605 case testlist:
2606 case test:
2607 case and_test:
2608 case not_test:
2609 case comparison:
2610 case expr:
2611 case xor_expr:
2612 case and_expr:
2613 case shift_expr:
2614 case arith_expr:
2615 case term:
2616 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002617 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002618 if (NCH(n) == 1) {
2619 n = CHILD(n, 0);
2620 goto next;
2621 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002622 break;
2623
2624 case atom:
2625 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002626 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002627 break;
2628
2629 }
2630 return NULL;
2631}
2632
Guido van Rossum79f25d91997-04-29 20:08:16 +00002633static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002634get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002635{
Guido van Rossum541563e1999-01-28 15:08:09 +00002636 /* Don't generate doc-strings if run with -OO */
2637 if (Py_OptimizeFlag > 1)
2638 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002639 n = get_rawdocstring(n);
2640 if (n == NULL)
2641 return NULL;
2642 return parsestrplus(n);
2643}
2644
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002645static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002646com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002647{
2648 REQ(n, suite);
2649 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2650 if (NCH(n) == 1) {
2651 com_node(c, CHILD(n, 0));
2652 }
2653 else {
2654 int i;
2655 for (i = 0; i < NCH(n); i++) {
2656 node *ch = CHILD(n, i);
2657 if (TYPE(ch) == stmt)
2658 com_node(c, ch);
2659 }
2660 }
2661}
2662
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002663/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002664static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002665com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002666{
2667 int i = c->c_nblocks;
2668 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2669 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2670 }
2671 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002672 com_error(c, PyExc_SyntaxError,
2673 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002674 }
2675 /* XXX Could allow it inside a 'finally' clause
2676 XXX if we could pop the exception still on the stack */
2677}
2678
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002679static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002680com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002681{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002682 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002683 if (TYPE(n) == lambdef) {
2684 /* lambdef: 'lambda' [varargslist] ':' test */
2685 n = CHILD(n, 1);
2686 }
2687 else {
2688 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2689 n = CHILD(n, 2);
2690 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2691 n = CHILD(n, 1);
2692 }
2693 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002694 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002695 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002696 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002697 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2698 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002699 nargs = 0;
2700 ndefs = 0;
2701 for (i = 0; i < nch; i++) {
2702 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002703 if (TYPE(CHILD(n, i)) == STAR ||
2704 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002705 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002706 nargs++;
2707 i++;
2708 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002709 t = RPAR; /* Anything except EQUAL or COMMA */
2710 else
2711 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002712 if (t == EQUAL) {
2713 i++;
2714 ndefs++;
2715 com_node(c, CHILD(n, i));
2716 i++;
2717 if (i >= nch)
2718 break;
2719 t = TYPE(CHILD(n, i));
2720 }
2721 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00002722 /* Treat "(a=1, b)" as an error */
2723 if (ndefs)
2724 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00002725 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002726 }
2727 if (t != COMMA)
2728 break;
2729 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002730 return ndefs;
2731}
2732
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002733static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002734com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002735{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002736 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002737 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002738 v = (PyObject *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002739 if (v == NULL)
2740 c->c_errors++;
2741 else {
2742 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002743 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002744 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002745 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002746 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002747 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002748 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002749 com_pop(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002750 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002751 }
2752}
2753
2754static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002755com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002756{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002757 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002758 REQ(n, testlist);
2759 /* testlist: test (',' test)* [','] */
2760 for (i = 0; i < NCH(n); i += 2)
2761 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002762 i = (NCH(n)+1) / 2;
2763 com_addoparg(c, BUILD_TUPLE, i);
2764 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00002765}
2766
2767static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002768com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002769{
Guido van Rossum25831651993-05-19 14:50:45 +00002770 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002771 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002772 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002773 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00002774 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00002775 c->c_errors++;
2776 return;
2777 }
2778 /* Push the class name on the stack */
2779 i = com_addconst(c, v);
2780 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002781 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002782 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00002783 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002784 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00002785 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002786 com_push(c, 1);
2787 }
Guido van Rossum25831651993-05-19 14:50:45 +00002788 else
2789 com_bases(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002790 v = (PyObject *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002791 if (v == NULL)
2792 c->c_errors++;
2793 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002794 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002795 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002796 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002797 com_addoparg(c, MAKE_FUNCTION, 0);
2798 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002799 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002800 com_pop(c, 2);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002801 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002802 Py_DECREF(v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002803 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002804}
2805
2806static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002807com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002808{
2809 switch (TYPE(n)) {
2810
2811 /* Definition nodes */
2812
2813 case funcdef:
2814 com_funcdef(c, n);
2815 break;
2816 case classdef:
2817 com_classdef(c, n);
2818 break;
2819
2820 /* Trivial parse tree nodes */
2821
2822 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002823 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002824 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002825 com_node(c, CHILD(n, 0));
2826 break;
2827
2828 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002829 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2830 com_addoparg(c, SET_LINENO, n->n_lineno);
2831 {
2832 int i;
2833 for (i = 0; i < NCH(n)-1; i += 2)
2834 com_node(c, CHILD(n, i));
2835 }
2836 break;
2837
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002838 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002839 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002840 com_node(c, CHILD(n, 0));
2841 break;
2842
2843 /* Statement nodes */
2844
2845 case expr_stmt:
2846 com_expr_stmt(c, n);
2847 break;
2848 case print_stmt:
2849 com_print_stmt(c, n);
2850 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002851 case del_stmt: /* 'del' exprlist */
Guido van Rossum8861b741996-07-30 16:49:37 +00002852 com_assign(c, CHILD(n, 1), OP_DELETE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002853 break;
2854 case pass_stmt:
2855 break;
2856 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002857 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002858 com_error(c, PyExc_SyntaxError,
2859 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002860 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002861 com_addbyte(c, BREAK_LOOP);
2862 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002863 case continue_stmt:
2864 com_continue_stmt(c, n);
2865 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002866 case return_stmt:
2867 com_return_stmt(c, n);
2868 break;
2869 case raise_stmt:
2870 com_raise_stmt(c, n);
2871 break;
2872 case import_stmt:
2873 com_import_stmt(c, n);
2874 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002875 case global_stmt:
2876 com_global_stmt(c, n);
2877 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002878 case exec_stmt:
2879 com_exec_stmt(c, n);
2880 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002881 case assert_stmt:
2882 com_assert_stmt(c, n);
2883 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002884 case if_stmt:
2885 com_if_stmt(c, n);
2886 break;
2887 case while_stmt:
2888 com_while_stmt(c, n);
2889 break;
2890 case for_stmt:
2891 com_for_stmt(c, n);
2892 break;
2893 case try_stmt:
2894 com_try_stmt(c, n);
2895 break;
2896 case suite:
2897 com_suite(c, n);
2898 break;
2899
2900 /* Expression nodes */
2901
2902 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002903 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002904 break;
2905 case test:
2906 com_test(c, n);
2907 break;
2908 case and_test:
2909 com_and_test(c, n);
2910 break;
2911 case not_test:
2912 com_not_test(c, n);
2913 break;
2914 case comparison:
2915 com_comparison(c, n);
2916 break;
2917 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002918 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002919 break;
2920 case expr:
2921 com_expr(c, n);
2922 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002923 case xor_expr:
2924 com_xor_expr(c, n);
2925 break;
2926 case and_expr:
2927 com_and_expr(c, n);
2928 break;
2929 case shift_expr:
2930 com_shift_expr(c, n);
2931 break;
2932 case arith_expr:
2933 com_arith_expr(c, n);
2934 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002935 case term:
2936 com_term(c, n);
2937 break;
2938 case factor:
2939 com_factor(c, n);
2940 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00002941 case power:
2942 com_power(c, n);
2943 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002944 case atom:
2945 com_atom(c, n);
2946 break;
2947
2948 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002949 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002950 com_error(c, PyExc_SystemError,
2951 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002952 }
2953}
2954
Tim Petersdbd9ba62000-07-09 03:09:57 +00002955static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002956
2957static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002958com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002959{
2960 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
2961 if (TYPE(CHILD(n, 0)) == LPAR)
2962 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002963 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002964 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002965 com_pop(c, 1);
2966 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002967}
2968
2969static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002970com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002971{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00002972 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002973 if (NCH(n) == 1) {
2974 com_fpdef(c, CHILD(n, 0));
2975 }
2976 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002977 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002978 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002979 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002980 for (i = 0; i < NCH(n); i += 2)
2981 com_fpdef(c, CHILD(n, i));
2982 }
2983}
2984
2985static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002986com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002987{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002988 int nch, i;
2989 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00002990 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002991 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00002992 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002993 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002994 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002995 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002996 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002997 node *ch = CHILD(n, i);
2998 node *fp;
2999 char *name;
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003000 PyObject *nameval;
Guido van Rossum50564e81996-01-12 01:13:16 +00003001 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003002 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003003 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3004 fp = CHILD(ch, 0);
3005 if (TYPE(fp) == NAME)
3006 name = STR(fp);
3007 else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003008 name = nbuf;
3009 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003010 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003011 }
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003012 nameval = PyString_InternFromString(name);
3013 if (nameval == NULL) {
3014 c->c_errors++;
3015 }
Peter Schneider-Kamp9a5086c2000-07-13 06:24:29 +00003016 if (PyDict_GetItem(c->c_locals, nameval)) {
Fred Drakedcf08e02000-08-15 15:49:44 +00003017 com_error(c, PyExc_SyntaxError,
3018 "duplicate argument in function definition");
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003019 }
3020 com_newlocal_o(c, nameval);
3021 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003022 c->c_argcount++;
3023 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003024 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003025 ch = CHILD(n, i);
3026 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003027 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003028 else
3029 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003030 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003031 /* Handle *arguments */
3032 if (i < nch) {
3033 node *ch;
3034 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003035 if (TYPE(ch) != DOUBLESTAR) {
3036 REQ(ch, STAR);
3037 ch = CHILD(n, i+1);
3038 if (TYPE(ch) == NAME) {
3039 c->c_flags |= CO_VARARGS;
3040 i += 3;
3041 com_newlocal(c, STR(ch));
3042 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003043 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003044 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003045 /* Handle **keywords */
3046 if (i < nch) {
3047 node *ch;
3048 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003049 if (TYPE(ch) != DOUBLESTAR) {
3050 REQ(ch, STAR);
3051 ch = CHILD(n, i+1);
3052 REQ(ch, STAR);
3053 ch = CHILD(n, i+2);
3054 }
3055 else
3056 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003057 REQ(ch, NAME);
3058 c->c_flags |= CO_VARKEYWORDS;
3059 com_newlocal(c, STR(ch));
3060 }
3061 if (complex) {
3062 /* Generate code for complex arguments only after
3063 having counted the simple arguments */
3064 int ilocal = 0;
3065 for (i = 0; i < nch; i++) {
3066 node *ch = CHILD(n, i);
3067 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003068 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003069 break;
3070 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3071 fp = CHILD(ch, 0);
3072 if (TYPE(fp) != NAME) {
3073 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003074 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003075 com_fpdef(c, ch);
3076 }
3077 ilocal++;
3078 if (++i >= nch)
3079 break;
3080 ch = CHILD(n, i);
3081 if (TYPE(ch) == EQUAL)
3082 i += 2;
3083 else
3084 REQ(ch, COMMA);
3085 }
3086 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003087}
3088
3089static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003090com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003091{
3092 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003093 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003094 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003095 doc = get_docstring(n);
3096 if (doc != NULL) {
3097 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003098 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003099 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003100 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003101 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003102 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003103 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003104 for (i = 0; i < NCH(n); i++) {
3105 node *ch = CHILD(n, i);
3106 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3107 com_node(c, ch);
3108 }
3109}
3110
3111/* Top-level compile-node interface */
3112
3113static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003114compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003115{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003116 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003117 node *ch;
3118 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003119 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003120 doc = get_docstring(CHILD(n, 4));
3121 if (doc != NULL) {
3122 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003123 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003124 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003125 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003126 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003127 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3128 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003129 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003130 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003131 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003132 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003133 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003134 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003135 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003136 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003137 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003138}
3139
3140static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003141compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003142{
Guido van Rossum590baa41993-11-30 13:40:46 +00003143 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003144 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003145 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003146
3147 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003148 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003149 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003150 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003151 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003152 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003153 else
3154 ch = CHILD(n, 2);
3155 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003156 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003157 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003158}
3159
3160static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003161compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003162{
3163 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003164 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003165 REQ(n, classdef);
3166 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3167 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003168#ifdef PRIVATE_NAME_MANGLING
3169 c->c_private = c->c_name;
3170#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003171 ch = CHILD(n, NCH(n)-1); /* The suite */
3172 doc = get_docstring(ch);
3173 if (doc != NULL) {
3174 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003175 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003176 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003177 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003178 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003179 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003180 }
3181 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003182 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003183 com_node(c, ch);
3184 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003185 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003186 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003187 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003188}
3189
3190static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003191compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003192{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003193 com_addoparg(c, SET_LINENO, n->n_lineno);
3194
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003195 switch (TYPE(n)) {
3196
Guido van Rossum4c417781991-01-21 16:09:22 +00003197 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003198 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003199 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003200 n = CHILD(n, 0);
3201 if (TYPE(n) != NEWLINE)
3202 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003203 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003204 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003205 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003206 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003207 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003208 break;
3209
Guido van Rossum4c417781991-01-21 16:09:22 +00003210 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003211 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003212 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003213 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003214 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003215 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003216 break;
3217
Guido van Rossum590baa41993-11-30 13:40:46 +00003218 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003219 com_node(c, CHILD(n, 0));
3220 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003221 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003222 break;
3223
Guido van Rossum590baa41993-11-30 13:40:46 +00003224 case lambdef: /* anonymous function definition */
3225 compile_lambdef(c, n);
3226 break;
3227
Guido van Rossum4c417781991-01-21 16:09:22 +00003228 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003229 compile_funcdef(c, n);
3230 break;
3231
Guido van Rossum4c417781991-01-21 16:09:22 +00003232 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003233 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003234 break;
3235
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003236 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003237 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003238 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003239 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003240 }
3241}
3242
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003243/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00003244
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003245 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
3246 instructions that refer to local variables with LOAD_FAST etc.
3247 The latter instructions are much faster because they don't need to
3248 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003249
Guido van Rossum681d79a1995-07-18 14:51:37 +00003250 To find all local variables, we check all STORE_NAME, IMPORT_FROM
3251 and DELETE_NAME instructions. This yields all local variables,
3252 function definitions, class definitions and import statements.
3253 Argument names have already been entered into the list by the
3254 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003255
3256 All remaining LOAD_NAME instructions must refer to non-local (global
3257 or builtin) variables, so are replaced by LOAD_GLOBAL.
3258
3259 There are two problems: 'from foo import *' and 'exec' may introduce
3260 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00003261 case, we can still optimize bona fide locals (since those
3262 statements will be surrounded by fast_2_locals() and
3263 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003264
Guido van Rossum681d79a1995-07-18 14:51:37 +00003265 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00003266
3267static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003268optimize(struct compiling *c)
Guido van Rossum282914b1991-04-04 10:42:56 +00003269{
Guido van Rossum0a697f61991-04-16 08:39:12 +00003270 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00003271 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00003272 int oparg = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003273 PyObject *name;
3274 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003275
Guido van Rossum282914b1991-04-04 10:42:56 +00003276#define NEXTOP() (*next_instr++)
3277#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossum79f25d91997-04-29 20:08:16 +00003278#define GETITEM(v, i) (PyList_GetItem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003279#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
3280
Guido van Rossum79f25d91997-04-29 20:08:16 +00003281 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003282
3283 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00003284
Guido van Rossum79f25d91997-04-29 20:08:16 +00003285 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003286 for (;;) {
3287 opcode = NEXTOP();
3288 if (opcode == STOP_CODE)
3289 break;
3290 if (HAS_ARG(opcode))
3291 oparg = NEXTARG();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003292 switch (opcode) {
3293 case STORE_NAME:
3294 case DELETE_NAME:
3295 case IMPORT_FROM:
3296 com_addlocal_o(c, GETNAMEOBJ(oparg));
3297 break;
3298 case EXEC_STMT:
3299 c->c_flags &= ~CO_OPTIMIZED;
3300 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00003301 }
3302 }
3303
Guido van Rossum79f25d91997-04-29 20:08:16 +00003304 if (PyDict_GetItemString(c->c_locals, "*") != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003305 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003306
Guido van Rossum79f25d91997-04-29 20:08:16 +00003307 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003308 for (;;) {
3309 cur_instr = next_instr;
3310 opcode = NEXTOP();
3311 if (opcode == STOP_CODE)
3312 break;
3313 if (HAS_ARG(opcode))
3314 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003315 if (opcode == LOAD_NAME ||
3316 opcode == STORE_NAME ||
3317 opcode == DELETE_NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003318 PyObject *v;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003319 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00003320 name = GETNAMEOBJ(oparg);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003321 v = PyDict_GetItem(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003322 if (v == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003323 if (opcode == LOAD_NAME &&
3324 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003325 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003326 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00003327 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003328 i = PyInt_AsLong(v);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003329 switch (opcode) {
3330 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
3331 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
3332 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
3333 }
3334 cur_instr[1] = i & 0xff;
3335 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00003336 }
3337 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003338
Guido van Rossum681d79a1995-07-18 14:51:37 +00003339 if (c->c_errors == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00003340 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00003341}
3342
Guido van Rossum79f25d91997-04-29 20:08:16 +00003343PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003344PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003345{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003346 return jcompile(n, filename, NULL);
3347}
3348
Guido van Rossum79f25d91997-04-29 20:08:16 +00003349static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003350icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003351{
3352 return jcompile(n, base->c_filename, base);
3353}
3354
Guido van Rossum79f25d91997-04-29 20:08:16 +00003355static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003356jcompile(node *n, char *filename, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003357{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003358 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003359 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003360 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003361 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003362#ifdef PRIVATE_NAME_MANGLING
3363 if (base)
3364 sc.c_private = base->c_private;
3365 else
3366 sc.c_private = NULL;
3367#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003368 compile_node(&sc, n);
3369 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003370 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003371 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003372 sc.c_flags |= CO_NEWLOCALS;
3373 }
3374 else if (TYPE(n) == classdef)
3375 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00003376 co = NULL;
3377 if (sc.c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003378 PyObject *consts, *names, *varnames, *filename, *name;
3379 consts = PyList_AsTuple(sc.c_consts);
3380 names = PyList_AsTuple(sc.c_names);
3381 varnames = PyList_AsTuple(sc.c_varnames);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003382 filename = PyString_InternFromString(sc.c_filename);
3383 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003384 if (!PyErr_Occurred())
3385 co = PyCode_New(sc.c_argcount,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003386 sc.c_nlocals,
Guido van Rossum8b993a91997-01-17 21:04:03 +00003387 sc.c_maxstacklevel,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003388 sc.c_flags,
3389 sc.c_code,
3390 consts,
3391 names,
3392 varnames,
3393 filename,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003394 name,
3395 sc.c_firstlineno,
3396 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003397 Py_XDECREF(consts);
3398 Py_XDECREF(names);
3399 Py_XDECREF(varnames);
3400 Py_XDECREF(filename);
3401 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003402 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003403 else if (!PyErr_Occurred()) {
3404 /* This could happen if someone called PyErr_Clear() after an
3405 error was reported above. That's not supposed to happen,
3406 but I just plugged one case and I'm not sure there can't be
3407 others. In that case, raise SystemError so that at least
3408 it gets reported instead dumping core. */
3409 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3410 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003411 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003412 return co;
3413}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003414
3415int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003416PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003417{
3418 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003419 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003420 int line = co->co_firstlineno;
3421 int addr = 0;
3422 while (--size >= 0) {
3423 addr += *p++;
3424 if (addr > addrq)
3425 break;
3426 line += *p++;
3427 }
3428 return line;
3429}