blob: 476f1f20bfa04ccfbb696b6559072487c3898d25 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009******************************************************************/
10
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011/* Compile an expression node to intermediate code */
12
Guido van Rossum3f5da241990-12-20 15:06:42 +000013/* XXX TO DO:
Guido van Rossum8b993a91997-01-17 21:04:03 +000014 XXX add __doc__ attribute == co_doc to code object attributes?
15 XXX (it's currently the first item of the co_const tuple)
Guido van Rossum3f5da241990-12-20 15:06:42 +000016 XXX Generate simple jump for break/return outside 'try...finally'
Guido van Rossum8b993a91997-01-17 21:04:03 +000017 XXX Allow 'continue' inside try-finally
Guido van Rossum8b993a91997-01-17 21:04:03 +000018 XXX New opcode for loading the initial index for a for loop
Guido van Rossum681d79a1995-07-18 14:51:37 +000019 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000020*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000021
Guido van Rossum8ff077b1996-08-24 06:21:31 +000022#ifndef NO_PRIVATE_NAME_MANGLING
23#define PRIVATE_NAME_MANGLING
24#endif
25
Guido van Rossum79f25d91997-04-29 20:08:16 +000026#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000027
Guido van Rossum10dc2e81990-11-18 17:27:39 +000028#include "node.h"
29#include "token.h"
30#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000031#include "compile.h"
32#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000033#include "structmember.h"
34
35#include <ctype.h>
Jack Jansen41aa8e52000-07-03 21:39:47 +000036#ifdef HAVE_LIMITS_H
37#include <limits.h>
38#endif
Guido van Rossum282914b1991-04-04 10:42:56 +000039
Guido van Rossumb05a5c71997-05-07 17:46:13 +000040/* Three symbols from graminit.h are also defined in Python.h, with
41 Py_ prefixes to their names. Python.h can't include graminit.h
42 (which defines too many confusing symbols), but we can check here
43 that they haven't changed (which is very unlikely, but possible). */
44#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000045 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000046#endif
47#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000048 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000049#endif
50#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000051 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000052#endif
53
Guido van Rossum8e793d91997-03-03 19:13:14 +000054int Py_OptimizeFlag = 0;
55
Guido van Rossum8861b741996-07-30 16:49:37 +000056#define OP_DELETE 0
57#define OP_ASSIGN 1
58#define OP_APPLY 2
59
Guido van Rossum79f25d91997-04-29 20:08:16 +000060#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000061
62static struct memberlist code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000063 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
64 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000065 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000066 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000067 {"co_code", T_OBJECT, OFF(co_code), READONLY},
68 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
69 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000070 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000071 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000072 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000073 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
74 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000075 {NULL} /* Sentinel */
76};
77
Guido van Rossum79f25d91997-04-29 20:08:16 +000078static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000079code_getattr(PyCodeObject *co, char *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +000080{
Guido van Rossum79f25d91997-04-29 20:08:16 +000081 return PyMember_Get((char *)co, code_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +000082}
Guido van Rossum10dc2e81990-11-18 17:27:39 +000083
84static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000085code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +000086{
Guido van Rossum79f25d91997-04-29 20:08:16 +000087 Py_XDECREF(co->co_code);
88 Py_XDECREF(co->co_consts);
89 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +000090 Py_XDECREF(co->co_varnames);
Guido van Rossum79f25d91997-04-29 20:08:16 +000091 Py_XDECREF(co->co_filename);
92 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +000093 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +000094 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +000095}
96
Guido van Rossum79f25d91997-04-29 20:08:16 +000097static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000098code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +000099{
100 char buf[500];
101 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000102 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000103 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000104
Guido van Rossuma396a882000-04-07 01:21:36 +0000105 if (co->co_firstlineno != 0)
106 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000107 if (co->co_filename && PyString_Check(co->co_filename))
108 filename = PyString_AsString(co->co_filename);
109 if (co->co_name && PyString_Check(co->co_name))
110 name = PyString_AsString(co->co_name);
Fred Drake615ae552000-06-30 16:20:13 +0000111 sprintf(buf, "<code object %.100s at %p, file \"%.300s\", line %d>",
112 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000113 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000114}
115
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000116static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000117code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000118{
119 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000120 cmp = PyObject_Compare(co->co_name, cp->co_name);
121 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000122 cmp = co->co_argcount - cp->co_argcount;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000123 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000124 cmp = co->co_nlocals - cp->co_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000125 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000126 cmp = co->co_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000127 if (cmp) return cmp;
Guido van Rossumd076c731998-10-07 19:42:25 +0000128 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000129 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000130 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000131 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000132 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000133 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000134 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000135 return cmp;
136}
137
138static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000139code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000140{
Guido van Rossum44679592000-04-10 16:20:31 +0000141 long h, h0, h1, h2, h3, h4;
142 h0 = PyObject_Hash(co->co_name);
143 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000144 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000145 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000146 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000147 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000148 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000149 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000150 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000151 if (h4 == -1) return -1;
Guido van Rossum44679592000-04-10 16:20:31 +0000152 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000153 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000154 if (h == -1) h = -2;
155 return h;
156}
157
Guido van Rossum79f25d91997-04-29 20:08:16 +0000158PyTypeObject PyCode_Type = {
159 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000160 0,
161 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000162 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000163 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000164 (destructor)code_dealloc, /*tp_dealloc*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000165 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000166 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000167 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000168 (cmpfunc)code_compare, /*tp_compare*/
169 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000170 0, /*tp_as_number*/
171 0, /*tp_as_sequence*/
172 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000173 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000174};
175
Guido van Rossum644a12b1997-04-09 19:24:53 +0000176#define NAME_CHARS \
177 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
178
Guido van Rossum79f25d91997-04-29 20:08:16 +0000179PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000180PyCode_New(int argcount, int nlocals, int stacksize, int flags,
181 PyObject *code, PyObject *consts, PyObject *names,
182 PyObject *varnames, PyObject *filename, PyObject *name,
183 int firstlineno, PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000184{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000185 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000186 int i;
Guido van Rossumd076c731998-10-07 19:42:25 +0000187 PyBufferProcs *pb;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000188 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000189 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000190 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000191 consts == NULL || !PyTuple_Check(consts) ||
192 names == NULL || !PyTuple_Check(names) ||
193 varnames == NULL || !PyTuple_Check(varnames) ||
194 name == NULL || !PyString_Check(name) ||
195 filename == NULL || !PyString_Check(filename) ||
196 lnotab == NULL || !PyString_Check(lnotab)) {
197 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000198 return NULL;
199 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000200 pb = code->ob_type->tp_as_buffer;
201 if (pb == NULL ||
202 pb->bf_getreadbuffer == NULL ||
203 pb->bf_getsegcount == NULL ||
204 (*pb->bf_getsegcount)(code, NULL) != 1)
205 {
206 PyErr_BadInternalCall();
207 return NULL;
208 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000209 /* Make sure names and varnames are all strings, & intern them */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000210 for (i = PyTuple_Size(names); --i >= 0; ) {
211 PyObject *v = PyTuple_GetItem(names, i);
212 if (v == NULL || !PyString_Check(v)) {
213 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000214 return NULL;
215 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000216 PyString_InternInPlace(&PyTuple_GET_ITEM(names, i));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000217 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000218 for (i = PyTuple_Size(varnames); --i >= 0; ) {
219 PyObject *v = PyTuple_GetItem(varnames, i);
220 if (v == NULL || !PyString_Check(v)) {
221 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000222 return NULL;
223 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000224 PyString_InternInPlace(&PyTuple_GET_ITEM(varnames, i));
225 }
226 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000227 for (i = PyTuple_Size(consts); --i >= 0; ) {
228 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000229 char *p;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000230 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000231 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000232 p = PyString_AsString(v);
Guido van Rossum582acec2000-06-28 22:07:35 +0000233 if (strspn(p, NAME_CHARS)
234 != (size_t)PyString_Size(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000235 continue;
236 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000237 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000238 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000239 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000240 co->co_argcount = argcount;
241 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000242 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000243 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000245 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000246 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000247 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000248 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000249 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000250 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000251 co->co_varnames = varnames;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000252 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000253 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000254 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000255 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000256 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000257 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000258 co->co_lnotab = lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000259 }
260 return co;
261}
262
263
264/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000265
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000266struct compiling {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000267 PyObject *c_code; /* string */
268 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000269 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000270 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000271 PyObject *c_name_dict; /* inverse of c_names */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000272 PyObject *c_globals; /* dictionary (value=None) */
273 PyObject *c_locals; /* dictionary (value=localID) */
274 PyObject *c_varnames; /* list (inverse of c_locals) */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000275 int c_nlocals; /* index of next local */
276 int c_argcount; /* number of top-level arguments */
277 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000278 int c_nexti; /* index into c_code */
279 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000280 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000281 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000282 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000283 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000284 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000285 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000286 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000287 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000288 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000289 int c_stacklevel; /* Current stack level */
290 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000291 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000292 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000293 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000294#ifdef PRIVATE_NAME_MANGLING
295 char *c_private; /* for private name mangling */
296#endif
Skip Montanaro803d6e52000-08-12 18:09:51 +0000297 int c_tmpname; /* temporary local name counter */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000298};
299
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000300
Guido van Rossum452a9831996-09-17 14:32:04 +0000301/* Error message including line number */
302
303static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000304com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000305{
Guido van Rossum582acec2000-06-28 22:07:35 +0000306 size_t n = strlen(msg);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000307 PyObject *v;
Guido van Rossum452a9831996-09-17 14:32:04 +0000308 char buffer[30];
309 char *s;
Guido van Rossum635abd21997-01-06 22:56:52 +0000310 c->c_errors++;
Guido van Rossum452a9831996-09-17 14:32:04 +0000311 if (c->c_lineno <= 1) {
312 /* Unknown line number or single interactive command */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000313 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000314 return;
315 }
316 sprintf(buffer, " (line %d)", c->c_lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000317 v = PyString_FromStringAndSize((char *)NULL, n + strlen(buffer));
Guido van Rossum452a9831996-09-17 14:32:04 +0000318 if (v == NULL)
319 return; /* MemoryError, too bad */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000320 s = PyString_AS_STRING((PyStringObject *)v);
Guido van Rossum452a9831996-09-17 14:32:04 +0000321 strcpy(s, msg);
322 strcat(s, buffer);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000323 PyErr_SetObject(exc, v);
324 Py_DECREF(v);
Guido van Rossum452a9831996-09-17 14:32:04 +0000325}
326
327
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000328/* Interface to the block stack */
329
330static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000331block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000332{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000333 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000334 com_error(c, PyExc_SystemError,
335 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000336 }
337 else {
338 c->c_block[c->c_nblocks++] = type;
339 }
340}
341
342static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000343block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000344{
345 if (c->c_nblocks > 0)
346 c->c_nblocks--;
347 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000348 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000349 }
350}
351
352
Guido van Rossum681d79a1995-07-18 14:51:37 +0000353/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000354
Tim Petersdbd9ba62000-07-09 03:09:57 +0000355static int com_init(struct compiling *, char *);
356static void com_free(struct compiling *);
357static void com_push(struct compiling *, int);
358static void com_pop(struct compiling *, int);
359static void com_done(struct compiling *);
360static void com_node(struct compiling *, struct _node *);
361static void com_factor(struct compiling *, struct _node *);
362static void com_addbyte(struct compiling *, int);
363static void com_addint(struct compiling *, int);
364static void com_addoparg(struct compiling *, int, int);
365static void com_addfwref(struct compiling *, int, int *);
366static void com_backpatch(struct compiling *, int);
367static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
368static int com_addconst(struct compiling *, PyObject *);
369static int com_addname(struct compiling *, PyObject *);
370static void com_addopname(struct compiling *, int, node *);
371static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000372static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000373static int com_argdefs(struct compiling *, node *);
374static int com_newlocal(struct compiling *, char *);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000375static void com_assign(struct compiling *, node *, int);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000376static PyCodeObject *icompile(struct _node *, struct compiling *);
377static PyCodeObject *jcompile(struct _node *, char *,
378 struct compiling *);
379static PyObject *parsestrplus(node *);
380static PyObject *parsestr(char *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000381
382static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000383com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000384{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000385 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000386 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
387 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000388 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000389 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000390 goto fail;
391 if ((c->c_const_dict = PyDict_New()) == NULL)
392 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000393 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000394 goto fail;
395 if ((c->c_name_dict = PyDict_New()) == NULL)
396 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000397 if ((c->c_globals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000398 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000399 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000400 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000401 if ((c->c_varnames = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000402 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000403 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
404 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000405 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000406 c->c_nlocals = 0;
407 c->c_argcount = 0;
408 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000409 c->c_nexti = 0;
410 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000411 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000412 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000413 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000414 c->c_begin = 0;
415 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000416 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000417 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000418 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000419 c->c_stacklevel = 0;
420 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000421 c->c_firstlineno = 0;
422 c->c_last_addr = 0;
423 c->c_last_line = 0;
424 c-> c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000425 c->c_tmpname = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000426 return 1;
427
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000428 fail:
429 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000430 return 0;
431}
432
433static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000434com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000435{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000436 Py_XDECREF(c->c_code);
437 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000438 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000439 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000440 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000441 Py_XDECREF(c->c_globals);
442 Py_XDECREF(c->c_locals);
443 Py_XDECREF(c->c_varnames);
444 Py_XDECREF(c->c_lnotab);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000445}
446
447static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000448com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000449{
450 c->c_stacklevel += n;
451 if (c->c_stacklevel > c->c_maxstacklevel)
452 c->c_maxstacklevel = c->c_stacklevel;
453}
454
455static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000456com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000457{
458 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000459 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000460 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
461 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000462 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000463 c->c_stacklevel = 0;
464 }
465 else
466 c->c_stacklevel -= n;
467}
468
469static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000470com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000471{
472 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000473 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000474 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000475 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000476}
477
478static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000479com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000480{
481 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000482 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000483 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000484 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000485 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000486 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000487 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000488 com_error(c, PyExc_SystemError,
489 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000490 }
491 if (c->c_code == NULL)
492 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000493 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000494 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000495 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000496 c->c_errors++;
497 return;
498 }
499 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000500 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000501}
502
503static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000504com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000505{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000506 com_addbyte(c, x & 0xff);
507 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000508}
509
510static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000511com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000512{
513 int size;
514 char *p;
515 if (c->c_lnotab == NULL)
516 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000517 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000518 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000519 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000520 c->c_errors++;
521 return;
522 }
523 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000524 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000525 *p++ = addr;
526 *p++ = line;
527 c->c_lnotab_next += 2;
528}
529
530static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000531com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000532{
533 c->c_lineno = lineno;
534 if (c->c_firstlineno == 0) {
535 c->c_firstlineno = c->c_last_line = lineno;
536 }
537 else {
538 int incr_addr = c->c_nexti - c->c_last_addr;
539 int incr_line = lineno - c->c_last_line;
540 while (incr_addr > 0 || incr_line > 0) {
541 int trunc_addr = incr_addr;
542 int trunc_line = incr_line;
543 if (trunc_addr > 255)
544 trunc_addr = 255;
545 if (trunc_line > 255)
546 trunc_line = 255;
547 com_add_lnotab(c, trunc_addr, trunc_line);
548 incr_addr -= trunc_addr;
549 incr_line -= trunc_line;
550 }
551 c->c_last_addr = c->c_nexti;
552 c->c_last_line = lineno;
553 }
554}
555
556static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000557com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000558{
Guido van Rossum8e793d91997-03-03 19:13:14 +0000559 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000560 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000561 if (Py_OptimizeFlag)
562 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000563 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000564 com_addbyte(c, op);
565 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000566}
567
568static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000569com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000570{
571 /* Compile a forward reference for backpatching */
572 int here;
573 int anchor;
574 com_addbyte(c, op);
575 here = c->c_nexti;
576 anchor = *p_anchor;
577 *p_anchor = here;
578 com_addint(c, anchor == 0 ? 0 : here - anchor);
579}
580
581static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000582com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000583{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000584 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000585 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000586 int dist;
587 int prev;
588 for (;;) {
589 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000590 prev = code[anchor] + (code[anchor+1] << 8);
591 dist = target - (anchor+2);
592 code[anchor] = dist & 0xff;
593 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000594 if (!prev)
595 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000596 anchor -= prev;
597 }
598}
599
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000600/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000601
602static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000603com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000604{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000605 PyObject *w, *t, *np=NULL;
606 long n;
607
608 t = Py_BuildValue("(OO)", v, v->ob_type);
609 if (t == NULL)
610 goto fail;
611 w = PyDict_GetItem(dict, t);
612 if (w != NULL) {
613 n = PyInt_AsLong(w);
614 } else {
615 n = PyList_Size(list);
616 np = PyInt_FromLong(n);
617 if (np == NULL)
618 goto fail;
619 if (PyList_Append(list, v) != 0)
620 goto fail;
621 if (PyDict_SetItem(dict, t, np) != 0)
622 goto fail;
623 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000624 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000625 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000626 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000627 fail:
628 Py_XDECREF(np);
629 Py_XDECREF(t);
630 c->c_errors++;
631 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000632}
633
634static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000635com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000636{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000637 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000638}
639
640static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000641com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000642{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000643 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000644}
645
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000646#ifdef PRIVATE_NAME_MANGLING
647static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000648com_mangle(struct compiling *c, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000649{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000650 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000651 This is independent from how the name is used. */
652 char *p;
Guido van Rossum582acec2000-06-28 22:07:35 +0000653 size_t nlen, plen;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000654 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000655 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000656 return 0; /* Don't mangle __extremely_long_names */
657 if (name[nlen-1] == '_' && name[nlen-2] == '_')
658 return 0; /* Don't mangle __whatever__ */
659 p = c->c_private;
660 /* Strip leading underscores from class name */
661 while (*p == '_')
662 p++;
663 if (*p == '\0')
664 return 0; /* Don't mangle if class is just underscores */
665 plen = strlen(p);
666 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000667 plen = maxlen-nlen-2; /* Truncate class name if too long */
668 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000669 buffer[0] = '_';
670 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000671 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000672 /* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
673 return 1;
674}
675#endif
676
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000677static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000678com_addopnamestr(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000679{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000680 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000681 int i;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000682#ifdef PRIVATE_NAME_MANGLING
683 char buffer[256];
684 if (name != NULL && name[0] == '_' && name[1] == '_' &&
685 c->c_private != NULL &&
Guido van Rossum582acec2000-06-28 22:07:35 +0000686 com_mangle(c, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000687 name = buffer;
688#endif
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000689 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000690 c->c_errors++;
691 i = 255;
692 }
693 else {
694 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000695 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000696 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000697 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
698 switch (op) {
699 case LOAD_NAME:
700 case STORE_NAME:
701 case DELETE_NAME:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000702 if (PyDict_GetItemString(c->c_globals, name) != NULL) {
Guido van Rossumc5e96291991-12-10 13:53:51 +0000703 switch (op) {
704 case LOAD_NAME: op = LOAD_GLOBAL; break;
705 case STORE_NAME: op = STORE_GLOBAL; break;
706 case DELETE_NAME: op = DELETE_GLOBAL; break;
707 }
708 }
709 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000710 com_addoparg(c, op, i);
711}
712
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000713static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000714com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000715{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000716 char *name;
717 char buffer[1000];
718 /* XXX it is possible to write this code without the 1000
719 chars on the total length of dotted names, I just can't be
720 bothered right now */
721 if (TYPE(n) == STAR)
722 name = "*";
723 else if (TYPE(n) == dotted_name) {
724 char *p = buffer;
725 int i;
726 name = buffer;
727 for (i = 0; i < NCH(n); i += 2) {
728 char *s = STR(CHILD(n, i));
729 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000730 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000731 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +0000732 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000733 break;
734 }
735 if (p != buffer)
736 *p++ = '.';
737 strcpy(p, s);
738 p = strchr(p, '\0');
739 }
740 }
741 else {
742 REQ(n, NAME);
743 name = STR(n);
744 }
745 com_addopnamestr(c, op, name);
746}
747
Guido van Rossum79f25d91997-04-29 20:08:16 +0000748static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000749parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000750{
Tim Petersdbd9ba62000-07-09 03:09:57 +0000751 extern double atof(const char *);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000752 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000753 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000754 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +0000755#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +0000756 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +0000757 int imflag;
758#endif
759
Guido van Rossum282914b1991-04-04 10:42:56 +0000760 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000761 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +0000762#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +0000763 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +0000764#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000765 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000766 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000767 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000768 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000769 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000770 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000771 if (*end == '\0') {
772 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000773 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000774 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000775 return NULL;
776 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000777 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000778 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000779 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +0000780#ifndef WITHOUT_COMPLEX
781 if (imflag) {
782 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000783 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +0000784 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000785 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000786 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +0000787 }
Guido van Rossumac1fc951997-10-08 15:23:55 +0000788 else
Guido van Rossum50564e81996-01-12 01:13:16 +0000789#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +0000790 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000791 PyFPE_START_PROTECT("atof", return 0)
792 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000793 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000794 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000795 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000796}
797
Guido van Rossum79f25d91997-04-29 20:08:16 +0000798static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000799parsestr(char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000800{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000801 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +0000802 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000803 char *buf;
804 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000805 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000806 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +0000807 int first = *s;
808 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000809 int rawmode = 0;
810 int unicode = 0;
811 if (isalpha(quote) || quote == '_') {
812 if (quote == 'u' || quote == 'U') {
813 quote = *++s;
814 unicode = 1;
815 }
816 if (quote == 'r' || quote == 'R') {
817 quote = *++s;
818 rawmode = 1;
819 }
820 }
Guido van Rossum8054fad1993-10-26 15:19:44 +0000821 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000822 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000823 return NULL;
824 }
825 s++;
826 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +0000827 if (len > INT_MAX) {
828 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
829 return NULL;
830 }
Guido van Rossum8054fad1993-10-26 15:19:44 +0000831 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000832 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000833 return NULL;
834 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000835 if (len >= 4 && s[0] == quote && s[1] == quote) {
836 s += 2;
837 len -= 2;
838 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000839 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000840 return NULL;
841 }
842 }
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +0000843 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000844 if (rawmode)
845 return PyUnicode_DecodeRawUnicodeEscape(
846 s, len, NULL);
847 else
848 return PyUnicode_DecodeUnicodeEscape(
849 s, len, NULL);
850 }
851 else if (rawmode || strchr(s, '\\') == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000852 return PyString_FromStringAndSize(s, len);
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000853 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000854 v = PyString_FromStringAndSize((char *)NULL, len);
855 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000856 end = s + len;
857 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000858 if (*s != '\\') {
859 *p++ = *s++;
860 continue;
861 }
862 s++;
863 switch (*s++) {
864 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000865 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000866 case '\\': *p++ = '\\'; break;
867 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000868 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000869 case 'b': *p++ = '\b'; break;
870 case 'f': *p++ = '\014'; break; /* FF */
871 case 't': *p++ = '\t'; break;
872 case 'n': *p++ = '\n'; break;
873 case 'r': *p++ = '\r'; break;
874 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000875 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
876 case '0': case '1': case '2': case '3':
877 case '4': case '5': case '6': case '7':
878 c = s[-1] - '0';
879 if ('0' <= *s && *s <= '7') {
880 c = (c<<3) + *s++ - '0';
881 if ('0' <= *s && *s <= '7')
882 c = (c<<3) + *s++ - '0';
883 }
884 *p++ = c;
885 break;
886 case 'x':
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000887 if (isxdigit(Py_CHARMASK(*s))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000888 unsigned int x = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000889 do {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000890 c = Py_CHARMASK(*s);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000891 s++;
Guido van Rossumed1100f1997-10-20 23:24:07 +0000892 x = (x<<4) & ~0xF;
893 if (isdigit(c))
894 x += c - '0';
895 else if (islower(c))
896 x += 10 + c - 'a';
897 else
898 x += 10 + c - 'A';
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000899 } while (isxdigit(Py_CHARMASK(*s)));
Guido van Rossumed1100f1997-10-20 23:24:07 +0000900 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000901 break;
902 }
903 /* FALLTHROUGH */
904 default: *p++ = '\\'; *p++ = s[-1]; break;
905 }
906 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000907 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000908 return v;
909}
910
Guido van Rossum79f25d91997-04-29 20:08:16 +0000911static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000912parsestrplus(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000913{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000914 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000915 int i;
916 REQ(CHILD(n, 0), STRING);
917 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
918 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +0000919 for (i = 1; i < NCH(n); i++) {
920 PyObject *s;
921 s = parsestr(STR(CHILD(n, i)));
922 if (s == NULL)
923 goto onError;
924 if (PyString_Check(v) && PyString_Check(s)) {
925 PyString_ConcatAndDel(&v, s);
926 if (v == NULL)
927 goto onError;
928 }
929 else {
930 PyObject *temp;
931 temp = PyUnicode_Concat(v, s);
932 Py_DECREF(s);
933 if (temp == NULL)
934 goto onError;
935 Py_DECREF(v);
936 v = temp;
937 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000938 }
939 }
940 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +0000941
942 onError:
943 Py_XDECREF(v);
944 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000945}
946
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000947static void
Skip Montanaro803d6e52000-08-12 18:09:51 +0000948com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000949{
Skip Montanaro803d6e52000-08-12 18:09:51 +0000950 PyObject *v;
951 int anchor = 0;
952 int save_begin = c->c_begin;
953
954 /* list_iter: for v in expr [list_iter] */
955 com_node(c, CHILD(n, 3)); /* expr */
956 v = PyInt_FromLong(0L);
957 if (v == NULL)
958 c->c_errors++;
959 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
960 com_push(c, 1);
961 Py_XDECREF(v);
962 c->c_begin = c->c_nexti;
963 com_addoparg(c, SET_LINENO, n->n_lineno);
964 com_addfwref(c, FOR_LOOP, &anchor);
965 com_push(c, 1);
966 com_assign(c, CHILD(n, 1), OP_ASSIGN);
967 c->c_loops++;
968 com_list_iter(c, n, e, t);
969 c->c_loops--;
970 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
971 c->c_begin = save_begin;
972 com_backpatch(c, anchor);
973 com_pop(c, 2); /* FOR_LOOP has popped these */
974}
975
976static void
977com_list_if(struct compiling *c, node *n, node *e, char *t)
978{
979 int anchor = 0;
980 int a = 0;
981 /* list_iter: 'if' test [list_iter] */
982 com_addoparg(c, SET_LINENO, n->n_lineno);
983 com_node(c, CHILD(n, 1));
984 com_addfwref(c, JUMP_IF_FALSE, &a);
985 com_addbyte(c, POP_TOP);
986 com_pop(c, 1);
987 com_list_iter(c, n, e, t);
988 com_addfwref(c, JUMP_FORWARD, &anchor);
989 com_backpatch(c, a);
990 /* We jump here with an extra entry which we now pop */
991 com_addbyte(c, POP_TOP);
992 com_backpatch(c, anchor);
993}
994
995static void
996com_list_iter(struct compiling *c,
997 node *p, /* parent of list_iter node */
998 node *e, /* element expression node */
999 char *t /* name of result list temp local */)
1000{
1001 /* list_iter is the last child in a listmaker, list_for, or list_if */
1002 node *n = CHILD(p, NCH(p)-1);
1003 if (TYPE(n) == list_iter) {
1004 n = CHILD(n, 0);
1005 switch (TYPE(n)) {
1006 case list_for:
1007 com_list_for(c, n, e, t);
1008 break;
1009 case list_if:
1010 com_list_if(c, n, e, t);
1011 break;
1012 default:
1013 com_error(c, PyExc_SystemError,
1014 "invalid list_iter node type");
1015 }
1016 }
1017 else {
1018 com_addopnamestr(c, LOAD_NAME, t);
1019 com_push(c, 1);
1020 com_node(c, e);
1021 com_addoparg(c, CALL_FUNCTION, 1);
1022 com_addbyte(c, POP_TOP);
1023 com_pop(c, 2);
1024 }
1025}
1026
1027static void
1028com_list_comprehension(struct compiling *c, node *n)
1029{
1030 /* listmaker: test list_iter */
1031 char tmpname[12];
1032 sprintf(tmpname, "__%d__", ++c->c_tmpname);
1033 com_addoparg(c, BUILD_LIST, 0);
1034 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1035 com_push(c, 2);
1036 com_addopnamestr(c, LOAD_ATTR, "append");
1037 com_addopnamestr(c, STORE_NAME, tmpname);
1038 com_pop(c, 1);
1039 com_list_iter(c, n, CHILD(n, 0), tmpname);
1040 com_addopnamestr(c, DELETE_NAME, tmpname);
1041 --c->c_tmpname;
1042}
1043
1044static void
1045com_listmaker(struct compiling *c, node *n)
1046{
1047 /* listmaker: test ( list_iter | (',' test)* [','] ) */
Thomas Wouters87df80d2000-08-13 17:05:17 +00001048 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_iter)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001049 com_list_comprehension(c, n);
1050 else {
1051 int len = 0;
1052 int i;
1053 for (i = 0; i < NCH(n); i += 2, len++)
1054 com_node(c, CHILD(n, i));
1055 com_addoparg(c, BUILD_LIST, len);
1056 com_pop(c, len-1);
1057 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001058}
1059
1060static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001061com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001062{
1063 int i;
1064 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1065 for (i = 0; i+2 < NCH(n); i += 4) {
1066 /* We must arrange things just right for STORE_SUBSCR.
1067 It wants the stack to look like (value) (dict) (key) */
1068 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001069 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001070 com_node(c, CHILD(n, i+2)); /* value */
1071 com_addbyte(c, ROT_TWO);
1072 com_node(c, CHILD(n, i)); /* key */
1073 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001074 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001075 }
1076}
1077
1078static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001079com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001080{
1081 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001082 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001083 int i;
1084 REQ(n, atom);
1085 ch = CHILD(n, 0);
1086 switch (TYPE(ch)) {
1087 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001088 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001089 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001090 com_push(c, 1);
1091 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001092 else
1093 com_node(c, CHILD(n, 1));
1094 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001095 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001096 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001097 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001098 com_push(c, 1);
1099 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001100 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001101 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001102 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001103 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001104 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001105 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001106 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001107 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001108 break;
1109 case BACKQUOTE:
1110 com_node(c, CHILD(n, 1));
1111 com_addbyte(c, UNARY_CONVERT);
1112 break;
1113 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001114 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001115 i = 255;
1116 }
1117 else {
1118 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001119 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001120 }
1121 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001122 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001123 break;
1124 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001125 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001126 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001127 c->c_errors++;
1128 i = 255;
1129 }
1130 else {
1131 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001132 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001133 }
1134 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001135 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001136 break;
1137 case NAME:
1138 com_addopname(c, LOAD_NAME, ch);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001139 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001140 break;
1141 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001142 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001143 com_error(c, PyExc_SystemError,
1144 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001145 }
1146}
1147
1148static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001149com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001150{
1151 if (NCH(n) == 1) {
1152 com_addbyte(c, op);
1153 }
1154 else if (NCH(n) == 2) {
1155 if (TYPE(CHILD(n, 0)) != COLON) {
1156 com_node(c, CHILD(n, 0));
1157 com_addbyte(c, op+1);
1158 }
1159 else {
1160 com_node(c, CHILD(n, 1));
1161 com_addbyte(c, op+2);
1162 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001163 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001164 }
1165 else {
1166 com_node(c, CHILD(n, 0));
1167 com_node(c, CHILD(n, 2));
1168 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001169 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001170 }
1171}
1172
Guido van Rossum635abd21997-01-06 22:56:52 +00001173static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001174com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001175{
1176 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001177 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001178 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001179 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001180 com_error(c, PyExc_SyntaxError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001181 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001182 }
1183 else {
1184 com_node(c, CHILD(n, 0));
1185 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001186 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001187 }
1188 m = n;
1189 do {
1190 m = CHILD(m, 0);
1191 } while (NCH(m) == 1);
1192 if (TYPE(m) != NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001193 com_error(c, PyExc_SyntaxError,
1194 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001195 }
1196 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001197 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001198 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001199 *pkeywords = PyDict_New();
Guido van Rossum635abd21997-01-06 22:56:52 +00001200 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001201 c->c_errors++;
1202 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001203 if (PyDict_GetItem(*pkeywords, v) != NULL)
1204 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001205 "duplicate keyword argument");
1206 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001207 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001208 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001209 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001210 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001211 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001212 }
1213 }
1214 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001215}
1216
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001217static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001218com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001219{
1220 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001221 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001222 }
1223 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001224 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001225 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001226 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001227 int star_flag = 0;
1228 int starstar_flag = 0;
1229 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001230 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001231 na = 0;
1232 nk = 0;
1233 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001234 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001235 if (TYPE(ch) == STAR ||
1236 TYPE(ch) == DOUBLESTAR)
1237 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001238 if (ch->n_lineno != lineno) {
1239 lineno = ch->n_lineno;
1240 com_addoparg(c, SET_LINENO, lineno);
1241 }
1242 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001243 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001244 na++;
1245 else
1246 nk++;
1247 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001248 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001249 while (i < NCH(n)) {
1250 node *tok = CHILD(n, i);
1251 node *ch = CHILD(n, i+1);
1252 i += 3;
1253 switch (TYPE(tok)) {
1254 case STAR: star_flag = 1; break;
1255 case DOUBLESTAR: starstar_flag = 1; break;
1256 }
1257 com_node(c, ch);
1258 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001259 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001260 com_error(c, PyExc_SyntaxError,
1261 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001262 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001263 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001264 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001265 star_flag + (starstar_flag << 1);
1266 else
1267 opcode = CALL_FUNCTION;
1268 com_addoparg(c, opcode, na | (nk << 8));
1269 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001270 }
1271}
1272
1273static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001274com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001275{
1276 com_addopname(c, LOAD_ATTR, n);
1277}
1278
1279static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001280com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001281{
1282 int i=0;
1283 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001284 node *ch;
1285
1286 /* first argument */
1287 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001288 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001289 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001290 i++;
1291 }
1292 else {
1293 com_node(c, CHILD(n,i));
1294 i++;
1295 REQ(CHILD(n,i),COLON);
1296 i++;
1297 }
1298 /* second argument */
1299 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1300 com_node(c, CHILD(n,i));
1301 i++;
1302 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001303 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001304 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001305 com_push(c, 1);
1306 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001307 /* remaining arguments */
1308 for (; i < NCH(n); i++) {
1309 ns++;
1310 ch=CHILD(n,i);
1311 REQ(ch, sliceop);
1312 if (NCH(ch) == 1) {
1313 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001314 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001315 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001316 }
1317 else
1318 com_node(c, CHILD(ch,1));
1319 }
1320 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001321 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001322}
1323
1324static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001325com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001326{
1327 node *ch;
1328 REQ(n, subscript);
1329 ch = CHILD(n,0);
1330 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001331 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001332 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001333 com_push(c, 1);
1334 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001335 else {
1336 /* check for slice */
1337 if ((TYPE(ch) == COLON || NCH(n) > 1))
1338 com_sliceobj(c, n);
1339 else {
1340 REQ(ch, test);
1341 com_node(c, ch);
1342 }
1343 }
1344}
1345
1346static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001347com_subscriptlist(struct compiling *c, node *n, int assigning)
Guido van Rossum8861b741996-07-30 16:49:37 +00001348{
1349 int i, op;
1350 REQ(n, subscriptlist);
1351 /* Check to make backward compatible slice behavior for '[i:j]' */
1352 if (NCH(n) == 1) {
1353 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001354 /* 'Basic' slice, should have exactly one colon. */
1355 if ((TYPE(CHILD(sub, 0)) == COLON
1356 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1357 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1358 {
Guido van Rossum8861b741996-07-30 16:49:37 +00001359 if (assigning == OP_APPLY)
1360 op = SLICE;
1361 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001362 op = ((assigning == OP_ASSIGN) ?
1363 STORE_SLICE : DELETE_SLICE);
Guido van Rossum8861b741996-07-30 16:49:37 +00001364 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001365 if (op == STORE_SLICE)
1366 com_pop(c, 2);
1367 else if (op == DELETE_SLICE)
1368 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001369 return;
1370 }
1371 }
1372 /* Else normal subscriptlist. Compile each subscript. */
1373 for (i = 0; i < NCH(n); i += 2)
1374 com_subscript(c, CHILD(n, i));
1375 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001376 if (NCH(n) > 1) {
1377 i = (NCH(n)+1) / 2;
1378 com_addoparg(c, BUILD_TUPLE, i);
1379 com_pop(c, i-1);
1380 }
1381 if (assigning == OP_APPLY) {
Guido van Rossum8861b741996-07-30 16:49:37 +00001382 op = BINARY_SUBSCR;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001383 i = 1;
1384 }
1385 else if (assigning == OP_ASSIGN) {
1386 op = STORE_SUBSCR;
1387 i = 3;
1388 }
1389 else {
1390 op = DELETE_SUBSCR;
1391 i = 2;
1392 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001393 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001394 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001395}
1396
1397static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001398com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001399{
1400 REQ(n, trailer);
1401 switch (TYPE(CHILD(n, 0))) {
1402 case LPAR:
1403 com_call_function(c, CHILD(n, 1));
1404 break;
1405 case DOT:
1406 com_select_member(c, CHILD(n, 1));
1407 break;
1408 case LSQB:
Guido van Rossum8861b741996-07-30 16:49:37 +00001409 com_subscriptlist(c, CHILD(n, 1), OP_APPLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001410 break;
1411 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001412 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001413 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001414 }
1415}
1416
1417static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001418com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001419{
1420 int i;
1421 REQ(n, power);
1422 com_atom(c, CHILD(n, 0));
1423 for (i = 1; i < NCH(n); i++) {
1424 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1425 com_factor(c, CHILD(n, i+1));
1426 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001427 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001428 break;
1429 }
1430 else
1431 com_apply_trailer(c, CHILD(n, i));
1432 }
1433}
1434
1435static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001436com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001437{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001438 REQ(n, factor);
1439 if (TYPE(CHILD(n, 0)) == PLUS) {
1440 com_factor(c, CHILD(n, 1));
1441 com_addbyte(c, UNARY_POSITIVE);
1442 }
1443 else if (TYPE(CHILD(n, 0)) == MINUS) {
1444 com_factor(c, CHILD(n, 1));
1445 com_addbyte(c, UNARY_NEGATIVE);
1446 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001447 else if (TYPE(CHILD(n, 0)) == TILDE) {
1448 com_factor(c, CHILD(n, 1));
1449 com_addbyte(c, UNARY_INVERT);
1450 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001451 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001452 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001453 }
1454}
1455
1456static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001457com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001458{
1459 int i;
1460 int op;
1461 REQ(n, term);
1462 com_factor(c, CHILD(n, 0));
1463 for (i = 2; i < NCH(n); i += 2) {
1464 com_factor(c, CHILD(n, i));
1465 switch (TYPE(CHILD(n, i-1))) {
1466 case STAR:
1467 op = BINARY_MULTIPLY;
1468 break;
1469 case SLASH:
1470 op = BINARY_DIVIDE;
1471 break;
1472 case PERCENT:
1473 op = BINARY_MODULO;
1474 break;
1475 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001476 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001477 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001478 op = 255;
1479 }
1480 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001481 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001482 }
1483}
1484
1485static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001486com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001487{
1488 int i;
1489 int op;
1490 REQ(n, arith_expr);
1491 com_term(c, CHILD(n, 0));
1492 for (i = 2; i < NCH(n); i += 2) {
1493 com_term(c, CHILD(n, i));
1494 switch (TYPE(CHILD(n, i-1))) {
1495 case PLUS:
1496 op = BINARY_ADD;
1497 break;
1498 case MINUS:
1499 op = BINARY_SUBTRACT;
1500 break;
1501 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001502 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001503 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001504 op = 255;
1505 }
1506 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001507 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001508 }
1509}
1510
1511static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001512com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001513{
1514 int i;
1515 int op;
1516 REQ(n, shift_expr);
1517 com_arith_expr(c, CHILD(n, 0));
1518 for (i = 2; i < NCH(n); i += 2) {
1519 com_arith_expr(c, CHILD(n, i));
1520 switch (TYPE(CHILD(n, i-1))) {
1521 case LEFTSHIFT:
1522 op = BINARY_LSHIFT;
1523 break;
1524 case RIGHTSHIFT:
1525 op = BINARY_RSHIFT;
1526 break;
1527 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001528 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001529 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001530 op = 255;
1531 }
1532 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001533 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001534 }
1535}
1536
1537static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001538com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001539{
1540 int i;
1541 int op;
1542 REQ(n, and_expr);
1543 com_shift_expr(c, CHILD(n, 0));
1544 for (i = 2; i < NCH(n); i += 2) {
1545 com_shift_expr(c, CHILD(n, i));
1546 if (TYPE(CHILD(n, i-1)) == AMPER) {
1547 op = BINARY_AND;
1548 }
1549 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001550 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001551 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001552 op = 255;
1553 }
1554 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001555 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001556 }
1557}
1558
1559static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001560com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001561{
1562 int i;
1563 int op;
1564 REQ(n, xor_expr);
1565 com_and_expr(c, CHILD(n, 0));
1566 for (i = 2; i < NCH(n); i += 2) {
1567 com_and_expr(c, CHILD(n, i));
1568 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1569 op = BINARY_XOR;
1570 }
1571 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001572 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001573 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001574 op = 255;
1575 }
1576 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001577 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001578 }
1579}
1580
1581static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001582com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001583{
1584 int i;
1585 int op;
1586 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001587 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001588 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001589 com_xor_expr(c, CHILD(n, i));
1590 if (TYPE(CHILD(n, i-1)) == VBAR) {
1591 op = BINARY_OR;
1592 }
1593 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001594 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001595 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001596 op = 255;
1597 }
1598 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001599 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001600 }
1601}
1602
1603static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001604cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001605{
1606 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001607 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001608 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1609 if (NCH(n) == 1) {
1610 n = CHILD(n, 0);
1611 switch (TYPE(n)) {
1612 case LESS: return LT;
1613 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001614 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001615 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001616 case LESSEQUAL: return LE;
1617 case GREATEREQUAL: return GE;
1618 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001619 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1620 if (strcmp(STR(n), "is") == 0) return IS;
1621 }
1622 }
1623 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001624 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001625 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1626 return NOT_IN;
1627 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1628 return IS_NOT;
1629 }
1630 }
1631 return BAD;
1632}
1633
1634static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001635com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001636{
1637 int i;
1638 enum cmp_op op;
1639 int anchor;
1640 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1641 com_expr(c, CHILD(n, 0));
1642 if (NCH(n) == 1)
1643 return;
1644
1645 /****************************************************************
1646 The following code is generated for all but the last
1647 comparison in a chain:
1648
1649 label: on stack: opcode: jump to:
1650
1651 a <code to load b>
1652 a, b DUP_TOP
1653 a, b, b ROT_THREE
1654 b, a, b COMPARE_OP
1655 b, 0-or-1 JUMP_IF_FALSE L1
1656 b, 1 POP_TOP
1657 b
1658
1659 We are now ready to repeat this sequence for the next
1660 comparison in the chain.
1661
1662 For the last we generate:
1663
1664 b <code to load c>
1665 b, c COMPARE_OP
1666 0-or-1
1667
1668 If there were any jumps to L1 (i.e., there was more than one
1669 comparison), we generate:
1670
1671 0-or-1 JUMP_FORWARD L2
1672 L1: b, 0 ROT_TWO
1673 0, b POP_TOP
1674 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00001675 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001676 ****************************************************************/
1677
1678 anchor = 0;
1679
1680 for (i = 2; i < NCH(n); i += 2) {
1681 com_expr(c, CHILD(n, i));
1682 if (i+2 < NCH(n)) {
1683 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001684 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001685 com_addbyte(c, ROT_THREE);
1686 }
1687 op = cmp_type(CHILD(n, i-1));
1688 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001689 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001690 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001691 }
1692 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001693 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001694 if (i+2 < NCH(n)) {
1695 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1696 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001697 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001698 }
1699 }
1700
1701 if (anchor) {
1702 int anchor2 = 0;
1703 com_addfwref(c, JUMP_FORWARD, &anchor2);
1704 com_backpatch(c, anchor);
1705 com_addbyte(c, ROT_TWO);
1706 com_addbyte(c, POP_TOP);
1707 com_backpatch(c, anchor2);
1708 }
1709}
1710
1711static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001712com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001713{
1714 REQ(n, not_test); /* 'not' not_test | comparison */
1715 if (NCH(n) == 1) {
1716 com_comparison(c, CHILD(n, 0));
1717 }
1718 else {
1719 com_not_test(c, CHILD(n, 1));
1720 com_addbyte(c, UNARY_NOT);
1721 }
1722}
1723
1724static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001725com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001726{
1727 int i;
1728 int anchor;
1729 REQ(n, and_test); /* not_test ('and' not_test)* */
1730 anchor = 0;
1731 i = 0;
1732 for (;;) {
1733 com_not_test(c, CHILD(n, i));
1734 if ((i += 2) >= NCH(n))
1735 break;
1736 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1737 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001738 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001739 }
1740 if (anchor)
1741 com_backpatch(c, anchor);
1742}
1743
1744static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001745com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001746{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001747 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00001748 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001749 PyObject *v;
Guido van Rossum57531fe1993-11-30 14:57:42 +00001750 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001751 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001752 v = (PyObject *) icompile(CHILD(n, 0), c);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001753 if (v == NULL) {
1754 c->c_errors++;
1755 i = 255;
1756 }
1757 else {
1758 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001759 Py_DECREF(v);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001760 }
1761 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001762 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001763 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001764 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001765 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001766 else {
1767 int anchor = 0;
1768 int i = 0;
1769 for (;;) {
1770 com_and_test(c, CHILD(n, i));
1771 if ((i += 2) >= NCH(n))
1772 break;
1773 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1774 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001775 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001776 }
1777 if (anchor)
1778 com_backpatch(c, anchor);
1779 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001780}
1781
1782static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001783com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001784{
1785 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001786 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001787 com_node(c, CHILD(n, 0));
1788 }
1789 else {
1790 int i;
1791 int len;
1792 len = (NCH(n) + 1) / 2;
1793 for (i = 0; i < NCH(n); i += 2)
1794 com_node(c, CHILD(n, i));
1795 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001796 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001797 }
1798}
1799
1800
1801/* Begin of assignment compilation */
1802
Tim Petersdbd9ba62000-07-09 03:09:57 +00001803static void com_assign_name(struct compiling *, node *, int);
1804static void com_assign(struct compiling *, node *, int);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001805
1806static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001807com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001808{
1809 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001810 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001811}
1812
1813static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001814com_assign_trailer(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001815{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001816 REQ(n, trailer);
1817 switch (TYPE(CHILD(n, 0))) {
1818 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001819 com_error(c, PyExc_SyntaxError,
1820 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001821 break;
1822 case DOT: /* '.' NAME */
1823 com_assign_attr(c, CHILD(n, 1), assigning);
1824 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001825 case LSQB: /* '[' subscriptlist ']' */
1826 com_subscriptlist(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001827 break;
1828 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001829 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001830 }
1831}
1832
1833static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001834com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001835{
1836 int i;
1837 if (TYPE(n) != testlist)
1838 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001839 if (assigning) {
1840 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001841 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001842 com_push(c, i-1);
1843 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001844 for (i = 0; i < NCH(n); i += 2)
1845 com_assign(c, CHILD(n, i), assigning);
1846}
1847
1848static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001849com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001850{
1851 REQ(n, NAME);
1852 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001853 if (assigning)
1854 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001855}
1856
1857static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001858com_assign(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001859{
1860 /* Loop to avoid trivial recursion */
1861 for (;;) {
1862 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001863
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001864 case exprlist:
1865 case testlist:
1866 if (NCH(n) > 1) {
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001867 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001868 return;
1869 }
1870 n = CHILD(n, 0);
1871 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001872
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001873 case test:
1874 case and_test:
1875 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001876 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001877 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001878 case xor_expr:
1879 case and_expr:
1880 case shift_expr:
1881 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001882 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00001883 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001884 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001885 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001886 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001887 return;
1888 }
1889 n = CHILD(n, 0);
1890 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001891
Guido van Rossum50564e81996-01-12 01:13:16 +00001892 case power: /* atom trailer* ('**' power)* */
1893/* ('+'|'-'|'~') factor | atom trailer* */
1894 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001895 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001896 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001897 return;
1898 }
Guido van Rossum50564e81996-01-12 01:13:16 +00001899 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001900 int i;
1901 com_node(c, CHILD(n, 0));
1902 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00001903 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001904 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001905 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00001906 return;
1907 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001908 com_apply_trailer(c, CHILD(n, i));
1909 } /* NB i is still alive */
1910 com_assign_trailer(c,
1911 CHILD(n, i), assigning);
1912 return;
1913 }
1914 n = CHILD(n, 0);
1915 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001916
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001917 case atom:
1918 switch (TYPE(CHILD(n, 0))) {
1919 case LPAR:
1920 n = CHILD(n, 1);
1921 if (TYPE(n) == RPAR) {
1922 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001923 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001924 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001925 return;
1926 }
1927 break;
1928 case LSQB:
1929 n = CHILD(n, 1);
1930 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001931 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001932 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001933 return;
1934 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001935 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001936 return;
1937 case NAME:
1938 com_assign_name(c, CHILD(n, 0), assigning);
1939 return;
1940 default:
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 literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001943 return;
1944 }
1945 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001946
1947 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001948 com_error(c, PyExc_SyntaxError,
1949 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001950 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001951
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001952 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001953 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001954 com_error(c, PyExc_SystemError,
1955 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001956 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001957
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001958 }
1959 }
1960}
Guido van Rossum7c531111997-03-11 18:42:21 +00001961
Tim Petersdbd9ba62000-07-09 03:09:57 +00001962/* Forward */ static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001963
1964static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001965com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001966{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001967 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001968 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001969 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001970 return;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001971 com_node(c, CHILD(n, NCH(n)-1));
1972 if (NCH(n) == 1) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001973 if (c->c_interactive)
1974 com_addbyte(c, PRINT_EXPR);
1975 else
1976 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001977 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001978 }
1979 else {
1980 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001981 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001982 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001983 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001984 com_push(c, 1);
1985 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001986 com_assign(c, CHILD(n, i), OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001987 }
1988 }
1989}
1990
1991static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001992com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00001993{
1994 int a = 0, b = 0;
1995 int i;
1996 REQ(n, assert_stmt); /* 'assert' test [',' test] */
1997 /* Generate code like for
1998
1999 if __debug__:
2000 if not <test>:
2001 raise AssertionError [, <message>]
2002
2003 where <message> is the second test, if present.
2004 */
2005 if (Py_OptimizeFlag)
2006 return;
2007 com_addopnamestr(c, LOAD_GLOBAL, "__debug__");
2008 com_push(c, 1);
2009 com_addfwref(c, JUMP_IF_FALSE, &a);
2010 com_addbyte(c, POP_TOP);
2011 com_pop(c, 1);
2012 com_node(c, CHILD(n, 1));
2013 com_addfwref(c, JUMP_IF_TRUE, &b);
2014 com_addbyte(c, POP_TOP);
2015 com_pop(c, 1);
2016 /* Raise that exception! */
2017 com_addopnamestr(c, LOAD_GLOBAL, "AssertionError");
2018 com_push(c, 1);
2019 i = NCH(n)/2; /* Either 2 or 4 */
2020 if (i > 1)
2021 com_node(c, CHILD(n, 3));
2022 com_addoparg(c, RAISE_VARARGS, i);
2023 com_pop(c, i);
2024 /* The interpreter does not fall through */
2025 /* All jumps converge here */
2026 com_backpatch(c, a);
2027 com_backpatch(c, b);
2028 com_addbyte(c, POP_TOP);
2029}
2030
2031static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002032com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002033{
2034 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002035 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
2036 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002037 com_node(c, CHILD(n, i));
2038 com_addbyte(c, PRINT_ITEM);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002039 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002040 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002041 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002042 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002043 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002044}
2045
2046static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002047com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002048{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002049 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002050 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002051 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002052 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002053 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002054 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002055 com_push(c, 1);
2056 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002057 else
2058 com_node(c, CHILD(n, 1));
2059 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002060 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002061}
2062
2063static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002064com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002065{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002066 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002067 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2068 if (NCH(n) > 1) {
2069 com_node(c, CHILD(n, 1));
2070 if (NCH(n) > 3) {
2071 com_node(c, CHILD(n, 3));
2072 if (NCH(n) > 5)
2073 com_node(c, CHILD(n, 5));
2074 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002075 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002076 i = NCH(n)/2;
2077 com_addoparg(c, RAISE_VARARGS, i);
2078 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002079}
2080
2081static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002082com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002083{
2084 int i;
2085 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002086 /* 'import' dotted_name (',' dotted_name)* |
2087 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002088 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002089 /* 'from' dotted_name 'import' ... */
2090 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002091 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002092 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002093 for (i = 3; i < NCH(n); i += 2)
2094 com_addopname(c, IMPORT_FROM, CHILD(n, i));
2095 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002096 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002097 }
2098 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002099 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002100 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002101 REQ(CHILD(n, i), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002102 com_addopname(c, IMPORT_NAME, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002103 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002104 com_addopname(c, STORE_NAME, CHILD(CHILD(n, i), 0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002105 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002106 }
2107 }
2108}
2109
2110static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002111com_global_stmt(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002112{
2113 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002114 REQ(n, global_stmt);
2115 /* 'global' NAME (',' NAME)* */
2116 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002117 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002118#ifdef PRIVATE_NAME_MANGLING
2119 char buffer[256];
2120 if (s != NULL && s[0] == '_' && s[1] == '_' &&
2121 c->c_private != NULL &&
Guido van Rossum582acec2000-06-28 22:07:35 +00002122 com_mangle(c, s, buffer, sizeof(buffer)))
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002123 s = buffer;
2124#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +00002125 if (PyDict_GetItemString(c->c_locals, s) != NULL) {
2126 com_error(c, PyExc_SyntaxError,
2127 "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002128 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002129 else if (PyDict_SetItemString(c->c_globals, s, Py_None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002130 c->c_errors++;
2131 }
2132}
2133
Guido van Rossum681d79a1995-07-18 14:51:37 +00002134static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002135com_newlocal_o(struct compiling *c, PyObject *nameval)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002136{
2137 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002138 PyObject *ival;
2139 if (PyList_Size(c->c_varnames) != c->c_nlocals) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002140 /* This is usually caused by an error on a previous call */
2141 if (c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002142 com_error(c, PyExc_SystemError,
2143 "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002144 }
2145 return 0;
2146 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002147 ival = PyInt_FromLong(i = c->c_nlocals++);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002148 if (ival == NULL)
2149 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002150 else if (PyDict_SetItem(c->c_locals, nameval, ival) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002151 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002152 else if (PyList_Append(c->c_varnames, nameval) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002153 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002154 Py_XDECREF(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002155 return i;
2156}
2157
2158static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002159com_addlocal_o(struct compiling *c, PyObject *nameval)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002160{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002161 PyObject *ival = PyDict_GetItem(c->c_locals, nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002162 if (ival != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002163 return PyInt_AsLong(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002164 return com_newlocal_o(c, nameval);
2165}
2166
2167static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002168com_newlocal(struct compiling *c, char *name)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002169{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002170 PyObject *nameval = PyString_InternFromString(name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002171 int i;
2172 if (nameval == NULL) {
2173 c->c_errors++;
2174 return 0;
2175 }
2176 i = com_newlocal_o(c, nameval);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002177 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002178 return i;
2179}
2180
Guido van Rossumc5e96291991-12-10 13:53:51 +00002181static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002182com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002183{
2184 REQ(n, exec_stmt);
2185 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2186 com_node(c, CHILD(n, 1));
2187 if (NCH(n) >= 4)
2188 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002189 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002190 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002191 com_push(c, 1);
2192 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002193 if (NCH(n) >= 6)
2194 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002195 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002196 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002197 com_push(c, 1);
2198 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002199 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002200 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002201}
2202
Guido van Rossum7c531111997-03-11 18:42:21 +00002203static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002204is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002205{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002206 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002207 int i;
2208
2209 /* Label to avoid tail recursion */
2210 next:
2211 switch (TYPE(n)) {
2212
2213 case suite:
2214 if (NCH(n) == 1) {
2215 n = CHILD(n, 0);
2216 goto next;
2217 }
2218 /* Fall through */
2219 case file_input:
2220 for (i = 0; i < NCH(n); i++) {
2221 node *ch = CHILD(n, i);
2222 if (TYPE(ch) == stmt) {
2223 n = ch;
2224 goto next;
2225 }
2226 }
2227 break;
2228
2229 case stmt:
2230 case simple_stmt:
2231 case small_stmt:
2232 n = CHILD(n, 0);
2233 goto next;
2234
2235 case expr_stmt:
2236 case testlist:
2237 case test:
2238 case and_test:
2239 case not_test:
2240 case comparison:
2241 case expr:
2242 case xor_expr:
2243 case and_expr:
2244 case shift_expr:
2245 case arith_expr:
2246 case term:
2247 case factor:
2248 case power:
2249 case atom:
2250 if (NCH(n) == 1) {
2251 n = CHILD(n, 0);
2252 goto next;
2253 }
2254 break;
2255
2256 case NAME:
2257 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2258 return 1;
2259 break;
2260
2261 case NUMBER:
2262 v = parsenumber(c, STR(n));
2263 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002264 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002265 break;
2266 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002267 i = PyObject_IsTrue(v);
2268 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002269 return i == 0;
2270
2271 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002272 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002273 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002274 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002275 break;
2276 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002277 i = PyObject_IsTrue(v);
2278 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002279 return i == 0;
2280
2281 }
2282 return 0;
2283}
2284
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002285static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002286com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002287{
2288 int i;
2289 int anchor = 0;
2290 REQ(n, if_stmt);
2291 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2292 for (i = 0; i+3 < NCH(n); i+=4) {
2293 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002294 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002295 if (is_constant_false(c, ch))
2296 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002297 if (i > 0)
2298 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002299 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002300 com_addfwref(c, JUMP_IF_FALSE, &a);
2301 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002302 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002303 com_node(c, CHILD(n, i+3));
2304 com_addfwref(c, JUMP_FORWARD, &anchor);
2305 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002306 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002307 com_addbyte(c, POP_TOP);
2308 }
2309 if (i+2 < NCH(n))
2310 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002311 if (anchor)
2312 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002313}
2314
2315static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002316com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002317{
2318 int break_anchor = 0;
2319 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002320 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002321 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2322 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002323 block_push(c, SETUP_LOOP);
2324 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002325 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002326 com_node(c, CHILD(n, 1));
2327 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2328 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002329 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002330 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002331 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002332 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002333 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2334 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002335 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002336 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002337 com_addbyte(c, POP_TOP);
2338 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002339 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002340 if (NCH(n) > 4)
2341 com_node(c, CHILD(n, 6));
2342 com_backpatch(c, break_anchor);
2343}
2344
2345static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002346com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002347{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002348 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002349 int break_anchor = 0;
2350 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002351 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002352 REQ(n, for_stmt);
2353 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2354 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002355 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002356 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002357 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002358 if (v == NULL)
2359 c->c_errors++;
2360 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002361 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002362 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002363 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002364 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002365 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002366 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002367 com_assign(c, CHILD(n, 1), OP_ASSIGN);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002368 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002369 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002370 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002371 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2372 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002373 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002374 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002375 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002376 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002377 if (NCH(n) > 8)
2378 com_node(c, CHILD(n, 8));
2379 com_backpatch(c, break_anchor);
2380}
2381
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002382/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002383
2384 SETUP_FINALLY L
2385 <code for S>
2386 POP_BLOCK
2387 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002388 L: <code for Sf>
2389 END_FINALLY
2390
2391 The special instructions use the block stack. Each block
2392 stack entry contains the instruction that created it (here
2393 SETUP_FINALLY), the level of the value stack at the time the
2394 block stack entry was created, and a label (here L).
2395
2396 SETUP_FINALLY:
2397 Pushes the current value stack level and the label
2398 onto the block stack.
2399 POP_BLOCK:
2400 Pops en entry from the block stack, and pops the value
2401 stack until its level is the same as indicated on the
2402 block stack. (The label is ignored.)
2403 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002404 Pops a variable number of entries from the *value* stack
2405 and re-raises the exception they specify. The number of
2406 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002407
2408 The block stack is unwound when an exception is raised:
2409 when a SETUP_FINALLY entry is found, the exception is pushed
2410 onto the value stack (and the exception condition is cleared),
2411 and the interpreter jumps to the label gotten from the block
2412 stack.
2413
2414 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002415 (The contents of the value stack is shown in [], with the top
2416 at the right; 'tb' is trace-back info, 'val' the exception's
2417 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002418
2419 Value stack Label Instruction Argument
2420 [] SETUP_EXCEPT L1
2421 [] <code for S>
2422 [] POP_BLOCK
2423 [] JUMP_FORWARD L0
2424
Guido van Rossum3f5da241990-12-20 15:06:42 +00002425 [tb, val, exc] L1: DUP )
2426 [tb, val, exc, exc] <evaluate E1> )
2427 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2428 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2429 [tb, val, exc, 1] POP )
2430 [tb, val, exc] POP
2431 [tb, val] <assign to V1> (or POP if no V1)
2432 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002433 [] <code for S1>
2434 JUMP_FORWARD L0
2435
Guido van Rossum3f5da241990-12-20 15:06:42 +00002436 [tb, val, exc, 0] L2: POP
2437 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002438 .............................etc.......................
2439
Guido van Rossum3f5da241990-12-20 15:06:42 +00002440 [tb, val, exc, 0] Ln+1: POP
2441 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002442
2443 [] L0: <next statement>
2444
2445 Of course, parts are not generated if Vi or Ei is not present.
2446*/
2447
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002448static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002449com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002450{
2451 int except_anchor = 0;
2452 int end_anchor = 0;
2453 int else_anchor = 0;
2454 int i;
2455 node *ch;
2456
2457 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2458 block_push(c, SETUP_EXCEPT);
2459 com_node(c, CHILD(n, 2));
2460 com_addbyte(c, POP_BLOCK);
2461 block_pop(c, SETUP_EXCEPT);
2462 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2463 com_backpatch(c, except_anchor);
2464 for (i = 3;
2465 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2466 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002467 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002468 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002469 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002470 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002471 break;
2472 }
2473 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002474 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002475 com_addoparg(c, SET_LINENO, ch->n_lineno);
2476 if (NCH(ch) > 1) {
2477 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002478 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002479 com_node(c, CHILD(ch, 1));
2480 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002481 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002482 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2483 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002484 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002485 }
2486 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002487 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002488 if (NCH(ch) > 3)
Guido van Rossum8861b741996-07-30 16:49:37 +00002489 com_assign(c, CHILD(ch, 3), OP_ASSIGN);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002490 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002491 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002492 com_pop(c, 1);
2493 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002494 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002495 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002496 com_node(c, CHILD(n, i+2));
2497 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2498 if (except_anchor) {
2499 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002500 /* We come in with [tb, val, exc, 0] on the
2501 stack; one pop and it's the same as
2502 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002503 com_addbyte(c, POP_TOP);
2504 }
2505 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002506 /* We actually come in here with [tb, val, exc] but the
2507 END_FINALLY will zap those and jump around.
2508 The c_stacklevel does not reflect them so we need not pop
2509 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002510 com_addbyte(c, END_FINALLY);
2511 com_backpatch(c, else_anchor);
2512 if (i < NCH(n))
2513 com_node(c, CHILD(n, i+2));
2514 com_backpatch(c, end_anchor);
2515}
2516
2517static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002518com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002519{
2520 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002521 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002522
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002523 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2524 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002525 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002526 com_addbyte(c, POP_BLOCK);
2527 block_pop(c, SETUP_FINALLY);
2528 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002529 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002530 /* While the generated code pushes only one item,
2531 the try-finally handling can enter here with
2532 up to three items. OK, here are the details:
2533 3 for an exception, 2 for RETURN, 1 for BREAK. */
2534 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002535 com_backpatch(c, finally_anchor);
2536 ch = CHILD(n, NCH(n)-1);
2537 com_addoparg(c, SET_LINENO, ch->n_lineno);
2538 com_node(c, ch);
2539 com_addbyte(c, END_FINALLY);
2540 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002541 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002542}
2543
2544static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002545com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002546{
2547 REQ(n, try_stmt);
2548 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2549 | 'try' ':' suite 'finally' ':' suite */
2550 if (TYPE(CHILD(n, 3)) != except_clause)
2551 com_try_finally(c, n);
2552 else
2553 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002554}
2555
Guido van Rossum8b993a91997-01-17 21:04:03 +00002556static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002557get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002558{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002559 int i;
2560
Guido van Rossum8b993a91997-01-17 21:04:03 +00002561 /* Label to avoid tail recursion */
2562 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002563 switch (TYPE(n)) {
2564
2565 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002566 if (NCH(n) == 1) {
2567 n = CHILD(n, 0);
2568 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002569 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002570 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002571 case file_input:
2572 for (i = 0; i < NCH(n); i++) {
2573 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002574 if (TYPE(ch) == stmt) {
2575 n = ch;
2576 goto next;
2577 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002578 }
2579 break;
2580
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002581 case stmt:
2582 case simple_stmt:
2583 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002584 n = CHILD(n, 0);
2585 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002586
2587 case expr_stmt:
2588 case testlist:
2589 case test:
2590 case and_test:
2591 case not_test:
2592 case comparison:
2593 case expr:
2594 case xor_expr:
2595 case and_expr:
2596 case shift_expr:
2597 case arith_expr:
2598 case term:
2599 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002600 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002601 if (NCH(n) == 1) {
2602 n = CHILD(n, 0);
2603 goto next;
2604 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002605 break;
2606
2607 case atom:
2608 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002609 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002610 break;
2611
2612 }
2613 return NULL;
2614}
2615
Guido van Rossum79f25d91997-04-29 20:08:16 +00002616static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002617get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002618{
Guido van Rossum541563e1999-01-28 15:08:09 +00002619 /* Don't generate doc-strings if run with -OO */
2620 if (Py_OptimizeFlag > 1)
2621 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002622 n = get_rawdocstring(n);
2623 if (n == NULL)
2624 return NULL;
2625 return parsestrplus(n);
2626}
2627
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002628static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002629com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002630{
2631 REQ(n, suite);
2632 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2633 if (NCH(n) == 1) {
2634 com_node(c, CHILD(n, 0));
2635 }
2636 else {
2637 int i;
2638 for (i = 0; i < NCH(n); i++) {
2639 node *ch = CHILD(n, i);
2640 if (TYPE(ch) == stmt)
2641 com_node(c, ch);
2642 }
2643 }
2644}
2645
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002646/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002647static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002648com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002649{
2650 int i = c->c_nblocks;
2651 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2652 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2653 }
2654 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002655 com_error(c, PyExc_SyntaxError,
2656 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002657 }
2658 /* XXX Could allow it inside a 'finally' clause
2659 XXX if we could pop the exception still on the stack */
2660}
2661
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002662static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002663com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002664{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002665 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002666 if (TYPE(n) == lambdef) {
2667 /* lambdef: 'lambda' [varargslist] ':' test */
2668 n = CHILD(n, 1);
2669 }
2670 else {
2671 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2672 n = CHILD(n, 2);
2673 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2674 n = CHILD(n, 1);
2675 }
2676 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002677 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002678 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002679 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002680 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2681 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002682 nargs = 0;
2683 ndefs = 0;
2684 for (i = 0; i < nch; i++) {
2685 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002686 if (TYPE(CHILD(n, i)) == STAR ||
2687 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002688 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002689 nargs++;
2690 i++;
2691 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002692 t = RPAR; /* Anything except EQUAL or COMMA */
2693 else
2694 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002695 if (t == EQUAL) {
2696 i++;
2697 ndefs++;
2698 com_node(c, CHILD(n, i));
2699 i++;
2700 if (i >= nch)
2701 break;
2702 t = TYPE(CHILD(n, i));
2703 }
2704 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00002705 /* Treat "(a=1, b)" as an error */
2706 if (ndefs)
2707 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00002708 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002709 }
2710 if (t != COMMA)
2711 break;
2712 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002713 return ndefs;
2714}
2715
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002716static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002717com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002718{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002719 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002720 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002721 v = (PyObject *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002722 if (v == NULL)
2723 c->c_errors++;
2724 else {
2725 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002726 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002727 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002728 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002729 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002730 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002731 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002732 com_pop(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002733 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002734 }
2735}
2736
2737static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002738com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002739{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002740 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002741 REQ(n, testlist);
2742 /* testlist: test (',' test)* [','] */
2743 for (i = 0; i < NCH(n); i += 2)
2744 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002745 i = (NCH(n)+1) / 2;
2746 com_addoparg(c, BUILD_TUPLE, i);
2747 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00002748}
2749
2750static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002751com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002752{
Guido van Rossum25831651993-05-19 14:50:45 +00002753 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002754 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002755 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002756 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00002757 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00002758 c->c_errors++;
2759 return;
2760 }
2761 /* Push the class name on the stack */
2762 i = com_addconst(c, v);
2763 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002764 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002765 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00002766 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002767 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00002768 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002769 com_push(c, 1);
2770 }
Guido van Rossum25831651993-05-19 14:50:45 +00002771 else
2772 com_bases(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002773 v = (PyObject *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002774 if (v == NULL)
2775 c->c_errors++;
2776 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002777 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002778 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002779 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002780 com_addoparg(c, MAKE_FUNCTION, 0);
2781 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002782 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002783 com_pop(c, 2);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002784 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002785 Py_DECREF(v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002786 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002787}
2788
2789static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002790com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002791{
2792 switch (TYPE(n)) {
2793
2794 /* Definition nodes */
2795
2796 case funcdef:
2797 com_funcdef(c, n);
2798 break;
2799 case classdef:
2800 com_classdef(c, n);
2801 break;
2802
2803 /* Trivial parse tree nodes */
2804
2805 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002806 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002807 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002808 com_node(c, CHILD(n, 0));
2809 break;
2810
2811 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002812 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2813 com_addoparg(c, SET_LINENO, n->n_lineno);
2814 {
2815 int i;
2816 for (i = 0; i < NCH(n)-1; i += 2)
2817 com_node(c, CHILD(n, i));
2818 }
2819 break;
2820
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002821 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002822 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002823 com_node(c, CHILD(n, 0));
2824 break;
2825
2826 /* Statement nodes */
2827
2828 case expr_stmt:
2829 com_expr_stmt(c, n);
2830 break;
2831 case print_stmt:
2832 com_print_stmt(c, n);
2833 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002834 case del_stmt: /* 'del' exprlist */
Guido van Rossum8861b741996-07-30 16:49:37 +00002835 com_assign(c, CHILD(n, 1), OP_DELETE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002836 break;
2837 case pass_stmt:
2838 break;
2839 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002840 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002841 com_error(c, PyExc_SyntaxError,
2842 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002843 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002844 com_addbyte(c, BREAK_LOOP);
2845 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002846 case continue_stmt:
2847 com_continue_stmt(c, n);
2848 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002849 case return_stmt:
2850 com_return_stmt(c, n);
2851 break;
2852 case raise_stmt:
2853 com_raise_stmt(c, n);
2854 break;
2855 case import_stmt:
2856 com_import_stmt(c, n);
2857 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002858 case global_stmt:
2859 com_global_stmt(c, n);
2860 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002861 case exec_stmt:
2862 com_exec_stmt(c, n);
2863 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002864 case assert_stmt:
2865 com_assert_stmt(c, n);
2866 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002867 case if_stmt:
2868 com_if_stmt(c, n);
2869 break;
2870 case while_stmt:
2871 com_while_stmt(c, n);
2872 break;
2873 case for_stmt:
2874 com_for_stmt(c, n);
2875 break;
2876 case try_stmt:
2877 com_try_stmt(c, n);
2878 break;
2879 case suite:
2880 com_suite(c, n);
2881 break;
2882
2883 /* Expression nodes */
2884
2885 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002886 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002887 break;
2888 case test:
2889 com_test(c, n);
2890 break;
2891 case and_test:
2892 com_and_test(c, n);
2893 break;
2894 case not_test:
2895 com_not_test(c, n);
2896 break;
2897 case comparison:
2898 com_comparison(c, n);
2899 break;
2900 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002901 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002902 break;
2903 case expr:
2904 com_expr(c, n);
2905 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002906 case xor_expr:
2907 com_xor_expr(c, n);
2908 break;
2909 case and_expr:
2910 com_and_expr(c, n);
2911 break;
2912 case shift_expr:
2913 com_shift_expr(c, n);
2914 break;
2915 case arith_expr:
2916 com_arith_expr(c, n);
2917 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002918 case term:
2919 com_term(c, n);
2920 break;
2921 case factor:
2922 com_factor(c, n);
2923 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00002924 case power:
2925 com_power(c, n);
2926 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002927 case atom:
2928 com_atom(c, n);
2929 break;
2930
2931 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002932 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002933 com_error(c, PyExc_SystemError,
2934 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002935 }
2936}
2937
Tim Petersdbd9ba62000-07-09 03:09:57 +00002938static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002939
2940static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002941com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002942{
2943 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
2944 if (TYPE(CHILD(n, 0)) == LPAR)
2945 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002946 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002947 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002948 com_pop(c, 1);
2949 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002950}
2951
2952static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002953com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002954{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00002955 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002956 if (NCH(n) == 1) {
2957 com_fpdef(c, CHILD(n, 0));
2958 }
2959 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002960 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002961 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002962 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002963 for (i = 0; i < NCH(n); i += 2)
2964 com_fpdef(c, CHILD(n, i));
2965 }
2966}
2967
2968static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002969com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002970{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002971 int nch, i;
2972 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00002973 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002974 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00002975 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002976 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002977 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002978 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002979 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002980 node *ch = CHILD(n, i);
2981 node *fp;
2982 char *name;
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00002983 PyObject *nameval;
Guido van Rossum50564e81996-01-12 01:13:16 +00002984 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002985 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002986 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
2987 fp = CHILD(ch, 0);
2988 if (TYPE(fp) == NAME)
2989 name = STR(fp);
2990 else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00002991 name = nbuf;
2992 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00002993 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002994 }
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00002995 nameval = PyString_InternFromString(name);
2996 if (nameval == NULL) {
2997 c->c_errors++;
2998 }
Peter Schneider-Kamp9a5086c2000-07-13 06:24:29 +00002999 if (PyDict_GetItem(c->c_locals, nameval)) {
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003000 com_error(c, PyExc_SyntaxError,"duplicate argument in function definition");
3001 }
3002 com_newlocal_o(c, nameval);
3003 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003004 c->c_argcount++;
3005 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003006 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003007 ch = CHILD(n, i);
3008 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003009 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003010 else
3011 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003012 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003013 /* Handle *arguments */
3014 if (i < nch) {
3015 node *ch;
3016 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003017 if (TYPE(ch) != DOUBLESTAR) {
3018 REQ(ch, STAR);
3019 ch = CHILD(n, i+1);
3020 if (TYPE(ch) == NAME) {
3021 c->c_flags |= CO_VARARGS;
3022 i += 3;
3023 com_newlocal(c, STR(ch));
3024 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003025 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003026 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003027 /* Handle **keywords */
3028 if (i < nch) {
3029 node *ch;
3030 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003031 if (TYPE(ch) != DOUBLESTAR) {
3032 REQ(ch, STAR);
3033 ch = CHILD(n, i+1);
3034 REQ(ch, STAR);
3035 ch = CHILD(n, i+2);
3036 }
3037 else
3038 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003039 REQ(ch, NAME);
3040 c->c_flags |= CO_VARKEYWORDS;
3041 com_newlocal(c, STR(ch));
3042 }
3043 if (complex) {
3044 /* Generate code for complex arguments only after
3045 having counted the simple arguments */
3046 int ilocal = 0;
3047 for (i = 0; i < nch; i++) {
3048 node *ch = CHILD(n, i);
3049 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003050 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003051 break;
3052 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3053 fp = CHILD(ch, 0);
3054 if (TYPE(fp) != NAME) {
3055 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003056 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003057 com_fpdef(c, ch);
3058 }
3059 ilocal++;
3060 if (++i >= nch)
3061 break;
3062 ch = CHILD(n, i);
3063 if (TYPE(ch) == EQUAL)
3064 i += 2;
3065 else
3066 REQ(ch, COMMA);
3067 }
3068 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003069}
3070
3071static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003072com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003073{
3074 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003075 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003076 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003077 doc = get_docstring(n);
3078 if (doc != NULL) {
3079 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003080 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003081 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003082 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003083 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003084 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003085 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003086 for (i = 0; i < NCH(n); i++) {
3087 node *ch = CHILD(n, i);
3088 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3089 com_node(c, ch);
3090 }
3091}
3092
3093/* Top-level compile-node interface */
3094
3095static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003096compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003097{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003098 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003099 node *ch;
3100 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003101 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003102 doc = get_docstring(CHILD(n, 4));
3103 if (doc != NULL) {
3104 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003105 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003106 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003107 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003108 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003109 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3110 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003111 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003112 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003113 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003114 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003115 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003116 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003117 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003118 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003119 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003120}
3121
3122static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003123compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003124{
Guido van Rossum590baa41993-11-30 13:40:46 +00003125 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003126 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003127 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003128
3129 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003130 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003131 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003132 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003133 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003134 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003135 else
3136 ch = CHILD(n, 2);
3137 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003138 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003139 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003140}
3141
3142static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003143compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003144{
3145 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003146 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003147 REQ(n, classdef);
3148 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3149 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003150#ifdef PRIVATE_NAME_MANGLING
3151 c->c_private = c->c_name;
3152#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003153 ch = CHILD(n, NCH(n)-1); /* The suite */
3154 doc = get_docstring(ch);
3155 if (doc != NULL) {
3156 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003157 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003158 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003159 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003160 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003161 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003162 }
3163 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003164 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003165 com_node(c, ch);
3166 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003167 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003168 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003169 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003170}
3171
3172static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003173compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003174{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003175 com_addoparg(c, SET_LINENO, n->n_lineno);
3176
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003177 switch (TYPE(n)) {
3178
Guido van Rossum4c417781991-01-21 16:09:22 +00003179 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003180 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003181 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003182 n = CHILD(n, 0);
3183 if (TYPE(n) != NEWLINE)
3184 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003185 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003186 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003187 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003188 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003189 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003190 break;
3191
Guido van Rossum4c417781991-01-21 16:09:22 +00003192 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003193 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003194 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003195 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003196 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003197 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003198 break;
3199
Guido van Rossum590baa41993-11-30 13:40:46 +00003200 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003201 com_node(c, CHILD(n, 0));
3202 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003203 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003204 break;
3205
Guido van Rossum590baa41993-11-30 13:40:46 +00003206 case lambdef: /* anonymous function definition */
3207 compile_lambdef(c, n);
3208 break;
3209
Guido van Rossum4c417781991-01-21 16:09:22 +00003210 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003211 compile_funcdef(c, n);
3212 break;
3213
Guido van Rossum4c417781991-01-21 16:09:22 +00003214 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003215 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003216 break;
3217
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003218 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003219 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003220 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003221 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003222 }
3223}
3224
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003225/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00003226
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003227 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
3228 instructions that refer to local variables with LOAD_FAST etc.
3229 The latter instructions are much faster because they don't need to
3230 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003231
Guido van Rossum681d79a1995-07-18 14:51:37 +00003232 To find all local variables, we check all STORE_NAME, IMPORT_FROM
3233 and DELETE_NAME instructions. This yields all local variables,
3234 function definitions, class definitions and import statements.
3235 Argument names have already been entered into the list by the
3236 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003237
3238 All remaining LOAD_NAME instructions must refer to non-local (global
3239 or builtin) variables, so are replaced by LOAD_GLOBAL.
3240
3241 There are two problems: 'from foo import *' and 'exec' may introduce
3242 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00003243 case, we can still optimize bona fide locals (since those
3244 statements will be surrounded by fast_2_locals() and
3245 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003246
Guido van Rossum681d79a1995-07-18 14:51:37 +00003247 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00003248
3249static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003250optimize(struct compiling *c)
Guido van Rossum282914b1991-04-04 10:42:56 +00003251{
Guido van Rossum0a697f61991-04-16 08:39:12 +00003252 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00003253 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00003254 int oparg = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003255 PyObject *name;
3256 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003257
Guido van Rossum282914b1991-04-04 10:42:56 +00003258#define NEXTOP() (*next_instr++)
3259#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossum79f25d91997-04-29 20:08:16 +00003260#define GETITEM(v, i) (PyList_GetItem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003261#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
3262
Guido van Rossum79f25d91997-04-29 20:08:16 +00003263 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003264
3265 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00003266
Guido van Rossum79f25d91997-04-29 20:08:16 +00003267 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003268 for (;;) {
3269 opcode = NEXTOP();
3270 if (opcode == STOP_CODE)
3271 break;
3272 if (HAS_ARG(opcode))
3273 oparg = NEXTARG();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003274 switch (opcode) {
3275 case STORE_NAME:
3276 case DELETE_NAME:
3277 case IMPORT_FROM:
3278 com_addlocal_o(c, GETNAMEOBJ(oparg));
3279 break;
3280 case EXEC_STMT:
3281 c->c_flags &= ~CO_OPTIMIZED;
3282 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00003283 }
3284 }
3285
Guido van Rossum79f25d91997-04-29 20:08:16 +00003286 if (PyDict_GetItemString(c->c_locals, "*") != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003287 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003288
Guido van Rossum79f25d91997-04-29 20:08:16 +00003289 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003290 for (;;) {
3291 cur_instr = next_instr;
3292 opcode = NEXTOP();
3293 if (opcode == STOP_CODE)
3294 break;
3295 if (HAS_ARG(opcode))
3296 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003297 if (opcode == LOAD_NAME ||
3298 opcode == STORE_NAME ||
3299 opcode == DELETE_NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003300 PyObject *v;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003301 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00003302 name = GETNAMEOBJ(oparg);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003303 v = PyDict_GetItem(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003304 if (v == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003305 if (opcode == LOAD_NAME &&
3306 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003307 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003308 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00003309 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003310 i = PyInt_AsLong(v);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003311 switch (opcode) {
3312 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
3313 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
3314 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
3315 }
3316 cur_instr[1] = i & 0xff;
3317 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00003318 }
3319 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003320
Guido van Rossum681d79a1995-07-18 14:51:37 +00003321 if (c->c_errors == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00003322 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00003323}
3324
Guido van Rossum79f25d91997-04-29 20:08:16 +00003325PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003326PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003327{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003328 return jcompile(n, filename, NULL);
3329}
3330
Guido van Rossum79f25d91997-04-29 20:08:16 +00003331static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003332icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003333{
3334 return jcompile(n, base->c_filename, base);
3335}
3336
Guido van Rossum79f25d91997-04-29 20:08:16 +00003337static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003338jcompile(node *n, char *filename, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003339{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003340 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003341 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003342 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003343 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003344#ifdef PRIVATE_NAME_MANGLING
3345 if (base)
3346 sc.c_private = base->c_private;
3347 else
3348 sc.c_private = NULL;
3349#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003350 compile_node(&sc, n);
3351 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003352 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003353 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003354 sc.c_flags |= CO_NEWLOCALS;
3355 }
3356 else if (TYPE(n) == classdef)
3357 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00003358 co = NULL;
3359 if (sc.c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003360 PyObject *consts, *names, *varnames, *filename, *name;
3361 consts = PyList_AsTuple(sc.c_consts);
3362 names = PyList_AsTuple(sc.c_names);
3363 varnames = PyList_AsTuple(sc.c_varnames);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003364 filename = PyString_InternFromString(sc.c_filename);
3365 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003366 if (!PyErr_Occurred())
3367 co = PyCode_New(sc.c_argcount,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003368 sc.c_nlocals,
Guido van Rossum8b993a91997-01-17 21:04:03 +00003369 sc.c_maxstacklevel,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003370 sc.c_flags,
3371 sc.c_code,
3372 consts,
3373 names,
3374 varnames,
3375 filename,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003376 name,
3377 sc.c_firstlineno,
3378 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003379 Py_XDECREF(consts);
3380 Py_XDECREF(names);
3381 Py_XDECREF(varnames);
3382 Py_XDECREF(filename);
3383 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003384 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003385 else if (!PyErr_Occurred()) {
3386 /* This could happen if someone called PyErr_Clear() after an
3387 error was reported above. That's not supposed to happen,
3388 but I just plugged one case and I'm not sure there can't be
3389 others. In that case, raise SystemError so that at least
3390 it gets reported instead dumping core. */
3391 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3392 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003393 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003394 return co;
3395}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003396
3397int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003398PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003399{
3400 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003401 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003402 int line = co->co_firstlineno;
3403 int addr = 0;
3404 while (--size >= 0) {
3405 addr += *p++;
3406 if (addr > addrq)
3407 break;
3408 line += *p++;
3409 }
3410 return line;
3411}