blob: 30ac41a6239adb6309c4b6fabeae4e6ed103e901 [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 Rossum452a9831996-09-17 14:32:04 +0000308 char *s;
Guido van Rossum635abd21997-01-06 22:56:52 +0000309 c->c_errors++;
Guido van Rossum452a9831996-09-17 14:32:04 +0000310 if (c->c_lineno <= 1) {
311 /* Unknown line number or single interactive command */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000312 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000313 return;
314 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000315 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000316 if (v == NULL)
317 return; /* MemoryError, too bad */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000318 PyErr_SetObject(exc, v);
319 Py_DECREF(v);
Fred Drakedcf08e02000-08-15 15:49:44 +0000320
321 /* add attributes for the line number and filename for the error */
322 PyErr_Fetch(&exc, &v, &tb);
323 PyErr_NormalizeException(&exc, &v, &tb);
324 tmp = PyInt_FromLong(c->c_lineno);
325 if (tmp == NULL)
326 PyErr_Clear();
327 else {
328 if (PyObject_SetAttrString(v, "lineno", tmp))
329 PyErr_Clear();
330 Py_DECREF(tmp);
331 }
332 if (c->c_filename != NULL) {
333 tmp = PyString_FromString(c->c_filename);
334 if (tmp == NULL)
335 PyErr_Clear();
336 else {
337 if (PyObject_SetAttrString(v, "filename", tmp))
338 PyErr_Clear();
339 Py_DECREF(tmp);
340 }
341 }
342 PyErr_Restore(exc, v, tb);
Guido van Rossum452a9831996-09-17 14:32:04 +0000343}
344
345
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000346/* Interface to the block stack */
347
348static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000349block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000350{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000351 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000352 com_error(c, PyExc_SystemError,
353 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000354 }
355 else {
356 c->c_block[c->c_nblocks++] = type;
357 }
358}
359
360static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000361block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000362{
363 if (c->c_nblocks > 0)
364 c->c_nblocks--;
365 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000366 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000367 }
368}
369
370
Guido van Rossum681d79a1995-07-18 14:51:37 +0000371/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000372
Tim Petersdbd9ba62000-07-09 03:09:57 +0000373static int com_init(struct compiling *, char *);
374static void com_free(struct compiling *);
375static void com_push(struct compiling *, int);
376static void com_pop(struct compiling *, int);
377static void com_done(struct compiling *);
378static void com_node(struct compiling *, struct _node *);
379static void com_factor(struct compiling *, struct _node *);
380static void com_addbyte(struct compiling *, int);
381static void com_addint(struct compiling *, int);
382static void com_addoparg(struct compiling *, int, int);
383static void com_addfwref(struct compiling *, int, int *);
384static void com_backpatch(struct compiling *, int);
385static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
386static int com_addconst(struct compiling *, PyObject *);
387static int com_addname(struct compiling *, PyObject *);
388static void com_addopname(struct compiling *, int, node *);
389static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000390static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000391static int com_argdefs(struct compiling *, node *);
392static int com_newlocal(struct compiling *, char *);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000393static void com_assign(struct compiling *, node *, int);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000394static PyCodeObject *icompile(struct _node *, struct compiling *);
395static PyCodeObject *jcompile(struct _node *, char *,
396 struct compiling *);
397static PyObject *parsestrplus(node *);
398static PyObject *parsestr(char *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000399
400static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000401com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000402{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000403 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000404 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
405 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000406 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000407 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000408 goto fail;
409 if ((c->c_const_dict = PyDict_New()) == NULL)
410 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000411 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000412 goto fail;
413 if ((c->c_name_dict = PyDict_New()) == NULL)
414 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000415 if ((c->c_globals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000416 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000417 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000418 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000419 if ((c->c_varnames = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000420 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000421 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
422 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000423 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000424 c->c_nlocals = 0;
425 c->c_argcount = 0;
426 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000427 c->c_nexti = 0;
428 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000429 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000430 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000431 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000432 c->c_begin = 0;
433 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000434 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000435 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000436 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000437 c->c_stacklevel = 0;
438 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000439 c->c_firstlineno = 0;
440 c->c_last_addr = 0;
441 c->c_last_line = 0;
442 c-> c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000443 c->c_tmpname = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000444 return 1;
445
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000446 fail:
447 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000448 return 0;
449}
450
451static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000452com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000453{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000454 Py_XDECREF(c->c_code);
455 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000456 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000457 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000458 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000459 Py_XDECREF(c->c_globals);
460 Py_XDECREF(c->c_locals);
461 Py_XDECREF(c->c_varnames);
462 Py_XDECREF(c->c_lnotab);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000463}
464
465static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000466com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000467{
468 c->c_stacklevel += n;
469 if (c->c_stacklevel > c->c_maxstacklevel)
470 c->c_maxstacklevel = c->c_stacklevel;
471}
472
473static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000474com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000475{
476 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000477 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000478 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
479 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000480 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000481 c->c_stacklevel = 0;
482 }
483 else
484 c->c_stacklevel -= n;
485}
486
487static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000488com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000489{
490 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000491 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000492 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000493 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000494}
495
496static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000497com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000498{
499 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000500 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000501 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000502 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000503 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000504 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000505 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000506 com_error(c, PyExc_SystemError,
507 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000508 }
509 if (c->c_code == NULL)
510 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000511 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000512 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000513 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000514 c->c_errors++;
515 return;
516 }
517 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000518 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000519}
520
521static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000522com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000523{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000524 com_addbyte(c, x & 0xff);
525 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000526}
527
528static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000529com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000530{
531 int size;
532 char *p;
533 if (c->c_lnotab == NULL)
534 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000535 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000536 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000537 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000538 c->c_errors++;
539 return;
540 }
541 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000542 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000543 *p++ = addr;
544 *p++ = line;
545 c->c_lnotab_next += 2;
546}
547
548static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000549com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000550{
551 c->c_lineno = lineno;
552 if (c->c_firstlineno == 0) {
553 c->c_firstlineno = c->c_last_line = lineno;
554 }
555 else {
556 int incr_addr = c->c_nexti - c->c_last_addr;
557 int incr_line = lineno - c->c_last_line;
558 while (incr_addr > 0 || incr_line > 0) {
559 int trunc_addr = incr_addr;
560 int trunc_line = incr_line;
561 if (trunc_addr > 255)
562 trunc_addr = 255;
563 if (trunc_line > 255)
564 trunc_line = 255;
565 com_add_lnotab(c, trunc_addr, trunc_line);
566 incr_addr -= trunc_addr;
567 incr_line -= trunc_line;
568 }
569 c->c_last_addr = c->c_nexti;
570 c->c_last_line = lineno;
571 }
572}
573
574static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000575com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000576{
Guido van Rossum8e793d91997-03-03 19:13:14 +0000577 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000578 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000579 if (Py_OptimizeFlag)
580 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000581 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000582 com_addbyte(c, op);
583 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000584}
585
586static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000587com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000588{
589 /* Compile a forward reference for backpatching */
590 int here;
591 int anchor;
592 com_addbyte(c, op);
593 here = c->c_nexti;
594 anchor = *p_anchor;
595 *p_anchor = here;
596 com_addint(c, anchor == 0 ? 0 : here - anchor);
597}
598
599static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000600com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000601{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000602 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000603 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000604 int dist;
605 int prev;
606 for (;;) {
607 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000608 prev = code[anchor] + (code[anchor+1] << 8);
609 dist = target - (anchor+2);
610 code[anchor] = dist & 0xff;
611 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000612 if (!prev)
613 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000614 anchor -= prev;
615 }
616}
617
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000618/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000619
620static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000621com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000622{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000623 PyObject *w, *t, *np=NULL;
624 long n;
625
626 t = Py_BuildValue("(OO)", v, v->ob_type);
627 if (t == NULL)
628 goto fail;
629 w = PyDict_GetItem(dict, t);
630 if (w != NULL) {
631 n = PyInt_AsLong(w);
632 } else {
633 n = PyList_Size(list);
634 np = PyInt_FromLong(n);
635 if (np == NULL)
636 goto fail;
637 if (PyList_Append(list, v) != 0)
638 goto fail;
639 if (PyDict_SetItem(dict, t, np) != 0)
640 goto fail;
641 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000642 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000643 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000644 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000645 fail:
646 Py_XDECREF(np);
647 Py_XDECREF(t);
648 c->c_errors++;
649 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000650}
651
652static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000653com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000654{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000655 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000656}
657
658static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000659com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000660{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000661 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000662}
663
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000664#ifdef PRIVATE_NAME_MANGLING
665static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000666com_mangle(struct compiling *c, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000667{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000668 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000669 This is independent from how the name is used. */
670 char *p;
Guido van Rossum582acec2000-06-28 22:07:35 +0000671 size_t nlen, plen;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000672 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000673 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000674 return 0; /* Don't mangle __extremely_long_names */
675 if (name[nlen-1] == '_' && name[nlen-2] == '_')
676 return 0; /* Don't mangle __whatever__ */
677 p = c->c_private;
678 /* Strip leading underscores from class name */
679 while (*p == '_')
680 p++;
681 if (*p == '\0')
682 return 0; /* Don't mangle if class is just underscores */
683 plen = strlen(p);
684 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000685 plen = maxlen-nlen-2; /* Truncate class name if too long */
686 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000687 buffer[0] = '_';
688 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000689 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000690 /* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
691 return 1;
692}
693#endif
694
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000695static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000696com_addopnamestr(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000697{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000698 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000699 int i;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000700#ifdef PRIVATE_NAME_MANGLING
701 char buffer[256];
702 if (name != NULL && name[0] == '_' && name[1] == '_' &&
703 c->c_private != NULL &&
Guido van Rossum582acec2000-06-28 22:07:35 +0000704 com_mangle(c, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000705 name = buffer;
706#endif
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000707 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000708 c->c_errors++;
709 i = 255;
710 }
711 else {
712 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000713 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000714 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000715 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
716 switch (op) {
717 case LOAD_NAME:
718 case STORE_NAME:
719 case DELETE_NAME:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000720 if (PyDict_GetItemString(c->c_globals, name) != NULL) {
Guido van Rossumc5e96291991-12-10 13:53:51 +0000721 switch (op) {
722 case LOAD_NAME: op = LOAD_GLOBAL; break;
723 case STORE_NAME: op = STORE_GLOBAL; break;
724 case DELETE_NAME: op = DELETE_GLOBAL; break;
725 }
726 }
727 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000728 com_addoparg(c, op, i);
729}
730
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000731static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000732com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000733{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000734 char *name;
735 char buffer[1000];
736 /* XXX it is possible to write this code without the 1000
737 chars on the total length of dotted names, I just can't be
738 bothered right now */
739 if (TYPE(n) == STAR)
740 name = "*";
741 else if (TYPE(n) == dotted_name) {
742 char *p = buffer;
743 int i;
744 name = buffer;
745 for (i = 0; i < NCH(n); i += 2) {
746 char *s = STR(CHILD(n, i));
747 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000748 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000749 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +0000750 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000751 break;
752 }
753 if (p != buffer)
754 *p++ = '.';
755 strcpy(p, s);
756 p = strchr(p, '\0');
757 }
758 }
759 else {
760 REQ(n, NAME);
761 name = STR(n);
762 }
763 com_addopnamestr(c, op, name);
764}
765
Guido van Rossum79f25d91997-04-29 20:08:16 +0000766static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000767parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000768{
Tim Petersdbd9ba62000-07-09 03:09:57 +0000769 extern double atof(const char *);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000770 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000771 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000772 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +0000773#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +0000774 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +0000775 int imflag;
776#endif
777
Guido van Rossum282914b1991-04-04 10:42:56 +0000778 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000779 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +0000780#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +0000781 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +0000782#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000783 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000784 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000785 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000786 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000787 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000788 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000789 if (*end == '\0') {
790 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000791 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000792 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000793 return NULL;
794 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000795 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000796 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000797 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +0000798#ifndef WITHOUT_COMPLEX
799 if (imflag) {
800 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000801 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +0000802 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000803 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000804 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +0000805 }
Guido van Rossumac1fc951997-10-08 15:23:55 +0000806 else
Guido van Rossum50564e81996-01-12 01:13:16 +0000807#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +0000808 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000809 PyFPE_START_PROTECT("atof", return 0)
810 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000811 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000812 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000813 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000814}
815
Guido van Rossum79f25d91997-04-29 20:08:16 +0000816static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000817parsestr(char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000818{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000819 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +0000820 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000821 char *buf;
822 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000823 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000824 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +0000825 int first = *s;
826 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000827 int rawmode = 0;
828 int unicode = 0;
829 if (isalpha(quote) || quote == '_') {
830 if (quote == 'u' || quote == 'U') {
831 quote = *++s;
832 unicode = 1;
833 }
834 if (quote == 'r' || quote == 'R') {
835 quote = *++s;
836 rawmode = 1;
837 }
838 }
Guido van Rossum8054fad1993-10-26 15:19:44 +0000839 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000840 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000841 return NULL;
842 }
843 s++;
844 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +0000845 if (len > INT_MAX) {
846 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
847 return NULL;
848 }
Guido van Rossum8054fad1993-10-26 15:19:44 +0000849 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000850 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000851 return NULL;
852 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000853 if (len >= 4 && s[0] == quote && s[1] == quote) {
854 s += 2;
855 len -= 2;
856 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000857 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000858 return NULL;
859 }
860 }
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +0000861 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000862 if (rawmode)
863 return PyUnicode_DecodeRawUnicodeEscape(
864 s, len, NULL);
865 else
866 return PyUnicode_DecodeUnicodeEscape(
867 s, len, NULL);
868 }
869 else if (rawmode || strchr(s, '\\') == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000870 return PyString_FromStringAndSize(s, len);
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000871 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000872 v = PyString_FromStringAndSize((char *)NULL, len);
873 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000874 end = s + len;
875 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000876 if (*s != '\\') {
877 *p++ = *s++;
878 continue;
879 }
880 s++;
881 switch (*s++) {
882 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000883 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000884 case '\\': *p++ = '\\'; break;
885 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000886 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000887 case 'b': *p++ = '\b'; break;
888 case 'f': *p++ = '\014'; break; /* FF */
889 case 't': *p++ = '\t'; break;
890 case 'n': *p++ = '\n'; break;
891 case 'r': *p++ = '\r'; break;
892 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000893 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
894 case '0': case '1': case '2': case '3':
895 case '4': case '5': case '6': case '7':
896 c = s[-1] - '0';
897 if ('0' <= *s && *s <= '7') {
898 c = (c<<3) + *s++ - '0';
899 if ('0' <= *s && *s <= '7')
900 c = (c<<3) + *s++ - '0';
901 }
902 *p++ = c;
903 break;
904 case 'x':
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000905 if (isxdigit(Py_CHARMASK(*s))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000906 unsigned int x = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000907 do {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000908 c = Py_CHARMASK(*s);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000909 s++;
Guido van Rossumed1100f1997-10-20 23:24:07 +0000910 x = (x<<4) & ~0xF;
911 if (isdigit(c))
912 x += c - '0';
913 else if (islower(c))
914 x += 10 + c - 'a';
915 else
916 x += 10 + c - 'A';
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000917 } while (isxdigit(Py_CHARMASK(*s)));
Guido van Rossumed1100f1997-10-20 23:24:07 +0000918 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000919 break;
920 }
921 /* FALLTHROUGH */
922 default: *p++ = '\\'; *p++ = s[-1]; break;
923 }
924 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000925 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000926 return v;
927}
928
Guido van Rossum79f25d91997-04-29 20:08:16 +0000929static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000930parsestrplus(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000931{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000932 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000933 int i;
934 REQ(CHILD(n, 0), STRING);
935 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
936 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +0000937 for (i = 1; i < NCH(n); i++) {
938 PyObject *s;
939 s = parsestr(STR(CHILD(n, i)));
940 if (s == NULL)
941 goto onError;
942 if (PyString_Check(v) && PyString_Check(s)) {
943 PyString_ConcatAndDel(&v, s);
944 if (v == NULL)
945 goto onError;
946 }
947 else {
948 PyObject *temp;
949 temp = PyUnicode_Concat(v, s);
950 Py_DECREF(s);
951 if (temp == NULL)
952 goto onError;
953 Py_DECREF(v);
954 v = temp;
955 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000956 }
957 }
958 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +0000959
960 onError:
961 Py_XDECREF(v);
962 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000963}
964
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000965static void
Skip Montanaro803d6e52000-08-12 18:09:51 +0000966com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000967{
Skip Montanaro803d6e52000-08-12 18:09:51 +0000968 PyObject *v;
969 int anchor = 0;
970 int save_begin = c->c_begin;
971
972 /* list_iter: for v in expr [list_iter] */
973 com_node(c, CHILD(n, 3)); /* expr */
974 v = PyInt_FromLong(0L);
975 if (v == NULL)
976 c->c_errors++;
977 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
978 com_push(c, 1);
979 Py_XDECREF(v);
980 c->c_begin = c->c_nexti;
981 com_addoparg(c, SET_LINENO, n->n_lineno);
982 com_addfwref(c, FOR_LOOP, &anchor);
983 com_push(c, 1);
984 com_assign(c, CHILD(n, 1), OP_ASSIGN);
985 c->c_loops++;
986 com_list_iter(c, n, e, t);
987 c->c_loops--;
988 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
989 c->c_begin = save_begin;
990 com_backpatch(c, anchor);
991 com_pop(c, 2); /* FOR_LOOP has popped these */
992}
993
994static void
995com_list_if(struct compiling *c, node *n, node *e, char *t)
996{
997 int anchor = 0;
998 int a = 0;
999 /* list_iter: 'if' test [list_iter] */
1000 com_addoparg(c, SET_LINENO, n->n_lineno);
1001 com_node(c, CHILD(n, 1));
1002 com_addfwref(c, JUMP_IF_FALSE, &a);
1003 com_addbyte(c, POP_TOP);
1004 com_pop(c, 1);
1005 com_list_iter(c, n, e, t);
1006 com_addfwref(c, JUMP_FORWARD, &anchor);
1007 com_backpatch(c, a);
1008 /* We jump here with an extra entry which we now pop */
1009 com_addbyte(c, POP_TOP);
1010 com_backpatch(c, anchor);
1011}
1012
1013static void
1014com_list_iter(struct compiling *c,
1015 node *p, /* parent of list_iter node */
1016 node *e, /* element expression node */
1017 char *t /* name of result list temp local */)
1018{
1019 /* list_iter is the last child in a listmaker, list_for, or list_if */
1020 node *n = CHILD(p, NCH(p)-1);
1021 if (TYPE(n) == list_iter) {
1022 n = CHILD(n, 0);
1023 switch (TYPE(n)) {
1024 case list_for:
1025 com_list_for(c, n, e, t);
1026 break;
1027 case list_if:
1028 com_list_if(c, n, e, t);
1029 break;
1030 default:
1031 com_error(c, PyExc_SystemError,
1032 "invalid list_iter node type");
1033 }
1034 }
1035 else {
1036 com_addopnamestr(c, LOAD_NAME, t);
1037 com_push(c, 1);
1038 com_node(c, e);
1039 com_addoparg(c, CALL_FUNCTION, 1);
1040 com_addbyte(c, POP_TOP);
1041 com_pop(c, 2);
1042 }
1043}
1044
1045static void
1046com_list_comprehension(struct compiling *c, node *n)
1047{
1048 /* listmaker: test list_iter */
1049 char tmpname[12];
1050 sprintf(tmpname, "__%d__", ++c->c_tmpname);
1051 com_addoparg(c, BUILD_LIST, 0);
1052 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1053 com_push(c, 2);
1054 com_addopnamestr(c, LOAD_ATTR, "append");
1055 com_addopnamestr(c, STORE_NAME, tmpname);
1056 com_pop(c, 1);
1057 com_list_iter(c, n, CHILD(n, 0), tmpname);
1058 com_addopnamestr(c, DELETE_NAME, tmpname);
1059 --c->c_tmpname;
1060}
1061
1062static void
1063com_listmaker(struct compiling *c, node *n)
1064{
1065 /* listmaker: test ( list_iter | (',' test)* [','] ) */
Thomas Wouters87df80d2000-08-13 17:05:17 +00001066 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_iter)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001067 com_list_comprehension(c, n);
1068 else {
1069 int len = 0;
1070 int i;
1071 for (i = 0; i < NCH(n); i += 2, len++)
1072 com_node(c, CHILD(n, i));
1073 com_addoparg(c, BUILD_LIST, len);
1074 com_pop(c, len-1);
1075 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001076}
1077
1078static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001079com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001080{
1081 int i;
1082 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1083 for (i = 0; i+2 < NCH(n); i += 4) {
1084 /* We must arrange things just right for STORE_SUBSCR.
1085 It wants the stack to look like (value) (dict) (key) */
1086 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001087 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001088 com_node(c, CHILD(n, i+2)); /* value */
1089 com_addbyte(c, ROT_TWO);
1090 com_node(c, CHILD(n, i)); /* key */
1091 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001092 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001093 }
1094}
1095
1096static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001097com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001098{
1099 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001100 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001101 int i;
1102 REQ(n, atom);
1103 ch = CHILD(n, 0);
1104 switch (TYPE(ch)) {
1105 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001106 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001107 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001108 com_push(c, 1);
1109 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001110 else
1111 com_node(c, CHILD(n, 1));
1112 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001113 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001114 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001115 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001116 com_push(c, 1);
1117 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001118 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001119 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001120 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001121 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001122 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001123 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001124 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001125 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001126 break;
1127 case BACKQUOTE:
1128 com_node(c, CHILD(n, 1));
1129 com_addbyte(c, UNARY_CONVERT);
1130 break;
1131 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001132 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001133 i = 255;
1134 }
1135 else {
1136 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001137 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001138 }
1139 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001140 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001141 break;
1142 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001143 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001144 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001145 c->c_errors++;
1146 i = 255;
1147 }
1148 else {
1149 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001150 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001151 }
1152 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001153 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001154 break;
1155 case NAME:
1156 com_addopname(c, LOAD_NAME, ch);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001157 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001158 break;
1159 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001160 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001161 com_error(c, PyExc_SystemError,
1162 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001163 }
1164}
1165
1166static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001167com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001168{
1169 if (NCH(n) == 1) {
1170 com_addbyte(c, op);
1171 }
1172 else if (NCH(n) == 2) {
1173 if (TYPE(CHILD(n, 0)) != COLON) {
1174 com_node(c, CHILD(n, 0));
1175 com_addbyte(c, op+1);
1176 }
1177 else {
1178 com_node(c, CHILD(n, 1));
1179 com_addbyte(c, op+2);
1180 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001181 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001182 }
1183 else {
1184 com_node(c, CHILD(n, 0));
1185 com_node(c, CHILD(n, 2));
1186 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001187 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001188 }
1189}
1190
Guido van Rossum635abd21997-01-06 22:56:52 +00001191static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001192com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001193{
1194 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001195 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001196 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001197 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001198 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001199 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001200 }
1201 else {
1202 com_node(c, CHILD(n, 0));
1203 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001204 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001205 }
1206 m = n;
1207 do {
1208 m = CHILD(m, 0);
1209 } while (NCH(m) == 1);
1210 if (TYPE(m) != NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001211 com_error(c, PyExc_SyntaxError,
1212 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001213 }
1214 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001215 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001216 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001217 *pkeywords = PyDict_New();
Guido van Rossum635abd21997-01-06 22:56:52 +00001218 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001219 c->c_errors++;
1220 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001221 if (PyDict_GetItem(*pkeywords, v) != NULL)
1222 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001223 "duplicate keyword argument");
1224 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001225 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001226 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001227 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001228 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001229 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001230 }
1231 }
1232 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001233}
1234
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001235static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001236com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001237{
1238 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001239 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001240 }
1241 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001242 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001243 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001244 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001245 int star_flag = 0;
1246 int starstar_flag = 0;
1247 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001248 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001249 na = 0;
1250 nk = 0;
1251 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001252 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001253 if (TYPE(ch) == STAR ||
1254 TYPE(ch) == DOUBLESTAR)
1255 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001256 if (ch->n_lineno != lineno) {
1257 lineno = ch->n_lineno;
1258 com_addoparg(c, SET_LINENO, lineno);
1259 }
1260 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001261 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001262 na++;
1263 else
1264 nk++;
1265 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001266 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001267 while (i < NCH(n)) {
1268 node *tok = CHILD(n, i);
1269 node *ch = CHILD(n, i+1);
1270 i += 3;
1271 switch (TYPE(tok)) {
1272 case STAR: star_flag = 1; break;
1273 case DOUBLESTAR: starstar_flag = 1; break;
1274 }
1275 com_node(c, ch);
1276 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001277 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001278 com_error(c, PyExc_SyntaxError,
1279 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001280 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001281 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001282 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001283 star_flag + (starstar_flag << 1);
1284 else
1285 opcode = CALL_FUNCTION;
1286 com_addoparg(c, opcode, na | (nk << 8));
1287 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001288 }
1289}
1290
1291static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001292com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001293{
1294 com_addopname(c, LOAD_ATTR, n);
1295}
1296
1297static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001298com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001299{
1300 int i=0;
1301 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001302 node *ch;
1303
1304 /* first argument */
1305 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001306 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001307 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001308 i++;
1309 }
1310 else {
1311 com_node(c, CHILD(n,i));
1312 i++;
1313 REQ(CHILD(n,i),COLON);
1314 i++;
1315 }
1316 /* second argument */
1317 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1318 com_node(c, CHILD(n,i));
1319 i++;
1320 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001321 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001322 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001323 com_push(c, 1);
1324 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001325 /* remaining arguments */
1326 for (; i < NCH(n); i++) {
1327 ns++;
1328 ch=CHILD(n,i);
1329 REQ(ch, sliceop);
1330 if (NCH(ch) == 1) {
1331 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001332 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001333 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001334 }
1335 else
1336 com_node(c, CHILD(ch,1));
1337 }
1338 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001339 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001340}
1341
1342static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001343com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001344{
1345 node *ch;
1346 REQ(n, subscript);
1347 ch = CHILD(n,0);
1348 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001349 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001350 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001351 com_push(c, 1);
1352 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001353 else {
1354 /* check for slice */
1355 if ((TYPE(ch) == COLON || NCH(n) > 1))
1356 com_sliceobj(c, n);
1357 else {
1358 REQ(ch, test);
1359 com_node(c, ch);
1360 }
1361 }
1362}
1363
1364static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001365com_subscriptlist(struct compiling *c, node *n, int assigning)
Guido van Rossum8861b741996-07-30 16:49:37 +00001366{
1367 int i, op;
1368 REQ(n, subscriptlist);
1369 /* Check to make backward compatible slice behavior for '[i:j]' */
1370 if (NCH(n) == 1) {
1371 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001372 /* 'Basic' slice, should have exactly one colon. */
1373 if ((TYPE(CHILD(sub, 0)) == COLON
1374 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1375 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1376 {
Guido van Rossum8861b741996-07-30 16:49:37 +00001377 if (assigning == OP_APPLY)
1378 op = SLICE;
1379 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001380 op = ((assigning == OP_ASSIGN) ?
1381 STORE_SLICE : DELETE_SLICE);
Guido van Rossum8861b741996-07-30 16:49:37 +00001382 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001383 if (op == STORE_SLICE)
1384 com_pop(c, 2);
1385 else if (op == DELETE_SLICE)
1386 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001387 return;
1388 }
1389 }
1390 /* Else normal subscriptlist. Compile each subscript. */
1391 for (i = 0; i < NCH(n); i += 2)
1392 com_subscript(c, CHILD(n, i));
1393 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001394 if (NCH(n) > 1) {
1395 i = (NCH(n)+1) / 2;
1396 com_addoparg(c, BUILD_TUPLE, i);
1397 com_pop(c, i-1);
1398 }
1399 if (assigning == OP_APPLY) {
Guido van Rossum8861b741996-07-30 16:49:37 +00001400 op = BINARY_SUBSCR;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001401 i = 1;
1402 }
1403 else if (assigning == OP_ASSIGN) {
1404 op = STORE_SUBSCR;
1405 i = 3;
1406 }
1407 else {
1408 op = DELETE_SUBSCR;
1409 i = 2;
1410 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001411 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001412 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001413}
1414
1415static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001416com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001417{
1418 REQ(n, trailer);
1419 switch (TYPE(CHILD(n, 0))) {
1420 case LPAR:
1421 com_call_function(c, CHILD(n, 1));
1422 break;
1423 case DOT:
1424 com_select_member(c, CHILD(n, 1));
1425 break;
1426 case LSQB:
Guido van Rossum8861b741996-07-30 16:49:37 +00001427 com_subscriptlist(c, CHILD(n, 1), OP_APPLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001428 break;
1429 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001430 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001431 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001432 }
1433}
1434
1435static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001436com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001437{
1438 int i;
1439 REQ(n, power);
1440 com_atom(c, CHILD(n, 0));
1441 for (i = 1; i < NCH(n); i++) {
1442 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1443 com_factor(c, CHILD(n, i+1));
1444 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001445 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001446 break;
1447 }
1448 else
1449 com_apply_trailer(c, CHILD(n, i));
1450 }
1451}
1452
1453static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001454com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001455{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001456 REQ(n, factor);
1457 if (TYPE(CHILD(n, 0)) == PLUS) {
1458 com_factor(c, CHILD(n, 1));
1459 com_addbyte(c, UNARY_POSITIVE);
1460 }
1461 else if (TYPE(CHILD(n, 0)) == MINUS) {
1462 com_factor(c, CHILD(n, 1));
1463 com_addbyte(c, UNARY_NEGATIVE);
1464 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001465 else if (TYPE(CHILD(n, 0)) == TILDE) {
1466 com_factor(c, CHILD(n, 1));
1467 com_addbyte(c, UNARY_INVERT);
1468 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001469 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001470 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001471 }
1472}
1473
1474static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001475com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001476{
1477 int i;
1478 int op;
1479 REQ(n, term);
1480 com_factor(c, CHILD(n, 0));
1481 for (i = 2; i < NCH(n); i += 2) {
1482 com_factor(c, CHILD(n, i));
1483 switch (TYPE(CHILD(n, i-1))) {
1484 case STAR:
1485 op = BINARY_MULTIPLY;
1486 break;
1487 case SLASH:
1488 op = BINARY_DIVIDE;
1489 break;
1490 case PERCENT:
1491 op = BINARY_MODULO;
1492 break;
1493 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001494 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001495 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001496 op = 255;
1497 }
1498 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001499 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001500 }
1501}
1502
1503static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001504com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001505{
1506 int i;
1507 int op;
1508 REQ(n, arith_expr);
1509 com_term(c, CHILD(n, 0));
1510 for (i = 2; i < NCH(n); i += 2) {
1511 com_term(c, CHILD(n, i));
1512 switch (TYPE(CHILD(n, i-1))) {
1513 case PLUS:
1514 op = BINARY_ADD;
1515 break;
1516 case MINUS:
1517 op = BINARY_SUBTRACT;
1518 break;
1519 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001520 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001521 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001522 op = 255;
1523 }
1524 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001525 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001526 }
1527}
1528
1529static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001530com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001531{
1532 int i;
1533 int op;
1534 REQ(n, shift_expr);
1535 com_arith_expr(c, CHILD(n, 0));
1536 for (i = 2; i < NCH(n); i += 2) {
1537 com_arith_expr(c, CHILD(n, i));
1538 switch (TYPE(CHILD(n, i-1))) {
1539 case LEFTSHIFT:
1540 op = BINARY_LSHIFT;
1541 break;
1542 case RIGHTSHIFT:
1543 op = BINARY_RSHIFT;
1544 break;
1545 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001546 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001547 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001548 op = 255;
1549 }
1550 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001551 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001552 }
1553}
1554
1555static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001556com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001557{
1558 int i;
1559 int op;
1560 REQ(n, and_expr);
1561 com_shift_expr(c, CHILD(n, 0));
1562 for (i = 2; i < NCH(n); i += 2) {
1563 com_shift_expr(c, CHILD(n, i));
1564 if (TYPE(CHILD(n, i-1)) == AMPER) {
1565 op = BINARY_AND;
1566 }
1567 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001568 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001569 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001570 op = 255;
1571 }
1572 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001573 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001574 }
1575}
1576
1577static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001578com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001579{
1580 int i;
1581 int op;
1582 REQ(n, xor_expr);
1583 com_and_expr(c, CHILD(n, 0));
1584 for (i = 2; i < NCH(n); i += 2) {
1585 com_and_expr(c, CHILD(n, i));
1586 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1587 op = BINARY_XOR;
1588 }
1589 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001590 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001591 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001592 op = 255;
1593 }
1594 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001595 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001596 }
1597}
1598
1599static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001600com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001601{
1602 int i;
1603 int op;
1604 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001605 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001606 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001607 com_xor_expr(c, CHILD(n, i));
1608 if (TYPE(CHILD(n, i-1)) == VBAR) {
1609 op = BINARY_OR;
1610 }
1611 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001612 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001613 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001614 op = 255;
1615 }
1616 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001617 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001618 }
1619}
1620
1621static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001622cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001623{
1624 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001625 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001626 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1627 if (NCH(n) == 1) {
1628 n = CHILD(n, 0);
1629 switch (TYPE(n)) {
1630 case LESS: return LT;
1631 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001632 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001633 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001634 case LESSEQUAL: return LE;
1635 case GREATEREQUAL: return GE;
1636 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001637 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1638 if (strcmp(STR(n), "is") == 0) return IS;
1639 }
1640 }
1641 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001642 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001643 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1644 return NOT_IN;
1645 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1646 return IS_NOT;
1647 }
1648 }
1649 return BAD;
1650}
1651
1652static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001653com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001654{
1655 int i;
1656 enum cmp_op op;
1657 int anchor;
1658 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1659 com_expr(c, CHILD(n, 0));
1660 if (NCH(n) == 1)
1661 return;
1662
1663 /****************************************************************
1664 The following code is generated for all but the last
1665 comparison in a chain:
1666
1667 label: on stack: opcode: jump to:
1668
1669 a <code to load b>
1670 a, b DUP_TOP
1671 a, b, b ROT_THREE
1672 b, a, b COMPARE_OP
1673 b, 0-or-1 JUMP_IF_FALSE L1
1674 b, 1 POP_TOP
1675 b
1676
1677 We are now ready to repeat this sequence for the next
1678 comparison in the chain.
1679
1680 For the last we generate:
1681
1682 b <code to load c>
1683 b, c COMPARE_OP
1684 0-or-1
1685
1686 If there were any jumps to L1 (i.e., there was more than one
1687 comparison), we generate:
1688
1689 0-or-1 JUMP_FORWARD L2
1690 L1: b, 0 ROT_TWO
1691 0, b POP_TOP
1692 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00001693 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001694 ****************************************************************/
1695
1696 anchor = 0;
1697
1698 for (i = 2; i < NCH(n); i += 2) {
1699 com_expr(c, CHILD(n, i));
1700 if (i+2 < NCH(n)) {
1701 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001702 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001703 com_addbyte(c, ROT_THREE);
1704 }
1705 op = cmp_type(CHILD(n, i-1));
1706 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001707 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001708 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001709 }
1710 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001711 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001712 if (i+2 < NCH(n)) {
1713 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1714 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001715 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001716 }
1717 }
1718
1719 if (anchor) {
1720 int anchor2 = 0;
1721 com_addfwref(c, JUMP_FORWARD, &anchor2);
1722 com_backpatch(c, anchor);
1723 com_addbyte(c, ROT_TWO);
1724 com_addbyte(c, POP_TOP);
1725 com_backpatch(c, anchor2);
1726 }
1727}
1728
1729static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001730com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001731{
1732 REQ(n, not_test); /* 'not' not_test | comparison */
1733 if (NCH(n) == 1) {
1734 com_comparison(c, CHILD(n, 0));
1735 }
1736 else {
1737 com_not_test(c, CHILD(n, 1));
1738 com_addbyte(c, UNARY_NOT);
1739 }
1740}
1741
1742static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001743com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001744{
1745 int i;
1746 int anchor;
1747 REQ(n, and_test); /* not_test ('and' not_test)* */
1748 anchor = 0;
1749 i = 0;
1750 for (;;) {
1751 com_not_test(c, CHILD(n, i));
1752 if ((i += 2) >= NCH(n))
1753 break;
1754 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1755 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001756 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001757 }
1758 if (anchor)
1759 com_backpatch(c, anchor);
1760}
1761
1762static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001763com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001764{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001765 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00001766 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001767 PyObject *v;
Guido van Rossum57531fe1993-11-30 14:57:42 +00001768 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001769 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001770 v = (PyObject *) icompile(CHILD(n, 0), c);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001771 if (v == NULL) {
1772 c->c_errors++;
1773 i = 255;
1774 }
1775 else {
1776 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001777 Py_DECREF(v);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001778 }
1779 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001780 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001781 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001782 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001783 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001784 else {
1785 int anchor = 0;
1786 int i = 0;
1787 for (;;) {
1788 com_and_test(c, CHILD(n, i));
1789 if ((i += 2) >= NCH(n))
1790 break;
1791 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1792 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001793 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001794 }
1795 if (anchor)
1796 com_backpatch(c, anchor);
1797 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001798}
1799
1800static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001801com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001802{
1803 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001804 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001805 com_node(c, CHILD(n, 0));
1806 }
1807 else {
1808 int i;
1809 int len;
1810 len = (NCH(n) + 1) / 2;
1811 for (i = 0; i < NCH(n); i += 2)
1812 com_node(c, CHILD(n, i));
1813 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001814 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001815 }
1816}
1817
1818
1819/* Begin of assignment compilation */
1820
Tim Petersdbd9ba62000-07-09 03:09:57 +00001821static void com_assign_name(struct compiling *, node *, int);
1822static void com_assign(struct compiling *, node *, int);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001823
1824static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001825com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001826{
1827 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001828 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001829}
1830
1831static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001832com_assign_trailer(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001833{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001834 REQ(n, trailer);
1835 switch (TYPE(CHILD(n, 0))) {
1836 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001837 com_error(c, PyExc_SyntaxError,
1838 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001839 break;
1840 case DOT: /* '.' NAME */
1841 com_assign_attr(c, CHILD(n, 1), assigning);
1842 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001843 case LSQB: /* '[' subscriptlist ']' */
1844 com_subscriptlist(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001845 break;
1846 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001847 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001848 }
1849}
1850
1851static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001852com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001853{
1854 int i;
1855 if (TYPE(n) != testlist)
1856 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001857 if (assigning) {
1858 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001859 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001860 com_push(c, i-1);
1861 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001862 for (i = 0; i < NCH(n); i += 2)
1863 com_assign(c, CHILD(n, i), assigning);
1864}
1865
1866static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001867com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001868{
1869 REQ(n, NAME);
1870 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001871 if (assigning)
1872 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001873}
1874
1875static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001876com_assign(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001877{
1878 /* Loop to avoid trivial recursion */
1879 for (;;) {
1880 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001881
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001882 case exprlist:
1883 case testlist:
1884 if (NCH(n) > 1) {
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001885 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001886 return;
1887 }
1888 n = CHILD(n, 0);
1889 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001890
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001891 case test:
1892 case and_test:
1893 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001894 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001895 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001896 case xor_expr:
1897 case and_expr:
1898 case shift_expr:
1899 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001900 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00001901 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001902 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001903 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001904 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001905 return;
1906 }
1907 n = CHILD(n, 0);
1908 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001909
Guido van Rossum50564e81996-01-12 01:13:16 +00001910 case power: /* atom trailer* ('**' power)* */
1911/* ('+'|'-'|'~') factor | atom trailer* */
1912 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001913 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001914 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001915 return;
1916 }
Guido van Rossum50564e81996-01-12 01:13:16 +00001917 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001918 int i;
1919 com_node(c, CHILD(n, 0));
1920 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00001921 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001922 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001923 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00001924 return;
1925 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001926 com_apply_trailer(c, CHILD(n, i));
1927 } /* NB i is still alive */
1928 com_assign_trailer(c,
1929 CHILD(n, i), assigning);
1930 return;
1931 }
1932 n = CHILD(n, 0);
1933 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001934
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001935 case atom:
1936 switch (TYPE(CHILD(n, 0))) {
1937 case LPAR:
1938 n = CHILD(n, 1);
1939 if (TYPE(n) == RPAR) {
1940 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001941 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001942 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001943 return;
1944 }
1945 break;
1946 case LSQB:
1947 n = CHILD(n, 1);
1948 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001949 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001950 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001951 return;
1952 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001953 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001954 return;
1955 case NAME:
1956 com_assign_name(c, CHILD(n, 0), assigning);
1957 return;
1958 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001959 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001960 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001961 return;
1962 }
1963 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001964
1965 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001966 com_error(c, PyExc_SyntaxError,
1967 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001968 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001969
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001970 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001971 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001972 com_error(c, PyExc_SystemError,
1973 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001974 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001975
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001976 }
1977 }
1978}
Guido van Rossum7c531111997-03-11 18:42:21 +00001979
Tim Petersdbd9ba62000-07-09 03:09:57 +00001980/* Forward */ static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001981
1982static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001983com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001984{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001985 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001986 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001987 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001988 return;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001989 com_node(c, CHILD(n, NCH(n)-1));
1990 if (NCH(n) == 1) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001991 if (c->c_interactive)
1992 com_addbyte(c, PRINT_EXPR);
1993 else
1994 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001995 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001996 }
1997 else {
1998 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001999 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002000 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002001 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002002 com_push(c, 1);
2003 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002004 com_assign(c, CHILD(n, i), OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002005 }
2006 }
2007}
2008
2009static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002010com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002011{
2012 int a = 0, b = 0;
2013 int i;
2014 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2015 /* Generate code like for
2016
2017 if __debug__:
2018 if not <test>:
2019 raise AssertionError [, <message>]
2020
2021 where <message> is the second test, if present.
2022 */
2023 if (Py_OptimizeFlag)
2024 return;
2025 com_addopnamestr(c, LOAD_GLOBAL, "__debug__");
2026 com_push(c, 1);
2027 com_addfwref(c, JUMP_IF_FALSE, &a);
2028 com_addbyte(c, POP_TOP);
2029 com_pop(c, 1);
2030 com_node(c, CHILD(n, 1));
2031 com_addfwref(c, JUMP_IF_TRUE, &b);
2032 com_addbyte(c, POP_TOP);
2033 com_pop(c, 1);
2034 /* Raise that exception! */
2035 com_addopnamestr(c, LOAD_GLOBAL, "AssertionError");
2036 com_push(c, 1);
2037 i = NCH(n)/2; /* Either 2 or 4 */
2038 if (i > 1)
2039 com_node(c, CHILD(n, 3));
2040 com_addoparg(c, RAISE_VARARGS, i);
2041 com_pop(c, i);
2042 /* The interpreter does not fall through */
2043 /* All jumps converge here */
2044 com_backpatch(c, a);
2045 com_backpatch(c, b);
2046 com_addbyte(c, POP_TOP);
2047}
2048
2049static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002050com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002051{
2052 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002053 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
2054 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002055 com_node(c, CHILD(n, i));
2056 com_addbyte(c, PRINT_ITEM);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002057 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002058 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002059 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002060 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002061 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002062}
2063
2064static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002065com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002066{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002067 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002068 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002069 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002070 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002071 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002072 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002073 com_push(c, 1);
2074 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002075 else
2076 com_node(c, CHILD(n, 1));
2077 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002078 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002079}
2080
2081static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002082com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002083{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002084 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002085 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2086 if (NCH(n) > 1) {
2087 com_node(c, CHILD(n, 1));
2088 if (NCH(n) > 3) {
2089 com_node(c, CHILD(n, 3));
2090 if (NCH(n) > 5)
2091 com_node(c, CHILD(n, 5));
2092 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002093 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002094 i = NCH(n)/2;
2095 com_addoparg(c, RAISE_VARARGS, i);
2096 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002097}
2098
2099static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002100com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002101{
2102 int i;
2103 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002104 /* 'import' dotted_name (',' dotted_name)* |
2105 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002106 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002107 /* 'from' dotted_name 'import' ... */
2108 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002109 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002110 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002111 for (i = 3; i < NCH(n); i += 2)
2112 com_addopname(c, IMPORT_FROM, CHILD(n, i));
2113 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002114 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002115 }
2116 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002117 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002118 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002119 REQ(CHILD(n, i), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002120 com_addopname(c, IMPORT_NAME, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002121 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002122 com_addopname(c, STORE_NAME, CHILD(CHILD(n, i), 0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002123 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002124 }
2125 }
2126}
2127
2128static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002129com_global_stmt(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002130{
2131 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002132 REQ(n, global_stmt);
2133 /* 'global' NAME (',' NAME)* */
2134 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002135 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002136#ifdef PRIVATE_NAME_MANGLING
2137 char buffer[256];
2138 if (s != NULL && s[0] == '_' && s[1] == '_' &&
2139 c->c_private != NULL &&
Guido van Rossum582acec2000-06-28 22:07:35 +00002140 com_mangle(c, s, buffer, sizeof(buffer)))
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002141 s = buffer;
2142#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +00002143 if (PyDict_GetItemString(c->c_locals, s) != NULL) {
2144 com_error(c, PyExc_SyntaxError,
2145 "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002146 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002147 else if (PyDict_SetItemString(c->c_globals, s, Py_None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002148 c->c_errors++;
2149 }
2150}
2151
Guido van Rossum681d79a1995-07-18 14:51:37 +00002152static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002153com_newlocal_o(struct compiling *c, PyObject *nameval)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002154{
2155 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002156 PyObject *ival;
2157 if (PyList_Size(c->c_varnames) != c->c_nlocals) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002158 /* This is usually caused by an error on a previous call */
2159 if (c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002160 com_error(c, PyExc_SystemError,
2161 "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002162 }
2163 return 0;
2164 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002165 ival = PyInt_FromLong(i = c->c_nlocals++);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002166 if (ival == NULL)
2167 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002168 else if (PyDict_SetItem(c->c_locals, nameval, ival) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002169 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002170 else if (PyList_Append(c->c_varnames, nameval) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002171 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002172 Py_XDECREF(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002173 return i;
2174}
2175
2176static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002177com_addlocal_o(struct compiling *c, PyObject *nameval)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002178{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002179 PyObject *ival = PyDict_GetItem(c->c_locals, nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002180 if (ival != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002181 return PyInt_AsLong(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002182 return com_newlocal_o(c, nameval);
2183}
2184
2185static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002186com_newlocal(struct compiling *c, char *name)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002187{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002188 PyObject *nameval = PyString_InternFromString(name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002189 int i;
2190 if (nameval == NULL) {
2191 c->c_errors++;
2192 return 0;
2193 }
2194 i = com_newlocal_o(c, nameval);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002195 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002196 return i;
2197}
2198
Guido van Rossumc5e96291991-12-10 13:53:51 +00002199static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002200com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002201{
2202 REQ(n, exec_stmt);
2203 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2204 com_node(c, CHILD(n, 1));
2205 if (NCH(n) >= 4)
2206 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002207 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002208 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002209 com_push(c, 1);
2210 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002211 if (NCH(n) >= 6)
2212 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002213 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002214 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002215 com_push(c, 1);
2216 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002217 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002218 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002219}
2220
Guido van Rossum7c531111997-03-11 18:42:21 +00002221static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002222is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002223{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002224 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002225 int i;
2226
2227 /* Label to avoid tail recursion */
2228 next:
2229 switch (TYPE(n)) {
2230
2231 case suite:
2232 if (NCH(n) == 1) {
2233 n = CHILD(n, 0);
2234 goto next;
2235 }
2236 /* Fall through */
2237 case file_input:
2238 for (i = 0; i < NCH(n); i++) {
2239 node *ch = CHILD(n, i);
2240 if (TYPE(ch) == stmt) {
2241 n = ch;
2242 goto next;
2243 }
2244 }
2245 break;
2246
2247 case stmt:
2248 case simple_stmt:
2249 case small_stmt:
2250 n = CHILD(n, 0);
2251 goto next;
2252
2253 case expr_stmt:
2254 case testlist:
2255 case test:
2256 case and_test:
2257 case not_test:
2258 case comparison:
2259 case expr:
2260 case xor_expr:
2261 case and_expr:
2262 case shift_expr:
2263 case arith_expr:
2264 case term:
2265 case factor:
2266 case power:
2267 case atom:
2268 if (NCH(n) == 1) {
2269 n = CHILD(n, 0);
2270 goto next;
2271 }
2272 break;
2273
2274 case NAME:
2275 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2276 return 1;
2277 break;
2278
2279 case NUMBER:
2280 v = parsenumber(c, STR(n));
2281 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002282 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002283 break;
2284 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002285 i = PyObject_IsTrue(v);
2286 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002287 return i == 0;
2288
2289 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002290 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002291 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002292 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002293 break;
2294 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002295 i = PyObject_IsTrue(v);
2296 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002297 return i == 0;
2298
2299 }
2300 return 0;
2301}
2302
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002303static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002304com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002305{
2306 int i;
2307 int anchor = 0;
2308 REQ(n, if_stmt);
2309 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2310 for (i = 0; i+3 < NCH(n); i+=4) {
2311 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002312 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002313 if (is_constant_false(c, ch))
2314 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002315 if (i > 0)
2316 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002317 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002318 com_addfwref(c, JUMP_IF_FALSE, &a);
2319 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002320 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002321 com_node(c, CHILD(n, i+3));
2322 com_addfwref(c, JUMP_FORWARD, &anchor);
2323 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002324 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002325 com_addbyte(c, POP_TOP);
2326 }
2327 if (i+2 < NCH(n))
2328 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002329 if (anchor)
2330 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002331}
2332
2333static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002334com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002335{
2336 int break_anchor = 0;
2337 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002338 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002339 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2340 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002341 block_push(c, SETUP_LOOP);
2342 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002343 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002344 com_node(c, CHILD(n, 1));
2345 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2346 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002347 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002348 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002349 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002350 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002351 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2352 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002353 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002354 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002355 com_addbyte(c, POP_TOP);
2356 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002357 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002358 if (NCH(n) > 4)
2359 com_node(c, CHILD(n, 6));
2360 com_backpatch(c, break_anchor);
2361}
2362
2363static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002364com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002365{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002366 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002367 int break_anchor = 0;
2368 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002369 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002370 REQ(n, for_stmt);
2371 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2372 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002373 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002374 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002375 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002376 if (v == NULL)
2377 c->c_errors++;
2378 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002379 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002380 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002381 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002382 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002383 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002384 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002385 com_assign(c, CHILD(n, 1), OP_ASSIGN);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002386 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002387 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002388 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002389 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2390 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002391 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002392 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002393 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002394 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002395 if (NCH(n) > 8)
2396 com_node(c, CHILD(n, 8));
2397 com_backpatch(c, break_anchor);
2398}
2399
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002400/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002401
2402 SETUP_FINALLY L
2403 <code for S>
2404 POP_BLOCK
2405 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002406 L: <code for Sf>
2407 END_FINALLY
2408
2409 The special instructions use the block stack. Each block
2410 stack entry contains the instruction that created it (here
2411 SETUP_FINALLY), the level of the value stack at the time the
2412 block stack entry was created, and a label (here L).
2413
2414 SETUP_FINALLY:
2415 Pushes the current value stack level and the label
2416 onto the block stack.
2417 POP_BLOCK:
2418 Pops en entry from the block stack, and pops the value
2419 stack until its level is the same as indicated on the
2420 block stack. (The label is ignored.)
2421 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002422 Pops a variable number of entries from the *value* stack
2423 and re-raises the exception they specify. The number of
2424 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002425
2426 The block stack is unwound when an exception is raised:
2427 when a SETUP_FINALLY entry is found, the exception is pushed
2428 onto the value stack (and the exception condition is cleared),
2429 and the interpreter jumps to the label gotten from the block
2430 stack.
2431
2432 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002433 (The contents of the value stack is shown in [], with the top
2434 at the right; 'tb' is trace-back info, 'val' the exception's
2435 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002436
2437 Value stack Label Instruction Argument
2438 [] SETUP_EXCEPT L1
2439 [] <code for S>
2440 [] POP_BLOCK
2441 [] JUMP_FORWARD L0
2442
Guido van Rossum3f5da241990-12-20 15:06:42 +00002443 [tb, val, exc] L1: DUP )
2444 [tb, val, exc, exc] <evaluate E1> )
2445 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2446 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2447 [tb, val, exc, 1] POP )
2448 [tb, val, exc] POP
2449 [tb, val] <assign to V1> (or POP if no V1)
2450 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002451 [] <code for S1>
2452 JUMP_FORWARD L0
2453
Guido van Rossum3f5da241990-12-20 15:06:42 +00002454 [tb, val, exc, 0] L2: POP
2455 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002456 .............................etc.......................
2457
Guido van Rossum3f5da241990-12-20 15:06:42 +00002458 [tb, val, exc, 0] Ln+1: POP
2459 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002460
2461 [] L0: <next statement>
2462
2463 Of course, parts are not generated if Vi or Ei is not present.
2464*/
2465
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002466static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002467com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002468{
2469 int except_anchor = 0;
2470 int end_anchor = 0;
2471 int else_anchor = 0;
2472 int i;
2473 node *ch;
2474
2475 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2476 block_push(c, SETUP_EXCEPT);
2477 com_node(c, CHILD(n, 2));
2478 com_addbyte(c, POP_BLOCK);
2479 block_pop(c, SETUP_EXCEPT);
2480 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2481 com_backpatch(c, except_anchor);
2482 for (i = 3;
2483 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2484 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002485 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002486 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002487 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002488 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002489 break;
2490 }
2491 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002492 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002493 com_addoparg(c, SET_LINENO, ch->n_lineno);
2494 if (NCH(ch) > 1) {
2495 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002496 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002497 com_node(c, CHILD(ch, 1));
2498 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002499 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002500 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2501 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002502 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002503 }
2504 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002505 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002506 if (NCH(ch) > 3)
Guido van Rossum8861b741996-07-30 16:49:37 +00002507 com_assign(c, CHILD(ch, 3), OP_ASSIGN);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002508 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002509 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002510 com_pop(c, 1);
2511 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002512 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002513 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002514 com_node(c, CHILD(n, i+2));
2515 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2516 if (except_anchor) {
2517 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002518 /* We come in with [tb, val, exc, 0] on the
2519 stack; one pop and it's the same as
2520 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002521 com_addbyte(c, POP_TOP);
2522 }
2523 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002524 /* We actually come in here with [tb, val, exc] but the
2525 END_FINALLY will zap those and jump around.
2526 The c_stacklevel does not reflect them so we need not pop
2527 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002528 com_addbyte(c, END_FINALLY);
2529 com_backpatch(c, else_anchor);
2530 if (i < NCH(n))
2531 com_node(c, CHILD(n, i+2));
2532 com_backpatch(c, end_anchor);
2533}
2534
2535static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002536com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002537{
2538 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002539 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002540
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002541 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2542 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002543 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002544 com_addbyte(c, POP_BLOCK);
2545 block_pop(c, SETUP_FINALLY);
2546 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002547 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002548 /* While the generated code pushes only one item,
2549 the try-finally handling can enter here with
2550 up to three items. OK, here are the details:
2551 3 for an exception, 2 for RETURN, 1 for BREAK. */
2552 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002553 com_backpatch(c, finally_anchor);
2554 ch = CHILD(n, NCH(n)-1);
2555 com_addoparg(c, SET_LINENO, ch->n_lineno);
2556 com_node(c, ch);
2557 com_addbyte(c, END_FINALLY);
2558 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002559 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002560}
2561
2562static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002563com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002564{
2565 REQ(n, try_stmt);
2566 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2567 | 'try' ':' suite 'finally' ':' suite */
2568 if (TYPE(CHILD(n, 3)) != except_clause)
2569 com_try_finally(c, n);
2570 else
2571 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002572}
2573
Guido van Rossum8b993a91997-01-17 21:04:03 +00002574static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002575get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002576{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002577 int i;
2578
Guido van Rossum8b993a91997-01-17 21:04:03 +00002579 /* Label to avoid tail recursion */
2580 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002581 switch (TYPE(n)) {
2582
2583 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002584 if (NCH(n) == 1) {
2585 n = CHILD(n, 0);
2586 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002587 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002588 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002589 case file_input:
2590 for (i = 0; i < NCH(n); i++) {
2591 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002592 if (TYPE(ch) == stmt) {
2593 n = ch;
2594 goto next;
2595 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002596 }
2597 break;
2598
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002599 case stmt:
2600 case simple_stmt:
2601 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002602 n = CHILD(n, 0);
2603 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002604
2605 case expr_stmt:
2606 case testlist:
2607 case test:
2608 case and_test:
2609 case not_test:
2610 case comparison:
2611 case expr:
2612 case xor_expr:
2613 case and_expr:
2614 case shift_expr:
2615 case arith_expr:
2616 case term:
2617 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002618 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002619 if (NCH(n) == 1) {
2620 n = CHILD(n, 0);
2621 goto next;
2622 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002623 break;
2624
2625 case atom:
2626 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002627 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002628 break;
2629
2630 }
2631 return NULL;
2632}
2633
Guido van Rossum79f25d91997-04-29 20:08:16 +00002634static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002635get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002636{
Guido van Rossum541563e1999-01-28 15:08:09 +00002637 /* Don't generate doc-strings if run with -OO */
2638 if (Py_OptimizeFlag > 1)
2639 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002640 n = get_rawdocstring(n);
2641 if (n == NULL)
2642 return NULL;
2643 return parsestrplus(n);
2644}
2645
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002646static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002647com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002648{
2649 REQ(n, suite);
2650 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2651 if (NCH(n) == 1) {
2652 com_node(c, CHILD(n, 0));
2653 }
2654 else {
2655 int i;
2656 for (i = 0; i < NCH(n); i++) {
2657 node *ch = CHILD(n, i);
2658 if (TYPE(ch) == stmt)
2659 com_node(c, ch);
2660 }
2661 }
2662}
2663
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002664/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002665static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002666com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002667{
2668 int i = c->c_nblocks;
2669 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2670 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2671 }
2672 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002673 com_error(c, PyExc_SyntaxError,
2674 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002675 }
2676 /* XXX Could allow it inside a 'finally' clause
2677 XXX if we could pop the exception still on the stack */
2678}
2679
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002680static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002681com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002682{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002683 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002684 if (TYPE(n) == lambdef) {
2685 /* lambdef: 'lambda' [varargslist] ':' test */
2686 n = CHILD(n, 1);
2687 }
2688 else {
2689 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2690 n = CHILD(n, 2);
2691 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2692 n = CHILD(n, 1);
2693 }
2694 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002695 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002696 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002697 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002698 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2699 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002700 nargs = 0;
2701 ndefs = 0;
2702 for (i = 0; i < nch; i++) {
2703 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002704 if (TYPE(CHILD(n, i)) == STAR ||
2705 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002706 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002707 nargs++;
2708 i++;
2709 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002710 t = RPAR; /* Anything except EQUAL or COMMA */
2711 else
2712 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002713 if (t == EQUAL) {
2714 i++;
2715 ndefs++;
2716 com_node(c, CHILD(n, i));
2717 i++;
2718 if (i >= nch)
2719 break;
2720 t = TYPE(CHILD(n, i));
2721 }
2722 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00002723 /* Treat "(a=1, b)" as an error */
2724 if (ndefs)
2725 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00002726 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002727 }
2728 if (t != COMMA)
2729 break;
2730 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002731 return ndefs;
2732}
2733
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002734static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002735com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002736{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002737 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002738 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002739 v = (PyObject *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002740 if (v == NULL)
2741 c->c_errors++;
2742 else {
2743 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002744 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002745 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002746 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002747 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002748 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002749 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002750 com_pop(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002751 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002752 }
2753}
2754
2755static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002756com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002757{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002758 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002759 REQ(n, testlist);
2760 /* testlist: test (',' test)* [','] */
2761 for (i = 0; i < NCH(n); i += 2)
2762 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002763 i = (NCH(n)+1) / 2;
2764 com_addoparg(c, BUILD_TUPLE, i);
2765 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00002766}
2767
2768static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002769com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002770{
Guido van Rossum25831651993-05-19 14:50:45 +00002771 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002772 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002773 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002774 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00002775 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00002776 c->c_errors++;
2777 return;
2778 }
2779 /* Push the class name on the stack */
2780 i = com_addconst(c, v);
2781 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002782 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002783 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00002784 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002785 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00002786 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002787 com_push(c, 1);
2788 }
Guido van Rossum25831651993-05-19 14:50:45 +00002789 else
2790 com_bases(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002791 v = (PyObject *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002792 if (v == NULL)
2793 c->c_errors++;
2794 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002795 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002796 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002797 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002798 com_addoparg(c, MAKE_FUNCTION, 0);
2799 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002800 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002801 com_pop(c, 2);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002802 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002803 Py_DECREF(v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002804 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002805}
2806
2807static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002808com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002809{
2810 switch (TYPE(n)) {
2811
2812 /* Definition nodes */
2813
2814 case funcdef:
2815 com_funcdef(c, n);
2816 break;
2817 case classdef:
2818 com_classdef(c, n);
2819 break;
2820
2821 /* Trivial parse tree nodes */
2822
2823 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002824 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002825 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002826 com_node(c, CHILD(n, 0));
2827 break;
2828
2829 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002830 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2831 com_addoparg(c, SET_LINENO, n->n_lineno);
2832 {
2833 int i;
2834 for (i = 0; i < NCH(n)-1; i += 2)
2835 com_node(c, CHILD(n, i));
2836 }
2837 break;
2838
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002839 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002840 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002841 com_node(c, CHILD(n, 0));
2842 break;
2843
2844 /* Statement nodes */
2845
2846 case expr_stmt:
2847 com_expr_stmt(c, n);
2848 break;
2849 case print_stmt:
2850 com_print_stmt(c, n);
2851 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002852 case del_stmt: /* 'del' exprlist */
Guido van Rossum8861b741996-07-30 16:49:37 +00002853 com_assign(c, CHILD(n, 1), OP_DELETE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002854 break;
2855 case pass_stmt:
2856 break;
2857 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002858 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002859 com_error(c, PyExc_SyntaxError,
2860 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002861 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002862 com_addbyte(c, BREAK_LOOP);
2863 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002864 case continue_stmt:
2865 com_continue_stmt(c, n);
2866 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002867 case return_stmt:
2868 com_return_stmt(c, n);
2869 break;
2870 case raise_stmt:
2871 com_raise_stmt(c, n);
2872 break;
2873 case import_stmt:
2874 com_import_stmt(c, n);
2875 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002876 case global_stmt:
2877 com_global_stmt(c, n);
2878 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002879 case exec_stmt:
2880 com_exec_stmt(c, n);
2881 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002882 case assert_stmt:
2883 com_assert_stmt(c, n);
2884 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002885 case if_stmt:
2886 com_if_stmt(c, n);
2887 break;
2888 case while_stmt:
2889 com_while_stmt(c, n);
2890 break;
2891 case for_stmt:
2892 com_for_stmt(c, n);
2893 break;
2894 case try_stmt:
2895 com_try_stmt(c, n);
2896 break;
2897 case suite:
2898 com_suite(c, n);
2899 break;
2900
2901 /* Expression nodes */
2902
2903 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002904 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002905 break;
2906 case test:
2907 com_test(c, n);
2908 break;
2909 case and_test:
2910 com_and_test(c, n);
2911 break;
2912 case not_test:
2913 com_not_test(c, n);
2914 break;
2915 case comparison:
2916 com_comparison(c, n);
2917 break;
2918 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002919 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002920 break;
2921 case expr:
2922 com_expr(c, n);
2923 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002924 case xor_expr:
2925 com_xor_expr(c, n);
2926 break;
2927 case and_expr:
2928 com_and_expr(c, n);
2929 break;
2930 case shift_expr:
2931 com_shift_expr(c, n);
2932 break;
2933 case arith_expr:
2934 com_arith_expr(c, n);
2935 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002936 case term:
2937 com_term(c, n);
2938 break;
2939 case factor:
2940 com_factor(c, n);
2941 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00002942 case power:
2943 com_power(c, n);
2944 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002945 case atom:
2946 com_atom(c, n);
2947 break;
2948
2949 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002950 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002951 com_error(c, PyExc_SystemError,
2952 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002953 }
2954}
2955
Tim Petersdbd9ba62000-07-09 03:09:57 +00002956static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002957
2958static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002959com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002960{
2961 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
2962 if (TYPE(CHILD(n, 0)) == LPAR)
2963 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002964 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002965 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002966 com_pop(c, 1);
2967 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002968}
2969
2970static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002971com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002972{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00002973 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002974 if (NCH(n) == 1) {
2975 com_fpdef(c, CHILD(n, 0));
2976 }
2977 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002978 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002979 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002980 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002981 for (i = 0; i < NCH(n); i += 2)
2982 com_fpdef(c, CHILD(n, i));
2983 }
2984}
2985
2986static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002987com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002988{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002989 int nch, i;
2990 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00002991 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002992 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00002993 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002994 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002995 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002996 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002997 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002998 node *ch = CHILD(n, i);
2999 node *fp;
3000 char *name;
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003001 PyObject *nameval;
Guido van Rossum50564e81996-01-12 01:13:16 +00003002 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003003 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003004 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3005 fp = CHILD(ch, 0);
3006 if (TYPE(fp) == NAME)
3007 name = STR(fp);
3008 else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003009 name = nbuf;
3010 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003011 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003012 }
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003013 nameval = PyString_InternFromString(name);
3014 if (nameval == NULL) {
3015 c->c_errors++;
3016 }
Peter Schneider-Kamp9a5086c2000-07-13 06:24:29 +00003017 if (PyDict_GetItem(c->c_locals, nameval)) {
Fred Drakedcf08e02000-08-15 15:49:44 +00003018 com_error(c, PyExc_SyntaxError,
3019 "duplicate argument in function definition");
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003020 }
3021 com_newlocal_o(c, nameval);
3022 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003023 c->c_argcount++;
3024 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003025 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003026 ch = CHILD(n, i);
3027 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003028 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003029 else
3030 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003031 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003032 /* Handle *arguments */
3033 if (i < nch) {
3034 node *ch;
3035 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003036 if (TYPE(ch) != DOUBLESTAR) {
3037 REQ(ch, STAR);
3038 ch = CHILD(n, i+1);
3039 if (TYPE(ch) == NAME) {
3040 c->c_flags |= CO_VARARGS;
3041 i += 3;
3042 com_newlocal(c, STR(ch));
3043 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003044 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003045 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003046 /* Handle **keywords */
3047 if (i < nch) {
3048 node *ch;
3049 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003050 if (TYPE(ch) != DOUBLESTAR) {
3051 REQ(ch, STAR);
3052 ch = CHILD(n, i+1);
3053 REQ(ch, STAR);
3054 ch = CHILD(n, i+2);
3055 }
3056 else
3057 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003058 REQ(ch, NAME);
3059 c->c_flags |= CO_VARKEYWORDS;
3060 com_newlocal(c, STR(ch));
3061 }
3062 if (complex) {
3063 /* Generate code for complex arguments only after
3064 having counted the simple arguments */
3065 int ilocal = 0;
3066 for (i = 0; i < nch; i++) {
3067 node *ch = CHILD(n, i);
3068 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003069 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003070 break;
3071 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3072 fp = CHILD(ch, 0);
3073 if (TYPE(fp) != NAME) {
3074 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003075 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003076 com_fpdef(c, ch);
3077 }
3078 ilocal++;
3079 if (++i >= nch)
3080 break;
3081 ch = CHILD(n, i);
3082 if (TYPE(ch) == EQUAL)
3083 i += 2;
3084 else
3085 REQ(ch, COMMA);
3086 }
3087 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003088}
3089
3090static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003091com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003092{
3093 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003094 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003095 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003096 doc = get_docstring(n);
3097 if (doc != NULL) {
3098 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003099 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003100 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003101 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003102 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003103 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003104 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003105 for (i = 0; i < NCH(n); i++) {
3106 node *ch = CHILD(n, i);
3107 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3108 com_node(c, ch);
3109 }
3110}
3111
3112/* Top-level compile-node interface */
3113
3114static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003115compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003116{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003117 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003118 node *ch;
3119 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003120 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003121 doc = get_docstring(CHILD(n, 4));
3122 if (doc != NULL) {
3123 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003124 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003125 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003126 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003127 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003128 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3129 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003130 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003131 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003132 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003133 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003134 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003135 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003136 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003137 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003138 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003139}
3140
3141static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003142compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003143{
Guido van Rossum590baa41993-11-30 13:40:46 +00003144 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003145 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003146 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003147
3148 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003149 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003150 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003151 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003152 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003153 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003154 else
3155 ch = CHILD(n, 2);
3156 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003157 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003158 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003159}
3160
3161static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003162compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003163{
3164 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003165 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003166 REQ(n, classdef);
3167 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3168 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003169#ifdef PRIVATE_NAME_MANGLING
3170 c->c_private = c->c_name;
3171#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003172 ch = CHILD(n, NCH(n)-1); /* The suite */
3173 doc = get_docstring(ch);
3174 if (doc != NULL) {
3175 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003176 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003177 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003178 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003179 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003180 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003181 }
3182 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003183 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003184 com_node(c, ch);
3185 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003186 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003187 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003188 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003189}
3190
3191static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003192compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003193{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003194 com_addoparg(c, SET_LINENO, n->n_lineno);
3195
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003196 switch (TYPE(n)) {
3197
Guido van Rossum4c417781991-01-21 16:09:22 +00003198 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003199 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003200 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003201 n = CHILD(n, 0);
3202 if (TYPE(n) != NEWLINE)
3203 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003204 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003205 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003206 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003207 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003208 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003209 break;
3210
Guido van Rossum4c417781991-01-21 16:09:22 +00003211 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003212 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003213 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003214 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003215 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003216 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003217 break;
3218
Guido van Rossum590baa41993-11-30 13:40:46 +00003219 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003220 com_node(c, CHILD(n, 0));
3221 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003222 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003223 break;
3224
Guido van Rossum590baa41993-11-30 13:40:46 +00003225 case lambdef: /* anonymous function definition */
3226 compile_lambdef(c, n);
3227 break;
3228
Guido van Rossum4c417781991-01-21 16:09:22 +00003229 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003230 compile_funcdef(c, n);
3231 break;
3232
Guido van Rossum4c417781991-01-21 16:09:22 +00003233 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003234 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003235 break;
3236
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003237 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003238 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003239 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003240 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003241 }
3242}
3243
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003244/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00003245
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003246 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
3247 instructions that refer to local variables with LOAD_FAST etc.
3248 The latter instructions are much faster because they don't need to
3249 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003250
Guido van Rossum681d79a1995-07-18 14:51:37 +00003251 To find all local variables, we check all STORE_NAME, IMPORT_FROM
3252 and DELETE_NAME instructions. This yields all local variables,
3253 function definitions, class definitions and import statements.
3254 Argument names have already been entered into the list by the
3255 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003256
3257 All remaining LOAD_NAME instructions must refer to non-local (global
3258 or builtin) variables, so are replaced by LOAD_GLOBAL.
3259
3260 There are two problems: 'from foo import *' and 'exec' may introduce
3261 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00003262 case, we can still optimize bona fide locals (since those
3263 statements will be surrounded by fast_2_locals() and
3264 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003265
Guido van Rossum681d79a1995-07-18 14:51:37 +00003266 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00003267
3268static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003269optimize(struct compiling *c)
Guido van Rossum282914b1991-04-04 10:42:56 +00003270{
Guido van Rossum0a697f61991-04-16 08:39:12 +00003271 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00003272 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00003273 int oparg = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003274 PyObject *name;
3275 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003276
Guido van Rossum282914b1991-04-04 10:42:56 +00003277#define NEXTOP() (*next_instr++)
3278#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossum79f25d91997-04-29 20:08:16 +00003279#define GETITEM(v, i) (PyList_GetItem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003280#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
3281
Guido van Rossum79f25d91997-04-29 20:08:16 +00003282 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003283
3284 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00003285
Guido van Rossum79f25d91997-04-29 20:08:16 +00003286 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003287 for (;;) {
3288 opcode = NEXTOP();
3289 if (opcode == STOP_CODE)
3290 break;
3291 if (HAS_ARG(opcode))
3292 oparg = NEXTARG();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003293 switch (opcode) {
3294 case STORE_NAME:
3295 case DELETE_NAME:
3296 case IMPORT_FROM:
3297 com_addlocal_o(c, GETNAMEOBJ(oparg));
3298 break;
3299 case EXEC_STMT:
3300 c->c_flags &= ~CO_OPTIMIZED;
3301 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00003302 }
3303 }
3304
Guido van Rossum79f25d91997-04-29 20:08:16 +00003305 if (PyDict_GetItemString(c->c_locals, "*") != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003306 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003307
Guido van Rossum79f25d91997-04-29 20:08:16 +00003308 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003309 for (;;) {
3310 cur_instr = next_instr;
3311 opcode = NEXTOP();
3312 if (opcode == STOP_CODE)
3313 break;
3314 if (HAS_ARG(opcode))
3315 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003316 if (opcode == LOAD_NAME ||
3317 opcode == STORE_NAME ||
3318 opcode == DELETE_NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003319 PyObject *v;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003320 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00003321 name = GETNAMEOBJ(oparg);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003322 v = PyDict_GetItem(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003323 if (v == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003324 if (opcode == LOAD_NAME &&
3325 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003326 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003327 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00003328 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003329 i = PyInt_AsLong(v);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003330 switch (opcode) {
3331 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
3332 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
3333 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
3334 }
3335 cur_instr[1] = i & 0xff;
3336 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00003337 }
3338 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003339
Guido van Rossum681d79a1995-07-18 14:51:37 +00003340 if (c->c_errors == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00003341 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00003342}
3343
Guido van Rossum79f25d91997-04-29 20:08:16 +00003344PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003345PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003346{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003347 return jcompile(n, filename, NULL);
3348}
3349
Guido van Rossum79f25d91997-04-29 20:08:16 +00003350static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003351icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003352{
3353 return jcompile(n, base->c_filename, base);
3354}
3355
Guido van Rossum79f25d91997-04-29 20:08:16 +00003356static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003357jcompile(node *n, char *filename, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003358{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003359 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003360 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003361 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003362 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003363#ifdef PRIVATE_NAME_MANGLING
3364 if (base)
3365 sc.c_private = base->c_private;
3366 else
3367 sc.c_private = NULL;
3368#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003369 compile_node(&sc, n);
3370 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003371 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003372 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003373 sc.c_flags |= CO_NEWLOCALS;
3374 }
3375 else if (TYPE(n) == classdef)
3376 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00003377 co = NULL;
3378 if (sc.c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003379 PyObject *consts, *names, *varnames, *filename, *name;
3380 consts = PyList_AsTuple(sc.c_consts);
3381 names = PyList_AsTuple(sc.c_names);
3382 varnames = PyList_AsTuple(sc.c_varnames);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003383 filename = PyString_InternFromString(sc.c_filename);
3384 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003385 if (!PyErr_Occurred())
3386 co = PyCode_New(sc.c_argcount,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003387 sc.c_nlocals,
Guido van Rossum8b993a91997-01-17 21:04:03 +00003388 sc.c_maxstacklevel,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003389 sc.c_flags,
3390 sc.c_code,
3391 consts,
3392 names,
3393 varnames,
3394 filename,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003395 name,
3396 sc.c_firstlineno,
3397 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003398 Py_XDECREF(consts);
3399 Py_XDECREF(names);
3400 Py_XDECREF(varnames);
3401 Py_XDECREF(filename);
3402 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003403 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003404 else if (!PyErr_Occurred()) {
3405 /* This could happen if someone called PyErr_Clear() after an
3406 error was reported above. That's not supposed to happen,
3407 but I just plugged one case and I'm not sure there can't be
3408 others. In that case, raise SystemError so that at least
3409 it gets reported instead dumping core. */
3410 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3411 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003412 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003413 return co;
3414}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003415
3416int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003417PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003418{
3419 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003420 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003421 int line = co->co_firstlineno;
3422 int addr = 0;
3423 while (--size >= 0) {
3424 addr += *p++;
3425 if (addr > addrq)
3426 break;
3427 line += *p++;
3428 }
3429 return line;
3430}