blob: 47445d067911738e9b6eeaa0f4c6ed08f55054c8 [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) {
2142 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
2143 com_error(c, PyExc_SyntaxError,
2144 "invalid syntax");
2145 return;
2146 }
2147 com_addopname(c, STORE_NAME, CHILD(subn, 2));
2148 } else
2149 com_addopname(c, STORE_NAME,
2150 CHILD(CHILD(subn, 0),0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002151 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002152 }
2153 }
2154}
2155
2156static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002157com_global_stmt(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002158{
2159 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002160 REQ(n, global_stmt);
2161 /* 'global' NAME (',' NAME)* */
2162 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002163 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002164#ifdef PRIVATE_NAME_MANGLING
2165 char buffer[256];
2166 if (s != NULL && s[0] == '_' && s[1] == '_' &&
2167 c->c_private != NULL &&
Guido van Rossum582acec2000-06-28 22:07:35 +00002168 com_mangle(c, s, buffer, sizeof(buffer)))
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002169 s = buffer;
2170#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +00002171 if (PyDict_GetItemString(c->c_locals, s) != NULL) {
2172 com_error(c, PyExc_SyntaxError,
2173 "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002174 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002175 else if (PyDict_SetItemString(c->c_globals, s, Py_None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002176 c->c_errors++;
2177 }
2178}
2179
Guido van Rossum681d79a1995-07-18 14:51:37 +00002180static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002181com_newlocal_o(struct compiling *c, PyObject *nameval)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002182{
2183 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002184 PyObject *ival;
2185 if (PyList_Size(c->c_varnames) != c->c_nlocals) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002186 /* This is usually caused by an error on a previous call */
2187 if (c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002188 com_error(c, PyExc_SystemError,
2189 "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002190 }
2191 return 0;
2192 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002193 ival = PyInt_FromLong(i = c->c_nlocals++);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002194 if (ival == NULL)
2195 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002196 else if (PyDict_SetItem(c->c_locals, nameval, ival) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002197 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002198 else if (PyList_Append(c->c_varnames, nameval) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002199 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002200 Py_XDECREF(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002201 return i;
2202}
2203
2204static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002205com_addlocal_o(struct compiling *c, PyObject *nameval)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002206{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002207 PyObject *ival = PyDict_GetItem(c->c_locals, nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002208 if (ival != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002209 return PyInt_AsLong(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002210 return com_newlocal_o(c, nameval);
2211}
2212
2213static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002214com_newlocal(struct compiling *c, char *name)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002215{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002216 PyObject *nameval = PyString_InternFromString(name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002217 int i;
2218 if (nameval == NULL) {
2219 c->c_errors++;
2220 return 0;
2221 }
2222 i = com_newlocal_o(c, nameval);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002223 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002224 return i;
2225}
2226
Guido van Rossumc5e96291991-12-10 13:53:51 +00002227static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002228com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002229{
2230 REQ(n, exec_stmt);
2231 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2232 com_node(c, CHILD(n, 1));
2233 if (NCH(n) >= 4)
2234 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002235 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002236 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002237 com_push(c, 1);
2238 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002239 if (NCH(n) >= 6)
2240 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002241 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002242 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002243 com_push(c, 1);
2244 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002245 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002246 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002247}
2248
Guido van Rossum7c531111997-03-11 18:42:21 +00002249static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002250is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002251{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002252 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002253 int i;
2254
2255 /* Label to avoid tail recursion */
2256 next:
2257 switch (TYPE(n)) {
2258
2259 case suite:
2260 if (NCH(n) == 1) {
2261 n = CHILD(n, 0);
2262 goto next;
2263 }
2264 /* Fall through */
2265 case file_input:
2266 for (i = 0; i < NCH(n); i++) {
2267 node *ch = CHILD(n, i);
2268 if (TYPE(ch) == stmt) {
2269 n = ch;
2270 goto next;
2271 }
2272 }
2273 break;
2274
2275 case stmt:
2276 case simple_stmt:
2277 case small_stmt:
2278 n = CHILD(n, 0);
2279 goto next;
2280
2281 case expr_stmt:
2282 case testlist:
2283 case test:
2284 case and_test:
2285 case not_test:
2286 case comparison:
2287 case expr:
2288 case xor_expr:
2289 case and_expr:
2290 case shift_expr:
2291 case arith_expr:
2292 case term:
2293 case factor:
2294 case power:
2295 case atom:
2296 if (NCH(n) == 1) {
2297 n = CHILD(n, 0);
2298 goto next;
2299 }
2300 break;
2301
2302 case NAME:
2303 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2304 return 1;
2305 break;
2306
2307 case NUMBER:
2308 v = parsenumber(c, STR(n));
2309 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002310 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002311 break;
2312 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002313 i = PyObject_IsTrue(v);
2314 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002315 return i == 0;
2316
2317 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002318 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002319 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002320 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002321 break;
2322 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002323 i = PyObject_IsTrue(v);
2324 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002325 return i == 0;
2326
2327 }
2328 return 0;
2329}
2330
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002331static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002332com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002333{
2334 int i;
2335 int anchor = 0;
2336 REQ(n, if_stmt);
2337 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2338 for (i = 0; i+3 < NCH(n); i+=4) {
2339 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002340 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002341 if (is_constant_false(c, ch))
2342 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002343 if (i > 0)
2344 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002345 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002346 com_addfwref(c, JUMP_IF_FALSE, &a);
2347 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002348 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002349 com_node(c, CHILD(n, i+3));
2350 com_addfwref(c, JUMP_FORWARD, &anchor);
2351 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002352 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002353 com_addbyte(c, POP_TOP);
2354 }
2355 if (i+2 < NCH(n))
2356 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002357 if (anchor)
2358 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002359}
2360
2361static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002362com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002363{
2364 int break_anchor = 0;
2365 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002366 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002367 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2368 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002369 block_push(c, SETUP_LOOP);
2370 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002371 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002372 com_node(c, CHILD(n, 1));
2373 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2374 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002375 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002376 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002377 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002378 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002379 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2380 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002381 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002382 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002383 com_addbyte(c, POP_TOP);
2384 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002385 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002386 if (NCH(n) > 4)
2387 com_node(c, CHILD(n, 6));
2388 com_backpatch(c, break_anchor);
2389}
2390
2391static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002392com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002393{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002394 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002395 int break_anchor = 0;
2396 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002397 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002398 REQ(n, for_stmt);
2399 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2400 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002401 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002402 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002403 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002404 if (v == NULL)
2405 c->c_errors++;
2406 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002407 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002408 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002409 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002410 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002411 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002412 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002413 com_assign(c, CHILD(n, 1), OP_ASSIGN);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002414 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002415 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002416 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002417 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2418 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002419 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002420 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002421 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002422 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002423 if (NCH(n) > 8)
2424 com_node(c, CHILD(n, 8));
2425 com_backpatch(c, break_anchor);
2426}
2427
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002428/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002429
2430 SETUP_FINALLY L
2431 <code for S>
2432 POP_BLOCK
2433 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002434 L: <code for Sf>
2435 END_FINALLY
2436
2437 The special instructions use the block stack. Each block
2438 stack entry contains the instruction that created it (here
2439 SETUP_FINALLY), the level of the value stack at the time the
2440 block stack entry was created, and a label (here L).
2441
2442 SETUP_FINALLY:
2443 Pushes the current value stack level and the label
2444 onto the block stack.
2445 POP_BLOCK:
2446 Pops en entry from the block stack, and pops the value
2447 stack until its level is the same as indicated on the
2448 block stack. (The label is ignored.)
2449 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002450 Pops a variable number of entries from the *value* stack
2451 and re-raises the exception they specify. The number of
2452 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002453
2454 The block stack is unwound when an exception is raised:
2455 when a SETUP_FINALLY entry is found, the exception is pushed
2456 onto the value stack (and the exception condition is cleared),
2457 and the interpreter jumps to the label gotten from the block
2458 stack.
2459
2460 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002461 (The contents of the value stack is shown in [], with the top
2462 at the right; 'tb' is trace-back info, 'val' the exception's
2463 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002464
2465 Value stack Label Instruction Argument
2466 [] SETUP_EXCEPT L1
2467 [] <code for S>
2468 [] POP_BLOCK
2469 [] JUMP_FORWARD L0
2470
Guido van Rossum3f5da241990-12-20 15:06:42 +00002471 [tb, val, exc] L1: DUP )
2472 [tb, val, exc, exc] <evaluate E1> )
2473 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2474 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2475 [tb, val, exc, 1] POP )
2476 [tb, val, exc] POP
2477 [tb, val] <assign to V1> (or POP if no V1)
2478 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002479 [] <code for S1>
2480 JUMP_FORWARD L0
2481
Guido van Rossum3f5da241990-12-20 15:06:42 +00002482 [tb, val, exc, 0] L2: POP
2483 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002484 .............................etc.......................
2485
Guido van Rossum3f5da241990-12-20 15:06:42 +00002486 [tb, val, exc, 0] Ln+1: POP
2487 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002488
2489 [] L0: <next statement>
2490
2491 Of course, parts are not generated if Vi or Ei is not present.
2492*/
2493
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002494static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002495com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002496{
2497 int except_anchor = 0;
2498 int end_anchor = 0;
2499 int else_anchor = 0;
2500 int i;
2501 node *ch;
2502
2503 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2504 block_push(c, SETUP_EXCEPT);
2505 com_node(c, CHILD(n, 2));
2506 com_addbyte(c, POP_BLOCK);
2507 block_pop(c, SETUP_EXCEPT);
2508 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2509 com_backpatch(c, except_anchor);
2510 for (i = 3;
2511 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2512 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002513 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002514 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002515 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002516 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002517 break;
2518 }
2519 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002520 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002521 com_addoparg(c, SET_LINENO, ch->n_lineno);
2522 if (NCH(ch) > 1) {
2523 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002524 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002525 com_node(c, CHILD(ch, 1));
2526 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002527 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002528 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2529 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002530 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002531 }
2532 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002533 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002534 if (NCH(ch) > 3)
Guido van Rossum8861b741996-07-30 16:49:37 +00002535 com_assign(c, CHILD(ch, 3), OP_ASSIGN);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002536 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002537 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002538 com_pop(c, 1);
2539 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002540 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002541 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002542 com_node(c, CHILD(n, i+2));
2543 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2544 if (except_anchor) {
2545 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002546 /* We come in with [tb, val, exc, 0] on the
2547 stack; one pop and it's the same as
2548 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002549 com_addbyte(c, POP_TOP);
2550 }
2551 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002552 /* We actually come in here with [tb, val, exc] but the
2553 END_FINALLY will zap those and jump around.
2554 The c_stacklevel does not reflect them so we need not pop
2555 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002556 com_addbyte(c, END_FINALLY);
2557 com_backpatch(c, else_anchor);
2558 if (i < NCH(n))
2559 com_node(c, CHILD(n, i+2));
2560 com_backpatch(c, end_anchor);
2561}
2562
2563static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002564com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002565{
2566 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002567 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002568
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002569 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2570 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002571 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002572 com_addbyte(c, POP_BLOCK);
2573 block_pop(c, SETUP_FINALLY);
2574 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002575 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002576 /* While the generated code pushes only one item,
2577 the try-finally handling can enter here with
2578 up to three items. OK, here are the details:
2579 3 for an exception, 2 for RETURN, 1 for BREAK. */
2580 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002581 com_backpatch(c, finally_anchor);
2582 ch = CHILD(n, NCH(n)-1);
2583 com_addoparg(c, SET_LINENO, ch->n_lineno);
2584 com_node(c, ch);
2585 com_addbyte(c, END_FINALLY);
2586 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002587 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002588}
2589
2590static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002591com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002592{
2593 REQ(n, try_stmt);
2594 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2595 | 'try' ':' suite 'finally' ':' suite */
2596 if (TYPE(CHILD(n, 3)) != except_clause)
2597 com_try_finally(c, n);
2598 else
2599 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002600}
2601
Guido van Rossum8b993a91997-01-17 21:04:03 +00002602static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002603get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002604{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002605 int i;
2606
Guido van Rossum8b993a91997-01-17 21:04:03 +00002607 /* Label to avoid tail recursion */
2608 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002609 switch (TYPE(n)) {
2610
2611 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002612 if (NCH(n) == 1) {
2613 n = CHILD(n, 0);
2614 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002615 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002616 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002617 case file_input:
2618 for (i = 0; i < NCH(n); i++) {
2619 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002620 if (TYPE(ch) == stmt) {
2621 n = ch;
2622 goto next;
2623 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002624 }
2625 break;
2626
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002627 case stmt:
2628 case simple_stmt:
2629 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002630 n = CHILD(n, 0);
2631 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002632
2633 case expr_stmt:
2634 case testlist:
2635 case test:
2636 case and_test:
2637 case not_test:
2638 case comparison:
2639 case expr:
2640 case xor_expr:
2641 case and_expr:
2642 case shift_expr:
2643 case arith_expr:
2644 case term:
2645 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002646 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002647 if (NCH(n) == 1) {
2648 n = CHILD(n, 0);
2649 goto next;
2650 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002651 break;
2652
2653 case atom:
2654 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002655 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002656 break;
2657
2658 }
2659 return NULL;
2660}
2661
Guido van Rossum79f25d91997-04-29 20:08:16 +00002662static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002663get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002664{
Guido van Rossum541563e1999-01-28 15:08:09 +00002665 /* Don't generate doc-strings if run with -OO */
2666 if (Py_OptimizeFlag > 1)
2667 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002668 n = get_rawdocstring(n);
2669 if (n == NULL)
2670 return NULL;
2671 return parsestrplus(n);
2672}
2673
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002674static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002675com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002676{
2677 REQ(n, suite);
2678 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2679 if (NCH(n) == 1) {
2680 com_node(c, CHILD(n, 0));
2681 }
2682 else {
2683 int i;
2684 for (i = 0; i < NCH(n); i++) {
2685 node *ch = CHILD(n, i);
2686 if (TYPE(ch) == stmt)
2687 com_node(c, ch);
2688 }
2689 }
2690}
2691
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002692/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002693static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002694com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002695{
2696 int i = c->c_nblocks;
2697 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2698 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2699 }
2700 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002701 com_error(c, PyExc_SyntaxError,
2702 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002703 }
2704 /* XXX Could allow it inside a 'finally' clause
2705 XXX if we could pop the exception still on the stack */
2706}
2707
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002708static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002709com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002710{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002711 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002712 if (TYPE(n) == lambdef) {
2713 /* lambdef: 'lambda' [varargslist] ':' test */
2714 n = CHILD(n, 1);
2715 }
2716 else {
2717 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2718 n = CHILD(n, 2);
2719 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2720 n = CHILD(n, 1);
2721 }
2722 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002723 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002724 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002725 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002726 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2727 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002728 nargs = 0;
2729 ndefs = 0;
2730 for (i = 0; i < nch; i++) {
2731 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002732 if (TYPE(CHILD(n, i)) == STAR ||
2733 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002734 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002735 nargs++;
2736 i++;
2737 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002738 t = RPAR; /* Anything except EQUAL or COMMA */
2739 else
2740 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002741 if (t == EQUAL) {
2742 i++;
2743 ndefs++;
2744 com_node(c, CHILD(n, i));
2745 i++;
2746 if (i >= nch)
2747 break;
2748 t = TYPE(CHILD(n, i));
2749 }
2750 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00002751 /* Treat "(a=1, b)" as an error */
2752 if (ndefs)
2753 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00002754 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002755 }
2756 if (t != COMMA)
2757 break;
2758 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002759 return ndefs;
2760}
2761
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002762static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002763com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002764{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002765 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002766 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002767 v = (PyObject *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002768 if (v == NULL)
2769 c->c_errors++;
2770 else {
2771 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002772 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002773 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002774 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002775 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002776 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002777 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002778 com_pop(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002779 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002780 }
2781}
2782
2783static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002784com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002785{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002786 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002787 REQ(n, testlist);
2788 /* testlist: test (',' test)* [','] */
2789 for (i = 0; i < NCH(n); i += 2)
2790 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002791 i = (NCH(n)+1) / 2;
2792 com_addoparg(c, BUILD_TUPLE, i);
2793 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00002794}
2795
2796static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002797com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002798{
Guido van Rossum25831651993-05-19 14:50:45 +00002799 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002800 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002801 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002802 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00002803 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00002804 c->c_errors++;
2805 return;
2806 }
2807 /* Push the class name on the stack */
2808 i = com_addconst(c, v);
2809 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002810 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002811 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00002812 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002813 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00002814 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002815 com_push(c, 1);
2816 }
Guido van Rossum25831651993-05-19 14:50:45 +00002817 else
2818 com_bases(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002819 v = (PyObject *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002820 if (v == NULL)
2821 c->c_errors++;
2822 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002823 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002824 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002825 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002826 com_addoparg(c, MAKE_FUNCTION, 0);
2827 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002828 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002829 com_pop(c, 2);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002830 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002831 Py_DECREF(v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002832 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002833}
2834
2835static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002836com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002837{
2838 switch (TYPE(n)) {
2839
2840 /* Definition nodes */
2841
2842 case funcdef:
2843 com_funcdef(c, n);
2844 break;
2845 case classdef:
2846 com_classdef(c, n);
2847 break;
2848
2849 /* Trivial parse tree nodes */
2850
2851 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002852 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002853 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002854 com_node(c, CHILD(n, 0));
2855 break;
2856
2857 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002858 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2859 com_addoparg(c, SET_LINENO, n->n_lineno);
2860 {
2861 int i;
2862 for (i = 0; i < NCH(n)-1; i += 2)
2863 com_node(c, CHILD(n, i));
2864 }
2865 break;
2866
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002867 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002868 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002869 com_node(c, CHILD(n, 0));
2870 break;
2871
2872 /* Statement nodes */
2873
2874 case expr_stmt:
2875 com_expr_stmt(c, n);
2876 break;
2877 case print_stmt:
2878 com_print_stmt(c, n);
2879 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002880 case del_stmt: /* 'del' exprlist */
Guido van Rossum8861b741996-07-30 16:49:37 +00002881 com_assign(c, CHILD(n, 1), OP_DELETE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002882 break;
2883 case pass_stmt:
2884 break;
2885 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002886 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002887 com_error(c, PyExc_SyntaxError,
2888 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002889 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002890 com_addbyte(c, BREAK_LOOP);
2891 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002892 case continue_stmt:
2893 com_continue_stmt(c, n);
2894 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002895 case return_stmt:
2896 com_return_stmt(c, n);
2897 break;
2898 case raise_stmt:
2899 com_raise_stmt(c, n);
2900 break;
2901 case import_stmt:
2902 com_import_stmt(c, n);
2903 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002904 case global_stmt:
2905 com_global_stmt(c, n);
2906 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002907 case exec_stmt:
2908 com_exec_stmt(c, n);
2909 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002910 case assert_stmt:
2911 com_assert_stmt(c, n);
2912 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002913 case if_stmt:
2914 com_if_stmt(c, n);
2915 break;
2916 case while_stmt:
2917 com_while_stmt(c, n);
2918 break;
2919 case for_stmt:
2920 com_for_stmt(c, n);
2921 break;
2922 case try_stmt:
2923 com_try_stmt(c, n);
2924 break;
2925 case suite:
2926 com_suite(c, n);
2927 break;
2928
2929 /* Expression nodes */
2930
2931 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002932 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002933 break;
2934 case test:
2935 com_test(c, n);
2936 break;
2937 case and_test:
2938 com_and_test(c, n);
2939 break;
2940 case not_test:
2941 com_not_test(c, n);
2942 break;
2943 case comparison:
2944 com_comparison(c, n);
2945 break;
2946 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002947 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002948 break;
2949 case expr:
2950 com_expr(c, n);
2951 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002952 case xor_expr:
2953 com_xor_expr(c, n);
2954 break;
2955 case and_expr:
2956 com_and_expr(c, n);
2957 break;
2958 case shift_expr:
2959 com_shift_expr(c, n);
2960 break;
2961 case arith_expr:
2962 com_arith_expr(c, n);
2963 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002964 case term:
2965 com_term(c, n);
2966 break;
2967 case factor:
2968 com_factor(c, n);
2969 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00002970 case power:
2971 com_power(c, n);
2972 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002973 case atom:
2974 com_atom(c, n);
2975 break;
2976
2977 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002978 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002979 com_error(c, PyExc_SystemError,
2980 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002981 }
2982}
2983
Tim Petersdbd9ba62000-07-09 03:09:57 +00002984static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002985
2986static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002987com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002988{
2989 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
2990 if (TYPE(CHILD(n, 0)) == LPAR)
2991 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002992 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002993 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002994 com_pop(c, 1);
2995 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002996}
2997
2998static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002999com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003000{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003001 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003002 if (NCH(n) == 1) {
3003 com_fpdef(c, CHILD(n, 0));
3004 }
3005 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003006 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003007 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003008 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003009 for (i = 0; i < NCH(n); i += 2)
3010 com_fpdef(c, CHILD(n, i));
3011 }
3012}
3013
3014static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003015com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003016{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003017 int nch, i;
3018 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003019 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003020 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003021 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003022 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003023 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003024 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003025 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003026 node *ch = CHILD(n, i);
3027 node *fp;
3028 char *name;
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003029 PyObject *nameval;
Guido van Rossum50564e81996-01-12 01:13:16 +00003030 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003031 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003032 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3033 fp = CHILD(ch, 0);
3034 if (TYPE(fp) == NAME)
3035 name = STR(fp);
3036 else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003037 name = nbuf;
3038 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003039 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003040 }
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003041 nameval = PyString_InternFromString(name);
3042 if (nameval == NULL) {
3043 c->c_errors++;
3044 }
Peter Schneider-Kamp9a5086c2000-07-13 06:24:29 +00003045 if (PyDict_GetItem(c->c_locals, nameval)) {
Fred Drakedcf08e02000-08-15 15:49:44 +00003046 com_error(c, PyExc_SyntaxError,
3047 "duplicate argument in function definition");
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003048 }
3049 com_newlocal_o(c, nameval);
3050 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003051 c->c_argcount++;
3052 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003053 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003054 ch = CHILD(n, i);
3055 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003056 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003057 else
3058 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003059 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003060 /* Handle *arguments */
3061 if (i < nch) {
3062 node *ch;
3063 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003064 if (TYPE(ch) != DOUBLESTAR) {
3065 REQ(ch, STAR);
3066 ch = CHILD(n, i+1);
3067 if (TYPE(ch) == NAME) {
3068 c->c_flags |= CO_VARARGS;
3069 i += 3;
3070 com_newlocal(c, STR(ch));
3071 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003072 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003073 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003074 /* Handle **keywords */
3075 if (i < nch) {
3076 node *ch;
3077 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003078 if (TYPE(ch) != DOUBLESTAR) {
3079 REQ(ch, STAR);
3080 ch = CHILD(n, i+1);
3081 REQ(ch, STAR);
3082 ch = CHILD(n, i+2);
3083 }
3084 else
3085 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003086 REQ(ch, NAME);
3087 c->c_flags |= CO_VARKEYWORDS;
3088 com_newlocal(c, STR(ch));
3089 }
3090 if (complex) {
3091 /* Generate code for complex arguments only after
3092 having counted the simple arguments */
3093 int ilocal = 0;
3094 for (i = 0; i < nch; i++) {
3095 node *ch = CHILD(n, i);
3096 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003097 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003098 break;
3099 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3100 fp = CHILD(ch, 0);
3101 if (TYPE(fp) != NAME) {
3102 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003103 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003104 com_fpdef(c, ch);
3105 }
3106 ilocal++;
3107 if (++i >= nch)
3108 break;
3109 ch = CHILD(n, i);
3110 if (TYPE(ch) == EQUAL)
3111 i += 2;
3112 else
3113 REQ(ch, COMMA);
3114 }
3115 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003116}
3117
3118static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003119com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003120{
3121 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003122 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003123 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003124 doc = get_docstring(n);
3125 if (doc != NULL) {
3126 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003127 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003128 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003129 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003130 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003131 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003132 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003133 for (i = 0; i < NCH(n); i++) {
3134 node *ch = CHILD(n, i);
3135 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3136 com_node(c, ch);
3137 }
3138}
3139
3140/* Top-level compile-node interface */
3141
3142static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003143compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003144{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003145 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003146 node *ch;
3147 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003148 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003149 doc = get_docstring(CHILD(n, 4));
3150 if (doc != NULL) {
3151 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003152 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003153 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003154 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003155 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003156 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3157 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003158 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003159 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003160 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003161 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003162 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003163 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003164 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003165 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003166 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003167}
3168
3169static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003170compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003171{
Guido van Rossum590baa41993-11-30 13:40:46 +00003172 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003173 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003174 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003175
3176 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003177 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003178 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003179 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003180 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003181 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003182 else
3183 ch = CHILD(n, 2);
3184 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003185 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003186 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003187}
3188
3189static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003190compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003191{
3192 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003193 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003194 REQ(n, classdef);
3195 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3196 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003197#ifdef PRIVATE_NAME_MANGLING
3198 c->c_private = c->c_name;
3199#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003200 ch = CHILD(n, NCH(n)-1); /* The suite */
3201 doc = get_docstring(ch);
3202 if (doc != NULL) {
3203 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003204 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003205 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003206 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003207 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003208 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003209 }
3210 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003211 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003212 com_node(c, ch);
3213 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003214 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003215 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003216 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003217}
3218
3219static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003220compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003221{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003222 com_addoparg(c, SET_LINENO, n->n_lineno);
3223
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003224 switch (TYPE(n)) {
3225
Guido van Rossum4c417781991-01-21 16:09:22 +00003226 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003227 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003228 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003229 n = CHILD(n, 0);
3230 if (TYPE(n) != NEWLINE)
3231 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003232 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003233 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003234 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003235 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003236 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003237 break;
3238
Guido van Rossum4c417781991-01-21 16:09:22 +00003239 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003240 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003241 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003242 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003243 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003244 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003245 break;
3246
Guido van Rossum590baa41993-11-30 13:40:46 +00003247 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003248 com_node(c, CHILD(n, 0));
3249 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003250 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003251 break;
3252
Guido van Rossum590baa41993-11-30 13:40:46 +00003253 case lambdef: /* anonymous function definition */
3254 compile_lambdef(c, n);
3255 break;
3256
Guido van Rossum4c417781991-01-21 16:09:22 +00003257 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003258 compile_funcdef(c, n);
3259 break;
3260
Guido van Rossum4c417781991-01-21 16:09:22 +00003261 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003262 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003263 break;
3264
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003265 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003266 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003267 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003268 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003269 }
3270}
3271
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003272/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00003273
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003274 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
3275 instructions that refer to local variables with LOAD_FAST etc.
3276 The latter instructions are much faster because they don't need to
3277 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003278
Guido van Rossum681d79a1995-07-18 14:51:37 +00003279 To find all local variables, we check all STORE_NAME, IMPORT_FROM
3280 and DELETE_NAME instructions. This yields all local variables,
3281 function definitions, class definitions and import statements.
3282 Argument names have already been entered into the list by the
3283 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003284
3285 All remaining LOAD_NAME instructions must refer to non-local (global
3286 or builtin) variables, so are replaced by LOAD_GLOBAL.
3287
3288 There are two problems: 'from foo import *' and 'exec' may introduce
3289 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00003290 case, we can still optimize bona fide locals (since those
3291 statements will be surrounded by fast_2_locals() and
3292 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003293
Guido van Rossum681d79a1995-07-18 14:51:37 +00003294 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00003295
3296static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003297optimize(struct compiling *c)
Guido van Rossum282914b1991-04-04 10:42:56 +00003298{
Guido van Rossum0a697f61991-04-16 08:39:12 +00003299 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00003300 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00003301 int oparg = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003302 PyObject *name;
3303 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003304
Guido van Rossum282914b1991-04-04 10:42:56 +00003305#define NEXTOP() (*next_instr++)
3306#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossum79f25d91997-04-29 20:08:16 +00003307#define GETITEM(v, i) (PyList_GetItem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003308#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
3309
Guido van Rossum79f25d91997-04-29 20:08:16 +00003310 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003311
3312 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00003313
Guido van Rossum79f25d91997-04-29 20:08:16 +00003314 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003315 for (;;) {
3316 opcode = NEXTOP();
3317 if (opcode == STOP_CODE)
3318 break;
3319 if (HAS_ARG(opcode))
3320 oparg = NEXTARG();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003321 switch (opcode) {
3322 case STORE_NAME:
3323 case DELETE_NAME:
3324 case IMPORT_FROM:
3325 com_addlocal_o(c, GETNAMEOBJ(oparg));
3326 break;
Thomas Wouters52152252000-08-17 22:55:00 +00003327 case IMPORT_STAR:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003328 case EXEC_STMT:
3329 c->c_flags &= ~CO_OPTIMIZED;
3330 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00003331 }
3332 }
3333
Thomas Wouters52152252000-08-17 22:55:00 +00003334 /* TBD: Is this still necessary ? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003335 if (PyDict_GetItemString(c->c_locals, "*") != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003336 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003337
Guido van Rossum79f25d91997-04-29 20:08:16 +00003338 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003339 for (;;) {
3340 cur_instr = next_instr;
3341 opcode = NEXTOP();
3342 if (opcode == STOP_CODE)
3343 break;
3344 if (HAS_ARG(opcode))
3345 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003346 if (opcode == LOAD_NAME ||
3347 opcode == STORE_NAME ||
3348 opcode == DELETE_NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003349 PyObject *v;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003350 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00003351 name = GETNAMEOBJ(oparg);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003352 v = PyDict_GetItem(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003353 if (v == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003354 if (opcode == LOAD_NAME &&
3355 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003356 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003357 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00003358 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003359 i = PyInt_AsLong(v);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003360 switch (opcode) {
3361 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
3362 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
3363 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
3364 }
3365 cur_instr[1] = i & 0xff;
3366 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00003367 }
3368 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003369
Guido van Rossum681d79a1995-07-18 14:51:37 +00003370 if (c->c_errors == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00003371 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00003372}
3373
Guido van Rossum79f25d91997-04-29 20:08:16 +00003374PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003375PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003376{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003377 return jcompile(n, filename, NULL);
3378}
3379
Guido van Rossum79f25d91997-04-29 20:08:16 +00003380static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003381icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003382{
3383 return jcompile(n, base->c_filename, base);
3384}
3385
Guido van Rossum79f25d91997-04-29 20:08:16 +00003386static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003387jcompile(node *n, char *filename, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003388{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003389 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003390 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003391 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003392 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003393#ifdef PRIVATE_NAME_MANGLING
3394 if (base)
3395 sc.c_private = base->c_private;
3396 else
3397 sc.c_private = NULL;
3398#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003399 compile_node(&sc, n);
3400 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003401 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003402 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003403 sc.c_flags |= CO_NEWLOCALS;
3404 }
3405 else if (TYPE(n) == classdef)
3406 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00003407 co = NULL;
3408 if (sc.c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003409 PyObject *consts, *names, *varnames, *filename, *name;
3410 consts = PyList_AsTuple(sc.c_consts);
3411 names = PyList_AsTuple(sc.c_names);
3412 varnames = PyList_AsTuple(sc.c_varnames);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003413 filename = PyString_InternFromString(sc.c_filename);
3414 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003415 if (!PyErr_Occurred())
3416 co = PyCode_New(sc.c_argcount,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003417 sc.c_nlocals,
Guido van Rossum8b993a91997-01-17 21:04:03 +00003418 sc.c_maxstacklevel,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003419 sc.c_flags,
3420 sc.c_code,
3421 consts,
3422 names,
3423 varnames,
3424 filename,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003425 name,
3426 sc.c_firstlineno,
3427 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003428 Py_XDECREF(consts);
3429 Py_XDECREF(names);
3430 Py_XDECREF(varnames);
3431 Py_XDECREF(filename);
3432 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003433 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003434 else if (!PyErr_Occurred()) {
3435 /* This could happen if someone called PyErr_Clear() after an
3436 error was reported above. That's not supposed to happen,
3437 but I just plugged one case and I'm not sure there can't be
3438 others. In that case, raise SystemError so that at least
3439 it gets reported instead dumping core. */
3440 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3441 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003442 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003443 return co;
3444}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003445
3446int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003447PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003448{
3449 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003450 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003451 int line = co->co_firstlineno;
3452 int addr = 0;
3453 while (--size >= 0) {
3454 addr += *p++;
3455 if (addr > addrq)
3456 break;
3457 line += *p++;
3458 }
3459 return line;
3460}