blob: 73167909baa2179746710b8d7ceaede487dd22c1 [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{
Fred Drakedcf08e02000-08-15 15:49:44 +0000306 PyObject *v, *tb, *tmp;
Guido van Rossum635abd21997-01-06 22:56:52 +0000307 c->c_errors++;
Guido van Rossum452a9831996-09-17 14:32:04 +0000308 if (c->c_lineno <= 1) {
309 /* Unknown line number or single interactive command */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000310 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000311 return;
312 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000313 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000314 if (v == NULL)
315 return; /* MemoryError, too bad */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000316 PyErr_SetObject(exc, v);
317 Py_DECREF(v);
Fred Drakedcf08e02000-08-15 15:49:44 +0000318
319 /* add attributes for the line number and filename for the error */
320 PyErr_Fetch(&exc, &v, &tb);
321 PyErr_NormalizeException(&exc, &v, &tb);
322 tmp = PyInt_FromLong(c->c_lineno);
323 if (tmp == NULL)
324 PyErr_Clear();
325 else {
326 if (PyObject_SetAttrString(v, "lineno", tmp))
327 PyErr_Clear();
328 Py_DECREF(tmp);
329 }
330 if (c->c_filename != NULL) {
331 tmp = PyString_FromString(c->c_filename);
332 if (tmp == NULL)
333 PyErr_Clear();
334 else {
335 if (PyObject_SetAttrString(v, "filename", tmp))
336 PyErr_Clear();
337 Py_DECREF(tmp);
338 }
339 }
340 PyErr_Restore(exc, v, tb);
Guido van Rossum452a9831996-09-17 14:32:04 +0000341}
342
343
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000344/* Interface to the block stack */
345
346static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000347block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000348{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000349 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000350 com_error(c, PyExc_SystemError,
351 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000352 }
353 else {
354 c->c_block[c->c_nblocks++] = type;
355 }
356}
357
358static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000359block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000360{
361 if (c->c_nblocks > 0)
362 c->c_nblocks--;
363 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000364 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000365 }
366}
367
368
Guido van Rossum681d79a1995-07-18 14:51:37 +0000369/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000370
Tim Petersdbd9ba62000-07-09 03:09:57 +0000371static int com_init(struct compiling *, char *);
372static void com_free(struct compiling *);
373static void com_push(struct compiling *, int);
374static void com_pop(struct compiling *, int);
375static void com_done(struct compiling *);
376static void com_node(struct compiling *, struct _node *);
377static void com_factor(struct compiling *, struct _node *);
378static void com_addbyte(struct compiling *, int);
379static void com_addint(struct compiling *, int);
380static void com_addoparg(struct compiling *, int, int);
381static void com_addfwref(struct compiling *, int, int *);
382static void com_backpatch(struct compiling *, int);
383static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
384static int com_addconst(struct compiling *, PyObject *);
385static int com_addname(struct compiling *, PyObject *);
386static void com_addopname(struct compiling *, int, node *);
387static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000388static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000389static int com_argdefs(struct compiling *, node *);
390static int com_newlocal(struct compiling *, char *);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000391static void com_assign(struct compiling *, node *, int);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000392static PyCodeObject *icompile(struct _node *, struct compiling *);
393static PyCodeObject *jcompile(struct _node *, char *,
394 struct compiling *);
395static PyObject *parsestrplus(node *);
396static PyObject *parsestr(char *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000397
398static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000399com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000400{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000401 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000402 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
403 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000404 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000405 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000406 goto fail;
407 if ((c->c_const_dict = PyDict_New()) == NULL)
408 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000409 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000410 goto fail;
411 if ((c->c_name_dict = PyDict_New()) == NULL)
412 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000413 if ((c->c_globals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000414 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000415 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000416 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000417 if ((c->c_varnames = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000418 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000419 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
420 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000421 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000422 c->c_nlocals = 0;
423 c->c_argcount = 0;
424 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000425 c->c_nexti = 0;
426 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000427 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000428 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000429 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000430 c->c_begin = 0;
431 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000432 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000433 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000434 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000435 c->c_stacklevel = 0;
436 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000437 c->c_firstlineno = 0;
438 c->c_last_addr = 0;
439 c->c_last_line = 0;
440 c-> c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000441 c->c_tmpname = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000442 return 1;
443
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000444 fail:
445 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000446 return 0;
447}
448
449static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000450com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000451{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000452 Py_XDECREF(c->c_code);
453 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000454 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000455 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000456 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000457 Py_XDECREF(c->c_globals);
458 Py_XDECREF(c->c_locals);
459 Py_XDECREF(c->c_varnames);
460 Py_XDECREF(c->c_lnotab);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000461}
462
463static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000464com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000465{
466 c->c_stacklevel += n;
467 if (c->c_stacklevel > c->c_maxstacklevel)
468 c->c_maxstacklevel = c->c_stacklevel;
469}
470
471static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000472com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000473{
474 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000475 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000476 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
477 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000478 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000479 c->c_stacklevel = 0;
480 }
481 else
482 c->c_stacklevel -= n;
483}
484
485static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000486com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000487{
488 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000489 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000490 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000491 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000492}
493
494static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000495com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000496{
497 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000498 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000499 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000500 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000501 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000502 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000503 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000504 com_error(c, PyExc_SystemError,
505 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000506 }
507 if (c->c_code == NULL)
508 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000509 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000510 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000511 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000512 c->c_errors++;
513 return;
514 }
515 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000516 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000517}
518
519static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000520com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000521{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000522 com_addbyte(c, x & 0xff);
523 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000524}
525
526static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000527com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000528{
529 int size;
530 char *p;
531 if (c->c_lnotab == NULL)
532 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000533 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000534 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000535 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000536 c->c_errors++;
537 return;
538 }
539 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000540 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000541 *p++ = addr;
542 *p++ = line;
543 c->c_lnotab_next += 2;
544}
545
546static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000547com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000548{
549 c->c_lineno = lineno;
550 if (c->c_firstlineno == 0) {
551 c->c_firstlineno = c->c_last_line = lineno;
552 }
553 else {
554 int incr_addr = c->c_nexti - c->c_last_addr;
555 int incr_line = lineno - c->c_last_line;
556 while (incr_addr > 0 || incr_line > 0) {
557 int trunc_addr = incr_addr;
558 int trunc_line = incr_line;
559 if (trunc_addr > 255)
560 trunc_addr = 255;
561 if (trunc_line > 255)
562 trunc_line = 255;
563 com_add_lnotab(c, trunc_addr, trunc_line);
564 incr_addr -= trunc_addr;
565 incr_line -= trunc_line;
566 }
567 c->c_last_addr = c->c_nexti;
568 c->c_last_line = lineno;
569 }
570}
571
572static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000573com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000574{
Guido van Rossum8e793d91997-03-03 19:13:14 +0000575 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000576 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000577 if (Py_OptimizeFlag)
578 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000579 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000580 com_addbyte(c, op);
581 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000582}
583
584static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000585com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000586{
587 /* Compile a forward reference for backpatching */
588 int here;
589 int anchor;
590 com_addbyte(c, op);
591 here = c->c_nexti;
592 anchor = *p_anchor;
593 *p_anchor = here;
594 com_addint(c, anchor == 0 ? 0 : here - anchor);
595}
596
597static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000598com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000599{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000600 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000601 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000602 int dist;
603 int prev;
604 for (;;) {
605 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000606 prev = code[anchor] + (code[anchor+1] << 8);
607 dist = target - (anchor+2);
608 code[anchor] = dist & 0xff;
609 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000610 if (!prev)
611 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000612 anchor -= prev;
613 }
614}
615
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000616/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000617
618static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000619com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000620{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000621 PyObject *w, *t, *np=NULL;
622 long n;
623
624 t = Py_BuildValue("(OO)", v, v->ob_type);
625 if (t == NULL)
626 goto fail;
627 w = PyDict_GetItem(dict, t);
628 if (w != NULL) {
629 n = PyInt_AsLong(w);
630 } else {
631 n = PyList_Size(list);
632 np = PyInt_FromLong(n);
633 if (np == NULL)
634 goto fail;
635 if (PyList_Append(list, v) != 0)
636 goto fail;
637 if (PyDict_SetItem(dict, t, np) != 0)
638 goto fail;
639 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000640 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000641 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000642 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000643 fail:
644 Py_XDECREF(np);
645 Py_XDECREF(t);
646 c->c_errors++;
647 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000648}
649
650static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000651com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000652{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000653 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000654}
655
656static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000657com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000658{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000659 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000660}
661
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000662#ifdef PRIVATE_NAME_MANGLING
663static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000664com_mangle(struct compiling *c, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000665{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000666 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000667 This is independent from how the name is used. */
668 char *p;
Guido van Rossum582acec2000-06-28 22:07:35 +0000669 size_t nlen, plen;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000670 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000671 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000672 return 0; /* Don't mangle __extremely_long_names */
673 if (name[nlen-1] == '_' && name[nlen-2] == '_')
674 return 0; /* Don't mangle __whatever__ */
675 p = c->c_private;
676 /* Strip leading underscores from class name */
677 while (*p == '_')
678 p++;
679 if (*p == '\0')
680 return 0; /* Don't mangle if class is just underscores */
681 plen = strlen(p);
682 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000683 plen = maxlen-nlen-2; /* Truncate class name if too long */
684 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000685 buffer[0] = '_';
686 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000687 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000688 /* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
689 return 1;
690}
691#endif
692
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000693static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000694com_addopnamestr(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000695{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000696 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000697 int i;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000698#ifdef PRIVATE_NAME_MANGLING
699 char buffer[256];
700 if (name != NULL && name[0] == '_' && name[1] == '_' &&
701 c->c_private != NULL &&
Guido van Rossum582acec2000-06-28 22:07:35 +0000702 com_mangle(c, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000703 name = buffer;
704#endif
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000705 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000706 c->c_errors++;
707 i = 255;
708 }
709 else {
710 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000711 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000712 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000713 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
714 switch (op) {
715 case LOAD_NAME:
716 case STORE_NAME:
717 case DELETE_NAME:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000718 if (PyDict_GetItemString(c->c_globals, name) != NULL) {
Guido van Rossumc5e96291991-12-10 13:53:51 +0000719 switch (op) {
720 case LOAD_NAME: op = LOAD_GLOBAL; break;
721 case STORE_NAME: op = STORE_GLOBAL; break;
722 case DELETE_NAME: op = DELETE_GLOBAL; break;
723 }
724 }
725 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000726 com_addoparg(c, op, i);
727}
728
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000729static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000730com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000731{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000732 char *name;
733 char buffer[1000];
734 /* XXX it is possible to write this code without the 1000
735 chars on the total length of dotted names, I just can't be
736 bothered right now */
737 if (TYPE(n) == STAR)
738 name = "*";
739 else if (TYPE(n) == dotted_name) {
740 char *p = buffer;
741 int i;
742 name = buffer;
743 for (i = 0; i < NCH(n); i += 2) {
744 char *s = STR(CHILD(n, i));
745 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000746 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000747 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +0000748 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000749 break;
750 }
751 if (p != buffer)
752 *p++ = '.';
753 strcpy(p, s);
754 p = strchr(p, '\0');
755 }
756 }
757 else {
758 REQ(n, NAME);
759 name = STR(n);
760 }
761 com_addopnamestr(c, op, name);
762}
763
Guido van Rossum79f25d91997-04-29 20:08:16 +0000764static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000765parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000766{
Tim Petersdbd9ba62000-07-09 03:09:57 +0000767 extern double atof(const char *);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000768 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000769 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000770 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +0000771#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +0000772 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +0000773 int imflag;
774#endif
775
Guido van Rossum282914b1991-04-04 10:42:56 +0000776 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000777 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +0000778#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +0000779 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +0000780#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000781 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000782 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000783 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000784 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000785 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000786 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000787 if (*end == '\0') {
788 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000789 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000790 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000791 return NULL;
792 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000793 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000794 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000795 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +0000796#ifndef WITHOUT_COMPLEX
797 if (imflag) {
798 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000799 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +0000800 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000801 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000802 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +0000803 }
Guido van Rossumac1fc951997-10-08 15:23:55 +0000804 else
Guido van Rossum50564e81996-01-12 01:13:16 +0000805#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +0000806 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000807 PyFPE_START_PROTECT("atof", return 0)
808 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000809 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000810 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000811 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000812}
813
Guido van Rossum79f25d91997-04-29 20:08:16 +0000814static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000815parsestr(char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000816{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000817 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +0000818 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000819 char *buf;
820 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000821 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000822 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +0000823 int first = *s;
824 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000825 int rawmode = 0;
826 int unicode = 0;
827 if (isalpha(quote) || quote == '_') {
828 if (quote == 'u' || quote == 'U') {
829 quote = *++s;
830 unicode = 1;
831 }
832 if (quote == 'r' || quote == 'R') {
833 quote = *++s;
834 rawmode = 1;
835 }
836 }
Guido van Rossum8054fad1993-10-26 15:19:44 +0000837 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000838 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000839 return NULL;
840 }
841 s++;
842 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +0000843 if (len > INT_MAX) {
844 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
845 return NULL;
846 }
Guido van Rossum8054fad1993-10-26 15:19:44 +0000847 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000848 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000849 return NULL;
850 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000851 if (len >= 4 && s[0] == quote && s[1] == quote) {
852 s += 2;
853 len -= 2;
854 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000855 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000856 return NULL;
857 }
858 }
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +0000859 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000860 if (rawmode)
861 return PyUnicode_DecodeRawUnicodeEscape(
862 s, len, NULL);
863 else
864 return PyUnicode_DecodeUnicodeEscape(
865 s, len, NULL);
866 }
867 else if (rawmode || strchr(s, '\\') == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000868 return PyString_FromStringAndSize(s, len);
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000869 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000870 v = PyString_FromStringAndSize((char *)NULL, len);
871 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000872 end = s + len;
873 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000874 if (*s != '\\') {
875 *p++ = *s++;
876 continue;
877 }
878 s++;
879 switch (*s++) {
880 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000881 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000882 case '\\': *p++ = '\\'; break;
883 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000884 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000885 case 'b': *p++ = '\b'; break;
886 case 'f': *p++ = '\014'; break; /* FF */
887 case 't': *p++ = '\t'; break;
888 case 'n': *p++ = '\n'; break;
889 case 'r': *p++ = '\r'; break;
890 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000891 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
892 case '0': case '1': case '2': case '3':
893 case '4': case '5': case '6': case '7':
894 c = s[-1] - '0';
895 if ('0' <= *s && *s <= '7') {
896 c = (c<<3) + *s++ - '0';
897 if ('0' <= *s && *s <= '7')
898 c = (c<<3) + *s++ - '0';
899 }
900 *p++ = c;
901 break;
902 case 'x':
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000903 if (isxdigit(Py_CHARMASK(*s))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000904 unsigned int x = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000905 do {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000906 c = Py_CHARMASK(*s);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000907 s++;
Guido van Rossumed1100f1997-10-20 23:24:07 +0000908 x = (x<<4) & ~0xF;
909 if (isdigit(c))
910 x += c - '0';
911 else if (islower(c))
912 x += 10 + c - 'a';
913 else
914 x += 10 + c - 'A';
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000915 } while (isxdigit(Py_CHARMASK(*s)));
Guido van Rossumed1100f1997-10-20 23:24:07 +0000916 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000917 break;
918 }
919 /* FALLTHROUGH */
920 default: *p++ = '\\'; *p++ = s[-1]; break;
921 }
922 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000923 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000924 return v;
925}
926
Guido van Rossum79f25d91997-04-29 20:08:16 +0000927static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000928parsestrplus(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000929{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000930 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000931 int i;
932 REQ(CHILD(n, 0), STRING);
933 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
934 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +0000935 for (i = 1; i < NCH(n); i++) {
936 PyObject *s;
937 s = parsestr(STR(CHILD(n, i)));
938 if (s == NULL)
939 goto onError;
940 if (PyString_Check(v) && PyString_Check(s)) {
941 PyString_ConcatAndDel(&v, s);
942 if (v == NULL)
943 goto onError;
944 }
945 else {
946 PyObject *temp;
947 temp = PyUnicode_Concat(v, s);
948 Py_DECREF(s);
949 if (temp == NULL)
950 goto onError;
951 Py_DECREF(v);
952 v = temp;
953 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000954 }
955 }
956 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +0000957
958 onError:
959 Py_XDECREF(v);
960 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000961}
962
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000963static void
Skip Montanaro803d6e52000-08-12 18:09:51 +0000964com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000965{
Skip Montanaro803d6e52000-08-12 18:09:51 +0000966 PyObject *v;
967 int anchor = 0;
968 int save_begin = c->c_begin;
969
970 /* list_iter: for v in expr [list_iter] */
971 com_node(c, CHILD(n, 3)); /* expr */
972 v = PyInt_FromLong(0L);
973 if (v == NULL)
974 c->c_errors++;
975 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
976 com_push(c, 1);
977 Py_XDECREF(v);
978 c->c_begin = c->c_nexti;
979 com_addoparg(c, SET_LINENO, n->n_lineno);
980 com_addfwref(c, FOR_LOOP, &anchor);
981 com_push(c, 1);
982 com_assign(c, CHILD(n, 1), OP_ASSIGN);
983 c->c_loops++;
984 com_list_iter(c, n, e, t);
985 c->c_loops--;
986 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
987 c->c_begin = save_begin;
988 com_backpatch(c, anchor);
989 com_pop(c, 2); /* FOR_LOOP has popped these */
990}
991
992static void
993com_list_if(struct compiling *c, node *n, node *e, char *t)
994{
995 int anchor = 0;
996 int a = 0;
997 /* list_iter: 'if' test [list_iter] */
998 com_addoparg(c, SET_LINENO, n->n_lineno);
999 com_node(c, CHILD(n, 1));
1000 com_addfwref(c, JUMP_IF_FALSE, &a);
1001 com_addbyte(c, POP_TOP);
1002 com_pop(c, 1);
1003 com_list_iter(c, n, e, t);
1004 com_addfwref(c, JUMP_FORWARD, &anchor);
1005 com_backpatch(c, a);
1006 /* We jump here with an extra entry which we now pop */
1007 com_addbyte(c, POP_TOP);
1008 com_backpatch(c, anchor);
1009}
1010
1011static void
1012com_list_iter(struct compiling *c,
1013 node *p, /* parent of list_iter node */
1014 node *e, /* element expression node */
1015 char *t /* name of result list temp local */)
1016{
1017 /* list_iter is the last child in a listmaker, list_for, or list_if */
1018 node *n = CHILD(p, NCH(p)-1);
1019 if (TYPE(n) == list_iter) {
1020 n = CHILD(n, 0);
1021 switch (TYPE(n)) {
1022 case list_for:
1023 com_list_for(c, n, e, t);
1024 break;
1025 case list_if:
1026 com_list_if(c, n, e, t);
1027 break;
1028 default:
1029 com_error(c, PyExc_SystemError,
1030 "invalid list_iter node type");
1031 }
1032 }
1033 else {
1034 com_addopnamestr(c, LOAD_NAME, t);
1035 com_push(c, 1);
1036 com_node(c, e);
1037 com_addoparg(c, CALL_FUNCTION, 1);
1038 com_addbyte(c, POP_TOP);
1039 com_pop(c, 2);
1040 }
1041}
1042
1043static void
1044com_list_comprehension(struct compiling *c, node *n)
1045{
1046 /* listmaker: test list_iter */
1047 char tmpname[12];
1048 sprintf(tmpname, "__%d__", ++c->c_tmpname);
1049 com_addoparg(c, BUILD_LIST, 0);
1050 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1051 com_push(c, 2);
1052 com_addopnamestr(c, LOAD_ATTR, "append");
1053 com_addopnamestr(c, STORE_NAME, tmpname);
1054 com_pop(c, 1);
1055 com_list_iter(c, n, CHILD(n, 0), tmpname);
1056 com_addopnamestr(c, DELETE_NAME, tmpname);
1057 --c->c_tmpname;
1058}
1059
1060static void
1061com_listmaker(struct compiling *c, node *n)
1062{
1063 /* listmaker: test ( list_iter | (',' test)* [','] ) */
Thomas Wouters87df80d2000-08-13 17:05:17 +00001064 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_iter)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001065 com_list_comprehension(c, n);
1066 else {
1067 int len = 0;
1068 int i;
1069 for (i = 0; i < NCH(n); i += 2, len++)
1070 com_node(c, CHILD(n, i));
1071 com_addoparg(c, BUILD_LIST, len);
1072 com_pop(c, len-1);
1073 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001074}
1075
1076static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001077com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001078{
1079 int i;
1080 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1081 for (i = 0; i+2 < NCH(n); i += 4) {
1082 /* We must arrange things just right for STORE_SUBSCR.
1083 It wants the stack to look like (value) (dict) (key) */
1084 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001085 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001086 com_node(c, CHILD(n, i+2)); /* value */
1087 com_addbyte(c, ROT_TWO);
1088 com_node(c, CHILD(n, i)); /* key */
1089 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001090 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001091 }
1092}
1093
1094static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001095com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001096{
1097 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001098 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001099 int i;
1100 REQ(n, atom);
1101 ch = CHILD(n, 0);
1102 switch (TYPE(ch)) {
1103 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001104 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001105 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001106 com_push(c, 1);
1107 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001108 else
1109 com_node(c, CHILD(n, 1));
1110 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001111 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001112 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001113 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001114 com_push(c, 1);
1115 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001116 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001117 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001118 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001119 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001120 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001121 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001122 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001123 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001124 break;
1125 case BACKQUOTE:
1126 com_node(c, CHILD(n, 1));
1127 com_addbyte(c, UNARY_CONVERT);
1128 break;
1129 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001130 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001131 i = 255;
1132 }
1133 else {
1134 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001135 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001136 }
1137 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001138 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001139 break;
1140 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001141 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001142 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001143 c->c_errors++;
1144 i = 255;
1145 }
1146 else {
1147 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001148 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001149 }
1150 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001151 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001152 break;
1153 case NAME:
1154 com_addopname(c, LOAD_NAME, ch);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001155 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001156 break;
1157 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001158 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001159 com_error(c, PyExc_SystemError,
1160 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001161 }
1162}
1163
1164static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001165com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001166{
1167 if (NCH(n) == 1) {
1168 com_addbyte(c, op);
1169 }
1170 else if (NCH(n) == 2) {
1171 if (TYPE(CHILD(n, 0)) != COLON) {
1172 com_node(c, CHILD(n, 0));
1173 com_addbyte(c, op+1);
1174 }
1175 else {
1176 com_node(c, CHILD(n, 1));
1177 com_addbyte(c, op+2);
1178 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001179 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001180 }
1181 else {
1182 com_node(c, CHILD(n, 0));
1183 com_node(c, CHILD(n, 2));
1184 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001185 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001186 }
1187}
1188
Guido van Rossum635abd21997-01-06 22:56:52 +00001189static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001190com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001191{
1192 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001193 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001194 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001195 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001196 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001197 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001198 }
1199 else {
1200 com_node(c, CHILD(n, 0));
1201 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001202 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001203 }
1204 m = n;
1205 do {
1206 m = CHILD(m, 0);
1207 } while (NCH(m) == 1);
1208 if (TYPE(m) != NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001209 com_error(c, PyExc_SyntaxError,
1210 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001211 }
1212 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001213 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001214 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001215 *pkeywords = PyDict_New();
Guido van Rossum635abd21997-01-06 22:56:52 +00001216 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001217 c->c_errors++;
1218 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001219 if (PyDict_GetItem(*pkeywords, v) != NULL)
1220 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001221 "duplicate keyword argument");
1222 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001223 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001224 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001225 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001226 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001227 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001228 }
1229 }
1230 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001231}
1232
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001233static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001234com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001235{
1236 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001237 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001238 }
1239 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001240 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001241 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001242 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001243 int star_flag = 0;
1244 int starstar_flag = 0;
1245 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001246 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001247 na = 0;
1248 nk = 0;
1249 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001250 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001251 if (TYPE(ch) == STAR ||
1252 TYPE(ch) == DOUBLESTAR)
1253 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001254 if (ch->n_lineno != lineno) {
1255 lineno = ch->n_lineno;
1256 com_addoparg(c, SET_LINENO, lineno);
1257 }
1258 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001259 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001260 na++;
1261 else
1262 nk++;
1263 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001264 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001265 while (i < NCH(n)) {
1266 node *tok = CHILD(n, i);
1267 node *ch = CHILD(n, i+1);
1268 i += 3;
1269 switch (TYPE(tok)) {
1270 case STAR: star_flag = 1; break;
1271 case DOUBLESTAR: starstar_flag = 1; break;
1272 }
1273 com_node(c, ch);
1274 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001275 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001276 com_error(c, PyExc_SyntaxError,
1277 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001278 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001279 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001280 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001281 star_flag + (starstar_flag << 1);
1282 else
1283 opcode = CALL_FUNCTION;
1284 com_addoparg(c, opcode, na | (nk << 8));
1285 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001286 }
1287}
1288
1289static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001290com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001291{
1292 com_addopname(c, LOAD_ATTR, n);
1293}
1294
1295static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001296com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001297{
1298 int i=0;
1299 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001300 node *ch;
1301
1302 /* first argument */
1303 if (TYPE(CHILD(n,i)) == COLON) {
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);
Guido van Rossum8861b741996-07-30 16:49:37 +00001306 i++;
1307 }
1308 else {
1309 com_node(c, CHILD(n,i));
1310 i++;
1311 REQ(CHILD(n,i),COLON);
1312 i++;
1313 }
1314 /* second argument */
1315 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1316 com_node(c, CHILD(n,i));
1317 i++;
1318 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001319 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001320 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001321 com_push(c, 1);
1322 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001323 /* remaining arguments */
1324 for (; i < NCH(n); i++) {
1325 ns++;
1326 ch=CHILD(n,i);
1327 REQ(ch, sliceop);
1328 if (NCH(ch) == 1) {
1329 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001330 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001331 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001332 }
1333 else
1334 com_node(c, CHILD(ch,1));
1335 }
1336 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001337 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001338}
1339
1340static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001341com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001342{
1343 node *ch;
1344 REQ(n, subscript);
1345 ch = CHILD(n,0);
1346 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001347 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001348 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001349 com_push(c, 1);
1350 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001351 else {
1352 /* check for slice */
1353 if ((TYPE(ch) == COLON || NCH(n) > 1))
1354 com_sliceobj(c, n);
1355 else {
1356 REQ(ch, test);
1357 com_node(c, ch);
1358 }
1359 }
1360}
1361
1362static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001363com_subscriptlist(struct compiling *c, node *n, int assigning)
Guido van Rossum8861b741996-07-30 16:49:37 +00001364{
1365 int i, op;
1366 REQ(n, subscriptlist);
1367 /* Check to make backward compatible slice behavior for '[i:j]' */
1368 if (NCH(n) == 1) {
1369 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001370 /* 'Basic' slice, should have exactly one colon. */
1371 if ((TYPE(CHILD(sub, 0)) == COLON
1372 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1373 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1374 {
Guido van Rossum8861b741996-07-30 16:49:37 +00001375 if (assigning == OP_APPLY)
1376 op = SLICE;
1377 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001378 op = ((assigning == OP_ASSIGN) ?
1379 STORE_SLICE : DELETE_SLICE);
Guido van Rossum8861b741996-07-30 16:49:37 +00001380 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001381 if (op == STORE_SLICE)
1382 com_pop(c, 2);
1383 else if (op == DELETE_SLICE)
1384 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001385 return;
1386 }
1387 }
1388 /* Else normal subscriptlist. Compile each subscript. */
1389 for (i = 0; i < NCH(n); i += 2)
1390 com_subscript(c, CHILD(n, i));
1391 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001392 if (NCH(n) > 1) {
1393 i = (NCH(n)+1) / 2;
1394 com_addoparg(c, BUILD_TUPLE, i);
1395 com_pop(c, i-1);
1396 }
1397 if (assigning == OP_APPLY) {
Guido van Rossum8861b741996-07-30 16:49:37 +00001398 op = BINARY_SUBSCR;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001399 i = 1;
1400 }
1401 else if (assigning == OP_ASSIGN) {
1402 op = STORE_SUBSCR;
1403 i = 3;
1404 }
1405 else {
1406 op = DELETE_SUBSCR;
1407 i = 2;
1408 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001409 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001410 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001411}
1412
1413static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001414com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001415{
1416 REQ(n, trailer);
1417 switch (TYPE(CHILD(n, 0))) {
1418 case LPAR:
1419 com_call_function(c, CHILD(n, 1));
1420 break;
1421 case DOT:
1422 com_select_member(c, CHILD(n, 1));
1423 break;
1424 case LSQB:
Guido van Rossum8861b741996-07-30 16:49:37 +00001425 com_subscriptlist(c, CHILD(n, 1), OP_APPLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001426 break;
1427 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001428 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001429 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001430 }
1431}
1432
1433static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001434com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001435{
1436 int i;
1437 REQ(n, power);
1438 com_atom(c, CHILD(n, 0));
1439 for (i = 1; i < NCH(n); i++) {
1440 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1441 com_factor(c, CHILD(n, i+1));
1442 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001443 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001444 break;
1445 }
1446 else
1447 com_apply_trailer(c, CHILD(n, i));
1448 }
1449}
1450
1451static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001452com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001453{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001454 REQ(n, factor);
1455 if (TYPE(CHILD(n, 0)) == PLUS) {
1456 com_factor(c, CHILD(n, 1));
1457 com_addbyte(c, UNARY_POSITIVE);
1458 }
1459 else if (TYPE(CHILD(n, 0)) == MINUS) {
1460 com_factor(c, CHILD(n, 1));
1461 com_addbyte(c, UNARY_NEGATIVE);
1462 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001463 else if (TYPE(CHILD(n, 0)) == TILDE) {
1464 com_factor(c, CHILD(n, 1));
1465 com_addbyte(c, UNARY_INVERT);
1466 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001467 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001468 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001469 }
1470}
1471
1472static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001473com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001474{
1475 int i;
1476 int op;
1477 REQ(n, term);
1478 com_factor(c, CHILD(n, 0));
1479 for (i = 2; i < NCH(n); i += 2) {
1480 com_factor(c, CHILD(n, i));
1481 switch (TYPE(CHILD(n, i-1))) {
1482 case STAR:
1483 op = BINARY_MULTIPLY;
1484 break;
1485 case SLASH:
1486 op = BINARY_DIVIDE;
1487 break;
1488 case PERCENT:
1489 op = BINARY_MODULO;
1490 break;
1491 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001492 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001493 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001494 op = 255;
1495 }
1496 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001497 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001498 }
1499}
1500
1501static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001502com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001503{
1504 int i;
1505 int op;
1506 REQ(n, arith_expr);
1507 com_term(c, CHILD(n, 0));
1508 for (i = 2; i < NCH(n); i += 2) {
1509 com_term(c, CHILD(n, i));
1510 switch (TYPE(CHILD(n, i-1))) {
1511 case PLUS:
1512 op = BINARY_ADD;
1513 break;
1514 case MINUS:
1515 op = BINARY_SUBTRACT;
1516 break;
1517 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001518 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001519 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001520 op = 255;
1521 }
1522 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001523 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001524 }
1525}
1526
1527static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001528com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001529{
1530 int i;
1531 int op;
1532 REQ(n, shift_expr);
1533 com_arith_expr(c, CHILD(n, 0));
1534 for (i = 2; i < NCH(n); i += 2) {
1535 com_arith_expr(c, CHILD(n, i));
1536 switch (TYPE(CHILD(n, i-1))) {
1537 case LEFTSHIFT:
1538 op = BINARY_LSHIFT;
1539 break;
1540 case RIGHTSHIFT:
1541 op = BINARY_RSHIFT;
1542 break;
1543 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001544 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001545 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001546 op = 255;
1547 }
1548 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001549 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001550 }
1551}
1552
1553static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001554com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001555{
1556 int i;
1557 int op;
1558 REQ(n, and_expr);
1559 com_shift_expr(c, CHILD(n, 0));
1560 for (i = 2; i < NCH(n); i += 2) {
1561 com_shift_expr(c, CHILD(n, i));
1562 if (TYPE(CHILD(n, i-1)) == AMPER) {
1563 op = BINARY_AND;
1564 }
1565 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001566 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001567 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001568 op = 255;
1569 }
1570 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001571 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001572 }
1573}
1574
1575static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001576com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001577{
1578 int i;
1579 int op;
1580 REQ(n, xor_expr);
1581 com_and_expr(c, CHILD(n, 0));
1582 for (i = 2; i < NCH(n); i += 2) {
1583 com_and_expr(c, CHILD(n, i));
1584 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1585 op = BINARY_XOR;
1586 }
1587 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001588 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001589 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001590 op = 255;
1591 }
1592 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001593 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001594 }
1595}
1596
1597static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001598com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001599{
1600 int i;
1601 int op;
1602 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001603 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001604 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001605 com_xor_expr(c, CHILD(n, i));
1606 if (TYPE(CHILD(n, i-1)) == VBAR) {
1607 op = BINARY_OR;
1608 }
1609 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001610 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001611 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001612 op = 255;
1613 }
1614 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001615 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001616 }
1617}
1618
1619static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001620cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001621{
1622 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001623 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001624 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1625 if (NCH(n) == 1) {
1626 n = CHILD(n, 0);
1627 switch (TYPE(n)) {
1628 case LESS: return LT;
1629 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001630 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001631 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001632 case LESSEQUAL: return LE;
1633 case GREATEREQUAL: return GE;
1634 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001635 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1636 if (strcmp(STR(n), "is") == 0) return IS;
1637 }
1638 }
1639 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001640 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001641 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1642 return NOT_IN;
1643 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1644 return IS_NOT;
1645 }
1646 }
1647 return BAD;
1648}
1649
1650static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001651com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001652{
1653 int i;
1654 enum cmp_op op;
1655 int anchor;
1656 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1657 com_expr(c, CHILD(n, 0));
1658 if (NCH(n) == 1)
1659 return;
1660
1661 /****************************************************************
1662 The following code is generated for all but the last
1663 comparison in a chain:
1664
1665 label: on stack: opcode: jump to:
1666
1667 a <code to load b>
1668 a, b DUP_TOP
1669 a, b, b ROT_THREE
1670 b, a, b COMPARE_OP
1671 b, 0-or-1 JUMP_IF_FALSE L1
1672 b, 1 POP_TOP
1673 b
1674
1675 We are now ready to repeat this sequence for the next
1676 comparison in the chain.
1677
1678 For the last we generate:
1679
1680 b <code to load c>
1681 b, c COMPARE_OP
1682 0-or-1
1683
1684 If there were any jumps to L1 (i.e., there was more than one
1685 comparison), we generate:
1686
1687 0-or-1 JUMP_FORWARD L2
1688 L1: b, 0 ROT_TWO
1689 0, b POP_TOP
1690 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00001691 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001692 ****************************************************************/
1693
1694 anchor = 0;
1695
1696 for (i = 2; i < NCH(n); i += 2) {
1697 com_expr(c, CHILD(n, i));
1698 if (i+2 < NCH(n)) {
1699 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001700 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001701 com_addbyte(c, ROT_THREE);
1702 }
1703 op = cmp_type(CHILD(n, i-1));
1704 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001705 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001706 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001707 }
1708 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001709 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001710 if (i+2 < NCH(n)) {
1711 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1712 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001713 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001714 }
1715 }
1716
1717 if (anchor) {
1718 int anchor2 = 0;
1719 com_addfwref(c, JUMP_FORWARD, &anchor2);
1720 com_backpatch(c, anchor);
1721 com_addbyte(c, ROT_TWO);
1722 com_addbyte(c, POP_TOP);
1723 com_backpatch(c, anchor2);
1724 }
1725}
1726
1727static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001728com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001729{
1730 REQ(n, not_test); /* 'not' not_test | comparison */
1731 if (NCH(n) == 1) {
1732 com_comparison(c, CHILD(n, 0));
1733 }
1734 else {
1735 com_not_test(c, CHILD(n, 1));
1736 com_addbyte(c, UNARY_NOT);
1737 }
1738}
1739
1740static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001741com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001742{
1743 int i;
1744 int anchor;
1745 REQ(n, and_test); /* not_test ('and' not_test)* */
1746 anchor = 0;
1747 i = 0;
1748 for (;;) {
1749 com_not_test(c, CHILD(n, i));
1750 if ((i += 2) >= NCH(n))
1751 break;
1752 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1753 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001754 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001755 }
1756 if (anchor)
1757 com_backpatch(c, anchor);
1758}
1759
1760static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001761com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001762{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001763 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00001764 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001765 PyObject *v;
Guido van Rossum57531fe1993-11-30 14:57:42 +00001766 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001767 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001768 v = (PyObject *) icompile(CHILD(n, 0), c);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001769 if (v == NULL) {
1770 c->c_errors++;
1771 i = 255;
1772 }
1773 else {
1774 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001775 Py_DECREF(v);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001776 }
1777 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001778 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001779 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001780 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001781 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001782 else {
1783 int anchor = 0;
1784 int i = 0;
1785 for (;;) {
1786 com_and_test(c, CHILD(n, i));
1787 if ((i += 2) >= NCH(n))
1788 break;
1789 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1790 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001791 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001792 }
1793 if (anchor)
1794 com_backpatch(c, anchor);
1795 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001796}
1797
1798static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001799com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001800{
1801 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001802 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001803 com_node(c, CHILD(n, 0));
1804 }
1805 else {
1806 int i;
1807 int len;
1808 len = (NCH(n) + 1) / 2;
1809 for (i = 0; i < NCH(n); i += 2)
1810 com_node(c, CHILD(n, i));
1811 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001812 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001813 }
1814}
1815
1816
1817/* Begin of assignment compilation */
1818
Tim Petersdbd9ba62000-07-09 03:09:57 +00001819static void com_assign_name(struct compiling *, node *, int);
1820static void com_assign(struct compiling *, node *, int);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001821
1822static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001823com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001824{
1825 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001826 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001827}
1828
1829static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001830com_assign_trailer(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001831{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001832 REQ(n, trailer);
1833 switch (TYPE(CHILD(n, 0))) {
1834 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001835 com_error(c, PyExc_SyntaxError,
1836 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001837 break;
1838 case DOT: /* '.' NAME */
1839 com_assign_attr(c, CHILD(n, 1), assigning);
1840 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001841 case LSQB: /* '[' subscriptlist ']' */
1842 com_subscriptlist(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001843 break;
1844 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001845 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001846 }
1847}
1848
1849static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001850com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001851{
1852 int i;
1853 if (TYPE(n) != testlist)
1854 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001855 if (assigning) {
1856 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001857 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001858 com_push(c, i-1);
1859 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001860 for (i = 0; i < NCH(n); i += 2)
1861 com_assign(c, CHILD(n, i), assigning);
1862}
1863
1864static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001865com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001866{
1867 REQ(n, NAME);
1868 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001869 if (assigning)
1870 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001871}
1872
1873static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001874com_assign(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001875{
1876 /* Loop to avoid trivial recursion */
1877 for (;;) {
1878 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001879
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001880 case exprlist:
1881 case testlist:
1882 if (NCH(n) > 1) {
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001883 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001884 return;
1885 }
1886 n = CHILD(n, 0);
1887 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001888
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001889 case test:
1890 case and_test:
1891 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001892 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001893 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001894 case xor_expr:
1895 case and_expr:
1896 case shift_expr:
1897 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001898 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00001899 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001900 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001901 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001902 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001903 return;
1904 }
1905 n = CHILD(n, 0);
1906 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001907
Guido van Rossum50564e81996-01-12 01:13:16 +00001908 case power: /* atom trailer* ('**' power)* */
1909/* ('+'|'-'|'~') factor | atom trailer* */
1910 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001911 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001912 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001913 return;
1914 }
Guido van Rossum50564e81996-01-12 01:13:16 +00001915 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001916 int i;
1917 com_node(c, CHILD(n, 0));
1918 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00001919 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001920 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001921 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00001922 return;
1923 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001924 com_apply_trailer(c, CHILD(n, i));
1925 } /* NB i is still alive */
1926 com_assign_trailer(c,
1927 CHILD(n, i), assigning);
1928 return;
1929 }
1930 n = CHILD(n, 0);
1931 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001932
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001933 case atom:
1934 switch (TYPE(CHILD(n, 0))) {
1935 case LPAR:
1936 n = CHILD(n, 1);
1937 if (TYPE(n) == RPAR) {
1938 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001939 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001940 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001941 return;
1942 }
1943 break;
1944 case LSQB:
1945 n = CHILD(n, 1);
1946 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001947 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001948 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001949 return;
1950 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001951 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001952 return;
1953 case NAME:
1954 com_assign_name(c, CHILD(n, 0), assigning);
1955 return;
1956 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001957 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001958 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001959 return;
1960 }
1961 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001962
1963 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001964 com_error(c, PyExc_SyntaxError,
1965 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001966 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001967
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001968 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001969 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001970 com_error(c, PyExc_SystemError,
1971 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001972 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001973
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001974 }
1975 }
1976}
Guido van Rossum7c531111997-03-11 18:42:21 +00001977
Tim Petersdbd9ba62000-07-09 03:09:57 +00001978/* Forward */ static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001979
1980static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001981com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001982{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001983 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001984 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001985 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001986 return;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001987 com_node(c, CHILD(n, NCH(n)-1));
1988 if (NCH(n) == 1) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001989 if (c->c_interactive)
1990 com_addbyte(c, PRINT_EXPR);
1991 else
1992 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001993 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001994 }
1995 else {
1996 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001997 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001998 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001999 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002000 com_push(c, 1);
2001 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002002 com_assign(c, CHILD(n, i), OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002003 }
2004 }
2005}
2006
2007static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002008com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002009{
2010 int a = 0, b = 0;
2011 int i;
2012 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2013 /* Generate code like for
2014
2015 if __debug__:
2016 if not <test>:
2017 raise AssertionError [, <message>]
2018
2019 where <message> is the second test, if present.
2020 */
2021 if (Py_OptimizeFlag)
2022 return;
2023 com_addopnamestr(c, LOAD_GLOBAL, "__debug__");
2024 com_push(c, 1);
2025 com_addfwref(c, JUMP_IF_FALSE, &a);
2026 com_addbyte(c, POP_TOP);
2027 com_pop(c, 1);
2028 com_node(c, CHILD(n, 1));
2029 com_addfwref(c, JUMP_IF_TRUE, &b);
2030 com_addbyte(c, POP_TOP);
2031 com_pop(c, 1);
2032 /* Raise that exception! */
2033 com_addopnamestr(c, LOAD_GLOBAL, "AssertionError");
2034 com_push(c, 1);
2035 i = NCH(n)/2; /* Either 2 or 4 */
2036 if (i > 1)
2037 com_node(c, CHILD(n, 3));
2038 com_addoparg(c, RAISE_VARARGS, i);
2039 com_pop(c, i);
2040 /* The interpreter does not fall through */
2041 /* All jumps converge here */
2042 com_backpatch(c, a);
2043 com_backpatch(c, b);
2044 com_addbyte(c, POP_TOP);
2045}
2046
2047static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002048com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002049{
2050 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002051 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
2052 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002053 com_node(c, CHILD(n, i));
2054 com_addbyte(c, PRINT_ITEM);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002055 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002056 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002057 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002058 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002059 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002060}
2061
2062static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002063com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002064{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002065 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002066 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002067 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002068 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002069 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002070 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002071 com_push(c, 1);
2072 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002073 else
2074 com_node(c, CHILD(n, 1));
2075 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002076 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002077}
2078
2079static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002080com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002081{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002082 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002083 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2084 if (NCH(n) > 1) {
2085 com_node(c, CHILD(n, 1));
2086 if (NCH(n) > 3) {
2087 com_node(c, CHILD(n, 3));
2088 if (NCH(n) > 5)
2089 com_node(c, CHILD(n, 5));
2090 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002091 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002092 i = NCH(n)/2;
2093 com_addoparg(c, RAISE_VARARGS, i);
2094 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002095}
2096
2097static void
Thomas Wouters52152252000-08-17 22:55:00 +00002098com_from_import(struct compiling *c, node *n)
2099{
2100 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2101 com_push(c, 1);
2102 if (NCH(n) > 1) {
2103 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2104 com_error(c, PyExc_SyntaxError, "invalid syntax");
2105 return;
2106 }
2107 com_addopname(c, STORE_NAME, CHILD(n, 2));
2108 } else
2109 com_addopname(c, STORE_NAME, CHILD(n, 0));
2110 com_pop(c, 1);
2111}
2112
2113static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002114com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002115{
2116 int i;
2117 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002118 /* 'import' dotted_name (',' dotted_name)* |
2119 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002120 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002121 /* 'from' dotted_name 'import' ... */
2122 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002123 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002124 com_push(c, 1);
Thomas Wouters52152252000-08-17 22:55:00 +00002125 if (TYPE(CHILD(n, 3)) == STAR)
2126 com_addbyte(c, IMPORT_STAR);
2127 else {
2128 for (i = 3; i < NCH(n); i += 2)
2129 com_from_import(c, CHILD(n, i));
2130 com_addbyte(c, POP_TOP);
2131 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002132 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002133 }
2134 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002135 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002136 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002137 node *subn = CHILD(n, i);
2138 REQ(subn, dotted_as_name);
2139 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002140 com_push(c, 1);
Thomas Wouters52152252000-08-17 22:55:00 +00002141 if (NCH(subn) > 1) {
Thomas Wouters8bad6122000-08-19 20:55:02 +00002142 if (strcmp(STR(CHILD(subn, 1)), "as") != 0 ||
2143 NCH(CHILD(subn, 0)) > 1) {
Thomas Wouters52152252000-08-17 22:55:00 +00002144 com_error(c, PyExc_SyntaxError,
2145 "invalid syntax");
2146 return;
2147 }
2148 com_addopname(c, STORE_NAME, CHILD(subn, 2));
2149 } else
2150 com_addopname(c, STORE_NAME,
2151 CHILD(CHILD(subn, 0),0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002152 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002153 }
2154 }
2155}
2156
2157static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002158com_global_stmt(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002159{
2160 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002161 REQ(n, global_stmt);
2162 /* 'global' NAME (',' NAME)* */
2163 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002164 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002165#ifdef PRIVATE_NAME_MANGLING
2166 char buffer[256];
2167 if (s != NULL && s[0] == '_' && s[1] == '_' &&
2168 c->c_private != NULL &&
Guido van Rossum582acec2000-06-28 22:07:35 +00002169 com_mangle(c, s, buffer, sizeof(buffer)))
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002170 s = buffer;
2171#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +00002172 if (PyDict_GetItemString(c->c_locals, s) != NULL) {
2173 com_error(c, PyExc_SyntaxError,
2174 "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002175 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002176 else if (PyDict_SetItemString(c->c_globals, s, Py_None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002177 c->c_errors++;
2178 }
2179}
2180
Guido van Rossum681d79a1995-07-18 14:51:37 +00002181static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002182com_newlocal_o(struct compiling *c, PyObject *nameval)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002183{
2184 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002185 PyObject *ival;
2186 if (PyList_Size(c->c_varnames) != c->c_nlocals) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002187 /* This is usually caused by an error on a previous call */
2188 if (c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002189 com_error(c, PyExc_SystemError,
2190 "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002191 }
2192 return 0;
2193 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002194 ival = PyInt_FromLong(i = c->c_nlocals++);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002195 if (ival == NULL)
2196 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002197 else if (PyDict_SetItem(c->c_locals, nameval, ival) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002198 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002199 else if (PyList_Append(c->c_varnames, nameval) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002200 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002201 Py_XDECREF(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002202 return i;
2203}
2204
2205static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002206com_addlocal_o(struct compiling *c, PyObject *nameval)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002207{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002208 PyObject *ival = PyDict_GetItem(c->c_locals, nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002209 if (ival != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002210 return PyInt_AsLong(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002211 return com_newlocal_o(c, nameval);
2212}
2213
2214static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002215com_newlocal(struct compiling *c, char *name)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002216{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002217 PyObject *nameval = PyString_InternFromString(name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002218 int i;
2219 if (nameval == NULL) {
2220 c->c_errors++;
2221 return 0;
2222 }
2223 i = com_newlocal_o(c, nameval);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002224 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002225 return i;
2226}
2227
Guido van Rossumc5e96291991-12-10 13:53:51 +00002228static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002229com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002230{
2231 REQ(n, exec_stmt);
2232 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2233 com_node(c, CHILD(n, 1));
2234 if (NCH(n) >= 4)
2235 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002236 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002237 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002238 com_push(c, 1);
2239 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002240 if (NCH(n) >= 6)
2241 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002242 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002243 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002244 com_push(c, 1);
2245 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002246 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002247 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002248}
2249
Guido van Rossum7c531111997-03-11 18:42:21 +00002250static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002251is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002252{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002253 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002254 int i;
2255
2256 /* Label to avoid tail recursion */
2257 next:
2258 switch (TYPE(n)) {
2259
2260 case suite:
2261 if (NCH(n) == 1) {
2262 n = CHILD(n, 0);
2263 goto next;
2264 }
2265 /* Fall through */
2266 case file_input:
2267 for (i = 0; i < NCH(n); i++) {
2268 node *ch = CHILD(n, i);
2269 if (TYPE(ch) == stmt) {
2270 n = ch;
2271 goto next;
2272 }
2273 }
2274 break;
2275
2276 case stmt:
2277 case simple_stmt:
2278 case small_stmt:
2279 n = CHILD(n, 0);
2280 goto next;
2281
2282 case expr_stmt:
2283 case testlist:
2284 case test:
2285 case and_test:
2286 case not_test:
2287 case comparison:
2288 case expr:
2289 case xor_expr:
2290 case and_expr:
2291 case shift_expr:
2292 case arith_expr:
2293 case term:
2294 case factor:
2295 case power:
2296 case atom:
2297 if (NCH(n) == 1) {
2298 n = CHILD(n, 0);
2299 goto next;
2300 }
2301 break;
2302
2303 case NAME:
2304 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2305 return 1;
2306 break;
2307
2308 case NUMBER:
2309 v = parsenumber(c, STR(n));
2310 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002311 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002312 break;
2313 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002314 i = PyObject_IsTrue(v);
2315 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002316 return i == 0;
2317
2318 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002319 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002320 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002321 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002322 break;
2323 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002324 i = PyObject_IsTrue(v);
2325 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002326 return i == 0;
2327
2328 }
2329 return 0;
2330}
2331
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002332static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002333com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002334{
2335 int i;
2336 int anchor = 0;
2337 REQ(n, if_stmt);
2338 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2339 for (i = 0; i+3 < NCH(n); i+=4) {
2340 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002341 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002342 if (is_constant_false(c, ch))
2343 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002344 if (i > 0)
2345 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002346 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002347 com_addfwref(c, JUMP_IF_FALSE, &a);
2348 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002349 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002350 com_node(c, CHILD(n, i+3));
2351 com_addfwref(c, JUMP_FORWARD, &anchor);
2352 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002353 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002354 com_addbyte(c, POP_TOP);
2355 }
2356 if (i+2 < NCH(n))
2357 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002358 if (anchor)
2359 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002360}
2361
2362static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002363com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002364{
2365 int break_anchor = 0;
2366 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002367 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002368 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2369 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002370 block_push(c, SETUP_LOOP);
2371 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002372 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002373 com_node(c, CHILD(n, 1));
2374 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2375 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002376 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002377 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002378 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002379 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002380 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2381 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002382 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002383 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002384 com_addbyte(c, POP_TOP);
2385 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002386 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002387 if (NCH(n) > 4)
2388 com_node(c, CHILD(n, 6));
2389 com_backpatch(c, break_anchor);
2390}
2391
2392static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002393com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002394{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002395 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002396 int break_anchor = 0;
2397 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002398 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002399 REQ(n, for_stmt);
2400 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2401 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002402 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002403 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002404 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002405 if (v == NULL)
2406 c->c_errors++;
2407 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002408 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002409 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002410 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002411 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002412 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002413 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002414 com_assign(c, CHILD(n, 1), OP_ASSIGN);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002415 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002416 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002417 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002418 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2419 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002420 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002421 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002422 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002423 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002424 if (NCH(n) > 8)
2425 com_node(c, CHILD(n, 8));
2426 com_backpatch(c, break_anchor);
2427}
2428
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002429/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002430
2431 SETUP_FINALLY L
2432 <code for S>
2433 POP_BLOCK
2434 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002435 L: <code for Sf>
2436 END_FINALLY
2437
2438 The special instructions use the block stack. Each block
2439 stack entry contains the instruction that created it (here
2440 SETUP_FINALLY), the level of the value stack at the time the
2441 block stack entry was created, and a label (here L).
2442
2443 SETUP_FINALLY:
2444 Pushes the current value stack level and the label
2445 onto the block stack.
2446 POP_BLOCK:
2447 Pops en entry from the block stack, and pops the value
2448 stack until its level is the same as indicated on the
2449 block stack. (The label is ignored.)
2450 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002451 Pops a variable number of entries from the *value* stack
2452 and re-raises the exception they specify. The number of
2453 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002454
2455 The block stack is unwound when an exception is raised:
2456 when a SETUP_FINALLY entry is found, the exception is pushed
2457 onto the value stack (and the exception condition is cleared),
2458 and the interpreter jumps to the label gotten from the block
2459 stack.
2460
2461 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002462 (The contents of the value stack is shown in [], with the top
2463 at the right; 'tb' is trace-back info, 'val' the exception's
2464 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002465
2466 Value stack Label Instruction Argument
2467 [] SETUP_EXCEPT L1
2468 [] <code for S>
2469 [] POP_BLOCK
2470 [] JUMP_FORWARD L0
2471
Guido van Rossum3f5da241990-12-20 15:06:42 +00002472 [tb, val, exc] L1: DUP )
2473 [tb, val, exc, exc] <evaluate E1> )
2474 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2475 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2476 [tb, val, exc, 1] POP )
2477 [tb, val, exc] POP
2478 [tb, val] <assign to V1> (or POP if no V1)
2479 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002480 [] <code for S1>
2481 JUMP_FORWARD L0
2482
Guido van Rossum3f5da241990-12-20 15:06:42 +00002483 [tb, val, exc, 0] L2: POP
2484 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002485 .............................etc.......................
2486
Guido van Rossum3f5da241990-12-20 15:06:42 +00002487 [tb, val, exc, 0] Ln+1: POP
2488 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002489
2490 [] L0: <next statement>
2491
2492 Of course, parts are not generated if Vi or Ei is not present.
2493*/
2494
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002495static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002496com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002497{
2498 int except_anchor = 0;
2499 int end_anchor = 0;
2500 int else_anchor = 0;
2501 int i;
2502 node *ch;
2503
2504 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2505 block_push(c, SETUP_EXCEPT);
2506 com_node(c, CHILD(n, 2));
2507 com_addbyte(c, POP_BLOCK);
2508 block_pop(c, SETUP_EXCEPT);
2509 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2510 com_backpatch(c, except_anchor);
2511 for (i = 3;
2512 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2513 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002514 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002515 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002516 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002517 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002518 break;
2519 }
2520 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002521 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002522 com_addoparg(c, SET_LINENO, ch->n_lineno);
2523 if (NCH(ch) > 1) {
2524 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002525 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002526 com_node(c, CHILD(ch, 1));
2527 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002528 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002529 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2530 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002531 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002532 }
2533 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002534 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002535 if (NCH(ch) > 3)
Guido van Rossum8861b741996-07-30 16:49:37 +00002536 com_assign(c, CHILD(ch, 3), OP_ASSIGN);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002537 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002538 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002539 com_pop(c, 1);
2540 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002541 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002542 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002543 com_node(c, CHILD(n, i+2));
2544 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2545 if (except_anchor) {
2546 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002547 /* We come in with [tb, val, exc, 0] on the
2548 stack; one pop and it's the same as
2549 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002550 com_addbyte(c, POP_TOP);
2551 }
2552 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002553 /* We actually come in here with [tb, val, exc] but the
2554 END_FINALLY will zap those and jump around.
2555 The c_stacklevel does not reflect them so we need not pop
2556 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002557 com_addbyte(c, END_FINALLY);
2558 com_backpatch(c, else_anchor);
2559 if (i < NCH(n))
2560 com_node(c, CHILD(n, i+2));
2561 com_backpatch(c, end_anchor);
2562}
2563
2564static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002565com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002566{
2567 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002568 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002569
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002570 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2571 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002572 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002573 com_addbyte(c, POP_BLOCK);
2574 block_pop(c, SETUP_FINALLY);
2575 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002576 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002577 /* While the generated code pushes only one item,
2578 the try-finally handling can enter here with
2579 up to three items. OK, here are the details:
2580 3 for an exception, 2 for RETURN, 1 for BREAK. */
2581 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002582 com_backpatch(c, finally_anchor);
2583 ch = CHILD(n, NCH(n)-1);
2584 com_addoparg(c, SET_LINENO, ch->n_lineno);
2585 com_node(c, ch);
2586 com_addbyte(c, END_FINALLY);
2587 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002588 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002589}
2590
2591static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002592com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002593{
2594 REQ(n, try_stmt);
2595 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2596 | 'try' ':' suite 'finally' ':' suite */
2597 if (TYPE(CHILD(n, 3)) != except_clause)
2598 com_try_finally(c, n);
2599 else
2600 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002601}
2602
Guido van Rossum8b993a91997-01-17 21:04:03 +00002603static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002604get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002605{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002606 int i;
2607
Guido van Rossum8b993a91997-01-17 21:04:03 +00002608 /* Label to avoid tail recursion */
2609 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002610 switch (TYPE(n)) {
2611
2612 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002613 if (NCH(n) == 1) {
2614 n = CHILD(n, 0);
2615 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002616 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002617 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002618 case file_input:
2619 for (i = 0; i < NCH(n); i++) {
2620 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002621 if (TYPE(ch) == stmt) {
2622 n = ch;
2623 goto next;
2624 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002625 }
2626 break;
2627
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002628 case stmt:
2629 case simple_stmt:
2630 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002631 n = CHILD(n, 0);
2632 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002633
2634 case expr_stmt:
2635 case testlist:
2636 case test:
2637 case and_test:
2638 case not_test:
2639 case comparison:
2640 case expr:
2641 case xor_expr:
2642 case and_expr:
2643 case shift_expr:
2644 case arith_expr:
2645 case term:
2646 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002647 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002648 if (NCH(n) == 1) {
2649 n = CHILD(n, 0);
2650 goto next;
2651 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002652 break;
2653
2654 case atom:
2655 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002656 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002657 break;
2658
2659 }
2660 return NULL;
2661}
2662
Guido van Rossum79f25d91997-04-29 20:08:16 +00002663static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002664get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002665{
Guido van Rossum541563e1999-01-28 15:08:09 +00002666 /* Don't generate doc-strings if run with -OO */
2667 if (Py_OptimizeFlag > 1)
2668 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002669 n = get_rawdocstring(n);
2670 if (n == NULL)
2671 return NULL;
2672 return parsestrplus(n);
2673}
2674
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002675static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002676com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002677{
2678 REQ(n, suite);
2679 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2680 if (NCH(n) == 1) {
2681 com_node(c, CHILD(n, 0));
2682 }
2683 else {
2684 int i;
2685 for (i = 0; i < NCH(n); i++) {
2686 node *ch = CHILD(n, i);
2687 if (TYPE(ch) == stmt)
2688 com_node(c, ch);
2689 }
2690 }
2691}
2692
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002693/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002694static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002695com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002696{
2697 int i = c->c_nblocks;
2698 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2699 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2700 }
2701 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002702 com_error(c, PyExc_SyntaxError,
2703 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002704 }
2705 /* XXX Could allow it inside a 'finally' clause
2706 XXX if we could pop the exception still on the stack */
2707}
2708
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002709static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002710com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002711{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002712 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002713 if (TYPE(n) == lambdef) {
2714 /* lambdef: 'lambda' [varargslist] ':' test */
2715 n = CHILD(n, 1);
2716 }
2717 else {
2718 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2719 n = CHILD(n, 2);
2720 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2721 n = CHILD(n, 1);
2722 }
2723 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002724 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002725 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002726 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002727 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2728 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002729 nargs = 0;
2730 ndefs = 0;
2731 for (i = 0; i < nch; i++) {
2732 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002733 if (TYPE(CHILD(n, i)) == STAR ||
2734 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002735 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002736 nargs++;
2737 i++;
2738 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002739 t = RPAR; /* Anything except EQUAL or COMMA */
2740 else
2741 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002742 if (t == EQUAL) {
2743 i++;
2744 ndefs++;
2745 com_node(c, CHILD(n, i));
2746 i++;
2747 if (i >= nch)
2748 break;
2749 t = TYPE(CHILD(n, i));
2750 }
2751 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00002752 /* Treat "(a=1, b)" as an error */
2753 if (ndefs)
2754 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00002755 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002756 }
2757 if (t != COMMA)
2758 break;
2759 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002760 return ndefs;
2761}
2762
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002763static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002764com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002765{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002766 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002767 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002768 v = (PyObject *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002769 if (v == NULL)
2770 c->c_errors++;
2771 else {
2772 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002773 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002774 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002775 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002776 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002777 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002778 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002779 com_pop(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002780 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002781 }
2782}
2783
2784static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002785com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002786{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002787 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002788 REQ(n, testlist);
2789 /* testlist: test (',' test)* [','] */
2790 for (i = 0; i < NCH(n); i += 2)
2791 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002792 i = (NCH(n)+1) / 2;
2793 com_addoparg(c, BUILD_TUPLE, i);
2794 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00002795}
2796
2797static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002798com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002799{
Guido van Rossum25831651993-05-19 14:50:45 +00002800 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002801 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002802 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002803 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00002804 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00002805 c->c_errors++;
2806 return;
2807 }
2808 /* Push the class name on the stack */
2809 i = com_addconst(c, v);
2810 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002811 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002812 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00002813 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002814 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00002815 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002816 com_push(c, 1);
2817 }
Guido van Rossum25831651993-05-19 14:50:45 +00002818 else
2819 com_bases(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002820 v = (PyObject *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002821 if (v == NULL)
2822 c->c_errors++;
2823 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002824 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002825 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002826 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002827 com_addoparg(c, MAKE_FUNCTION, 0);
2828 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002829 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002830 com_pop(c, 2);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002831 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002832 Py_DECREF(v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002833 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002834}
2835
2836static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002837com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002838{
2839 switch (TYPE(n)) {
2840
2841 /* Definition nodes */
2842
2843 case funcdef:
2844 com_funcdef(c, n);
2845 break;
2846 case classdef:
2847 com_classdef(c, n);
2848 break;
2849
2850 /* Trivial parse tree nodes */
2851
2852 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002853 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002854 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002855 com_node(c, CHILD(n, 0));
2856 break;
2857
2858 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002859 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2860 com_addoparg(c, SET_LINENO, n->n_lineno);
2861 {
2862 int i;
2863 for (i = 0; i < NCH(n)-1; i += 2)
2864 com_node(c, CHILD(n, i));
2865 }
2866 break;
2867
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002868 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002869 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002870 com_node(c, CHILD(n, 0));
2871 break;
2872
2873 /* Statement nodes */
2874
2875 case expr_stmt:
2876 com_expr_stmt(c, n);
2877 break;
2878 case print_stmt:
2879 com_print_stmt(c, n);
2880 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002881 case del_stmt: /* 'del' exprlist */
Guido van Rossum8861b741996-07-30 16:49:37 +00002882 com_assign(c, CHILD(n, 1), OP_DELETE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002883 break;
2884 case pass_stmt:
2885 break;
2886 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002887 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002888 com_error(c, PyExc_SyntaxError,
2889 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002890 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002891 com_addbyte(c, BREAK_LOOP);
2892 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002893 case continue_stmt:
2894 com_continue_stmt(c, n);
2895 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002896 case return_stmt:
2897 com_return_stmt(c, n);
2898 break;
2899 case raise_stmt:
2900 com_raise_stmt(c, n);
2901 break;
2902 case import_stmt:
2903 com_import_stmt(c, n);
2904 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002905 case global_stmt:
2906 com_global_stmt(c, n);
2907 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002908 case exec_stmt:
2909 com_exec_stmt(c, n);
2910 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002911 case assert_stmt:
2912 com_assert_stmt(c, n);
2913 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002914 case if_stmt:
2915 com_if_stmt(c, n);
2916 break;
2917 case while_stmt:
2918 com_while_stmt(c, n);
2919 break;
2920 case for_stmt:
2921 com_for_stmt(c, n);
2922 break;
2923 case try_stmt:
2924 com_try_stmt(c, n);
2925 break;
2926 case suite:
2927 com_suite(c, n);
2928 break;
2929
2930 /* Expression nodes */
2931
2932 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002933 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002934 break;
2935 case test:
2936 com_test(c, n);
2937 break;
2938 case and_test:
2939 com_and_test(c, n);
2940 break;
2941 case not_test:
2942 com_not_test(c, n);
2943 break;
2944 case comparison:
2945 com_comparison(c, n);
2946 break;
2947 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002948 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002949 break;
2950 case expr:
2951 com_expr(c, n);
2952 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002953 case xor_expr:
2954 com_xor_expr(c, n);
2955 break;
2956 case and_expr:
2957 com_and_expr(c, n);
2958 break;
2959 case shift_expr:
2960 com_shift_expr(c, n);
2961 break;
2962 case arith_expr:
2963 com_arith_expr(c, n);
2964 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002965 case term:
2966 com_term(c, n);
2967 break;
2968 case factor:
2969 com_factor(c, n);
2970 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00002971 case power:
2972 com_power(c, n);
2973 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002974 case atom:
2975 com_atom(c, n);
2976 break;
2977
2978 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002979 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002980 com_error(c, PyExc_SystemError,
2981 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002982 }
2983}
2984
Tim Petersdbd9ba62000-07-09 03:09:57 +00002985static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002986
2987static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002988com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002989{
2990 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
2991 if (TYPE(CHILD(n, 0)) == LPAR)
2992 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002993 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002994 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002995 com_pop(c, 1);
2996 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002997}
2998
2999static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003000com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003001{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003002 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003003 if (NCH(n) == 1) {
3004 com_fpdef(c, CHILD(n, 0));
3005 }
3006 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003007 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003008 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003009 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003010 for (i = 0; i < NCH(n); i += 2)
3011 com_fpdef(c, CHILD(n, i));
3012 }
3013}
3014
3015static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003016com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003017{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003018 int nch, i;
3019 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003020 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003021 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003022 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003023 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003024 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003025 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003026 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003027 node *ch = CHILD(n, i);
3028 node *fp;
3029 char *name;
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003030 PyObject *nameval;
Guido van Rossum50564e81996-01-12 01:13:16 +00003031 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003032 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003033 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3034 fp = CHILD(ch, 0);
3035 if (TYPE(fp) == NAME)
3036 name = STR(fp);
3037 else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003038 name = nbuf;
3039 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003040 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003041 }
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003042 nameval = PyString_InternFromString(name);
3043 if (nameval == NULL) {
3044 c->c_errors++;
3045 }
Peter Schneider-Kamp9a5086c2000-07-13 06:24:29 +00003046 if (PyDict_GetItem(c->c_locals, nameval)) {
Fred Drakedcf08e02000-08-15 15:49:44 +00003047 com_error(c, PyExc_SyntaxError,
3048 "duplicate argument in function definition");
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003049 }
3050 com_newlocal_o(c, nameval);
3051 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003052 c->c_argcount++;
3053 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003054 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003055 ch = CHILD(n, i);
3056 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003057 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003058 else
3059 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003060 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003061 /* Handle *arguments */
3062 if (i < nch) {
3063 node *ch;
3064 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003065 if (TYPE(ch) != DOUBLESTAR) {
3066 REQ(ch, STAR);
3067 ch = CHILD(n, i+1);
3068 if (TYPE(ch) == NAME) {
3069 c->c_flags |= CO_VARARGS;
3070 i += 3;
3071 com_newlocal(c, STR(ch));
3072 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003073 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003074 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003075 /* Handle **keywords */
3076 if (i < nch) {
3077 node *ch;
3078 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003079 if (TYPE(ch) != DOUBLESTAR) {
3080 REQ(ch, STAR);
3081 ch = CHILD(n, i+1);
3082 REQ(ch, STAR);
3083 ch = CHILD(n, i+2);
3084 }
3085 else
3086 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003087 REQ(ch, NAME);
3088 c->c_flags |= CO_VARKEYWORDS;
3089 com_newlocal(c, STR(ch));
3090 }
3091 if (complex) {
3092 /* Generate code for complex arguments only after
3093 having counted the simple arguments */
3094 int ilocal = 0;
3095 for (i = 0; i < nch; i++) {
3096 node *ch = CHILD(n, i);
3097 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003098 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003099 break;
3100 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3101 fp = CHILD(ch, 0);
3102 if (TYPE(fp) != NAME) {
3103 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003104 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003105 com_fpdef(c, ch);
3106 }
3107 ilocal++;
3108 if (++i >= nch)
3109 break;
3110 ch = CHILD(n, i);
3111 if (TYPE(ch) == EQUAL)
3112 i += 2;
3113 else
3114 REQ(ch, COMMA);
3115 }
3116 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003117}
3118
3119static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003120com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003121{
3122 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003123 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003124 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003125 doc = get_docstring(n);
3126 if (doc != NULL) {
3127 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003128 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003129 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003130 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003131 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003132 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003133 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003134 for (i = 0; i < NCH(n); i++) {
3135 node *ch = CHILD(n, i);
3136 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3137 com_node(c, ch);
3138 }
3139}
3140
3141/* Top-level compile-node interface */
3142
3143static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003144compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003145{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003146 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003147 node *ch;
3148 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003149 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003150 doc = get_docstring(CHILD(n, 4));
3151 if (doc != NULL) {
3152 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003153 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003154 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003155 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003156 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003157 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3158 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003159 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003160 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003161 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003162 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003163 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003164 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003165 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003166 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003167 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003168}
3169
3170static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003171compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003172{
Guido van Rossum590baa41993-11-30 13:40:46 +00003173 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003174 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003175 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003176
3177 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003178 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003179 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003180 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003181 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003182 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003183 else
3184 ch = CHILD(n, 2);
3185 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003186 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003187 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003188}
3189
3190static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003191compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003192{
3193 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003194 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003195 REQ(n, classdef);
3196 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3197 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003198#ifdef PRIVATE_NAME_MANGLING
3199 c->c_private = c->c_name;
3200#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003201 ch = CHILD(n, NCH(n)-1); /* The suite */
3202 doc = get_docstring(ch);
3203 if (doc != NULL) {
3204 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003205 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003206 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003207 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003208 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003209 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003210 }
3211 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003212 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003213 com_node(c, ch);
3214 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003215 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003216 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003217 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003218}
3219
3220static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003221compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003222{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003223 com_addoparg(c, SET_LINENO, n->n_lineno);
3224
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003225 switch (TYPE(n)) {
3226
Guido van Rossum4c417781991-01-21 16:09:22 +00003227 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003228 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003229 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003230 n = CHILD(n, 0);
3231 if (TYPE(n) != NEWLINE)
3232 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003233 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003234 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003235 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003236 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003237 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003238 break;
3239
Guido van Rossum4c417781991-01-21 16:09:22 +00003240 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003241 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003242 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003243 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003244 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003245 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003246 break;
3247
Guido van Rossum590baa41993-11-30 13:40:46 +00003248 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003249 com_node(c, CHILD(n, 0));
3250 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003251 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003252 break;
3253
Guido van Rossum590baa41993-11-30 13:40:46 +00003254 case lambdef: /* anonymous function definition */
3255 compile_lambdef(c, n);
3256 break;
3257
Guido van Rossum4c417781991-01-21 16:09:22 +00003258 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003259 compile_funcdef(c, n);
3260 break;
3261
Guido van Rossum4c417781991-01-21 16:09:22 +00003262 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003263 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003264 break;
3265
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003266 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003267 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003268 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003269 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003270 }
3271}
3272
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003273/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00003274
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003275 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
3276 instructions that refer to local variables with LOAD_FAST etc.
3277 The latter instructions are much faster because they don't need to
3278 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003279
Guido van Rossum681d79a1995-07-18 14:51:37 +00003280 To find all local variables, we check all STORE_NAME, IMPORT_FROM
3281 and DELETE_NAME instructions. This yields all local variables,
3282 function definitions, class definitions and import statements.
3283 Argument names have already been entered into the list by the
3284 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003285
3286 All remaining LOAD_NAME instructions must refer to non-local (global
3287 or builtin) variables, so are replaced by LOAD_GLOBAL.
3288
3289 There are two problems: 'from foo import *' and 'exec' may introduce
3290 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00003291 case, we can still optimize bona fide locals (since those
3292 statements will be surrounded by fast_2_locals() and
3293 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003294
Guido van Rossum681d79a1995-07-18 14:51:37 +00003295 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00003296
3297static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003298optimize(struct compiling *c)
Guido van Rossum282914b1991-04-04 10:42:56 +00003299{
Guido van Rossum0a697f61991-04-16 08:39:12 +00003300 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00003301 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00003302 int oparg = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003303 PyObject *name;
3304 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003305
Guido van Rossum282914b1991-04-04 10:42:56 +00003306#define NEXTOP() (*next_instr++)
3307#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossum79f25d91997-04-29 20:08:16 +00003308#define GETITEM(v, i) (PyList_GetItem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003309#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
3310
Guido van Rossum79f25d91997-04-29 20:08:16 +00003311 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003312
3313 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00003314
Guido van Rossum79f25d91997-04-29 20:08:16 +00003315 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003316 for (;;) {
3317 opcode = NEXTOP();
3318 if (opcode == STOP_CODE)
3319 break;
3320 if (HAS_ARG(opcode))
3321 oparg = NEXTARG();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003322 switch (opcode) {
3323 case STORE_NAME:
3324 case DELETE_NAME:
3325 case IMPORT_FROM:
3326 com_addlocal_o(c, GETNAMEOBJ(oparg));
3327 break;
Thomas Wouters52152252000-08-17 22:55:00 +00003328 case IMPORT_STAR:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003329 case EXEC_STMT:
3330 c->c_flags &= ~CO_OPTIMIZED;
3331 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00003332 }
3333 }
3334
Thomas Wouters52152252000-08-17 22:55:00 +00003335 /* TBD: Is this still necessary ? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003336 if (PyDict_GetItemString(c->c_locals, "*") != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003337 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003338
Guido van Rossum79f25d91997-04-29 20:08:16 +00003339 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003340 for (;;) {
3341 cur_instr = next_instr;
3342 opcode = NEXTOP();
3343 if (opcode == STOP_CODE)
3344 break;
3345 if (HAS_ARG(opcode))
3346 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003347 if (opcode == LOAD_NAME ||
3348 opcode == STORE_NAME ||
3349 opcode == DELETE_NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003350 PyObject *v;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003351 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00003352 name = GETNAMEOBJ(oparg);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003353 v = PyDict_GetItem(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003354 if (v == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003355 if (opcode == LOAD_NAME &&
3356 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003357 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003358 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00003359 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003360 i = PyInt_AsLong(v);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003361 switch (opcode) {
3362 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
3363 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
3364 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
3365 }
3366 cur_instr[1] = i & 0xff;
3367 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00003368 }
3369 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003370
Guido van Rossum681d79a1995-07-18 14:51:37 +00003371 if (c->c_errors == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00003372 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00003373}
3374
Guido van Rossum79f25d91997-04-29 20:08:16 +00003375PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003376PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003377{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003378 return jcompile(n, filename, NULL);
3379}
3380
Guido van Rossum79f25d91997-04-29 20:08:16 +00003381static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003382icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003383{
3384 return jcompile(n, base->c_filename, base);
3385}
3386
Guido van Rossum79f25d91997-04-29 20:08:16 +00003387static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003388jcompile(node *n, char *filename, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003389{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003390 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003391 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003392 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003393 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003394#ifdef PRIVATE_NAME_MANGLING
3395 if (base)
3396 sc.c_private = base->c_private;
3397 else
3398 sc.c_private = NULL;
3399#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003400 compile_node(&sc, n);
3401 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003402 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003403 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003404 sc.c_flags |= CO_NEWLOCALS;
3405 }
3406 else if (TYPE(n) == classdef)
3407 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00003408 co = NULL;
3409 if (sc.c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003410 PyObject *consts, *names, *varnames, *filename, *name;
3411 consts = PyList_AsTuple(sc.c_consts);
3412 names = PyList_AsTuple(sc.c_names);
3413 varnames = PyList_AsTuple(sc.c_varnames);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003414 filename = PyString_InternFromString(sc.c_filename);
3415 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003416 if (!PyErr_Occurred())
3417 co = PyCode_New(sc.c_argcount,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003418 sc.c_nlocals,
Guido van Rossum8b993a91997-01-17 21:04:03 +00003419 sc.c_maxstacklevel,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003420 sc.c_flags,
3421 sc.c_code,
3422 consts,
3423 names,
3424 varnames,
3425 filename,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003426 name,
3427 sc.c_firstlineno,
3428 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003429 Py_XDECREF(consts);
3430 Py_XDECREF(names);
3431 Py_XDECREF(varnames);
3432 Py_XDECREF(filename);
3433 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003434 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003435 else if (!PyErr_Occurred()) {
3436 /* This could happen if someone called PyErr_Clear() after an
3437 error was reported above. That's not supposed to happen,
3438 but I just plugged one case and I'm not sure there can't be
3439 others. In that case, raise SystemError so that at least
3440 it gets reported instead dumping core. */
3441 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3442 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003443 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003444 return co;
3445}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003446
3447int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003448PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003449{
3450 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003451 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003452 int line = co->co_firstlineno;
3453 int addr = 0;
3454 while (--size >= 0) {
3455 addr += *p++;
3456 if (addr > addrq)
3457 break;
3458 line += *p++;
3459 }
3460 return line;
3461}