blob: f239bb6a8b70e9cd91009023a52e5367359ef5e5 [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{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001046 /* listmaker: test list_for */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001047 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);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001055 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001056 com_addopnamestr(c, DELETE_NAME, tmpname);
1057 --c->c_tmpname;
1058}
1059
1060static void
1061com_listmaker(struct compiling *c, node *n)
1062{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001063 /* listmaker: test ( list_for | (',' test)* [','] ) */
1064 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
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{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002050 int i = 1;
2051 node* stream = NULL;
2052
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002053 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002054
2055 /* are we using the extended print form? */
2056 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2057 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002058 com_node(c, stream);
2059 /* stack: [...] => [... stream] */
2060 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002061 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2062 i = 4;
2063 else
2064 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002065 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002066 for (; i < NCH(n); i += 2) {
2067 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002068 com_addbyte(c, DUP_TOP);
2069 /* stack: [stream] => [stream stream] */
2070 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002071 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002072 /* stack: [stream stream] => [stream stream obj] */
2073 com_addbyte(c, ROT_TWO);
2074 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002075 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002076 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002077 com_pop(c, 2);
2078 }
2079 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002080 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002081 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002082 com_addbyte(c, PRINT_ITEM);
2083 com_pop(c, 1);
2084 }
2085 }
2086 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002087 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002088 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002089 /* must pop the extra stream object off the stack */
2090 com_addbyte(c, POP_TOP);
2091 /* stack: [... stream] => [...] */
2092 com_pop(c, 1);
2093 }
2094 }
2095 else {
2096 if (stream != NULL) {
2097 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002098 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002099 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002100 com_pop(c, 1);
2101 }
2102 else
2103 com_addbyte(c, PRINT_NEWLINE);
2104 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002105}
2106
2107static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002108com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002109{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002110 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002111 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002112 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002113 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002114 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002115 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002116 com_push(c, 1);
2117 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002118 else
2119 com_node(c, CHILD(n, 1));
2120 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002121 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002122}
2123
2124static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002125com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002126{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002127 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002128 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2129 if (NCH(n) > 1) {
2130 com_node(c, CHILD(n, 1));
2131 if (NCH(n) > 3) {
2132 com_node(c, CHILD(n, 3));
2133 if (NCH(n) > 5)
2134 com_node(c, CHILD(n, 5));
2135 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002136 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002137 i = NCH(n)/2;
2138 com_addoparg(c, RAISE_VARARGS, i);
2139 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002140}
2141
2142static void
Thomas Wouters52152252000-08-17 22:55:00 +00002143com_from_import(struct compiling *c, node *n)
2144{
2145 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2146 com_push(c, 1);
2147 if (NCH(n) > 1) {
2148 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2149 com_error(c, PyExc_SyntaxError, "invalid syntax");
2150 return;
2151 }
2152 com_addopname(c, STORE_NAME, CHILD(n, 2));
2153 } else
2154 com_addopname(c, STORE_NAME, CHILD(n, 0));
2155 com_pop(c, 1);
2156}
2157
2158static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002159com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002160{
2161 int i;
2162 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002163 /* 'import' dotted_name (',' dotted_name)* |
2164 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002165 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002166 /* 'from' dotted_name 'import' ... */
2167 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002168 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002169 com_push(c, 1);
Thomas Wouters52152252000-08-17 22:55:00 +00002170 if (TYPE(CHILD(n, 3)) == STAR)
2171 com_addbyte(c, IMPORT_STAR);
2172 else {
2173 for (i = 3; i < NCH(n); i += 2)
2174 com_from_import(c, CHILD(n, i));
2175 com_addbyte(c, POP_TOP);
2176 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002177 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002178 }
2179 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002180 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002181 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002182 node *subn = CHILD(n, i);
2183 REQ(subn, dotted_as_name);
2184 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002185 com_push(c, 1);
Thomas Wouters52152252000-08-17 22:55:00 +00002186 if (NCH(subn) > 1) {
Thomas Wouters8bad6122000-08-19 20:55:02 +00002187 if (strcmp(STR(CHILD(subn, 1)), "as") != 0 ||
2188 NCH(CHILD(subn, 0)) > 1) {
Thomas Wouters52152252000-08-17 22:55:00 +00002189 com_error(c, PyExc_SyntaxError,
2190 "invalid syntax");
2191 return;
2192 }
2193 com_addopname(c, STORE_NAME, CHILD(subn, 2));
2194 } else
2195 com_addopname(c, STORE_NAME,
2196 CHILD(CHILD(subn, 0),0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002197 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002198 }
2199 }
2200}
2201
2202static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002203com_global_stmt(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002204{
2205 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002206 REQ(n, global_stmt);
2207 /* 'global' NAME (',' NAME)* */
2208 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002209 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002210#ifdef PRIVATE_NAME_MANGLING
2211 char buffer[256];
2212 if (s != NULL && s[0] == '_' && s[1] == '_' &&
2213 c->c_private != NULL &&
Guido van Rossum582acec2000-06-28 22:07:35 +00002214 com_mangle(c, s, buffer, sizeof(buffer)))
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002215 s = buffer;
2216#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +00002217 if (PyDict_GetItemString(c->c_locals, s) != NULL) {
2218 com_error(c, PyExc_SyntaxError,
2219 "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002220 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002221 else if (PyDict_SetItemString(c->c_globals, s, Py_None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002222 c->c_errors++;
2223 }
2224}
2225
Guido van Rossum681d79a1995-07-18 14:51:37 +00002226static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002227com_newlocal_o(struct compiling *c, PyObject *nameval)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002228{
2229 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002230 PyObject *ival;
2231 if (PyList_Size(c->c_varnames) != c->c_nlocals) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002232 /* This is usually caused by an error on a previous call */
2233 if (c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002234 com_error(c, PyExc_SystemError,
2235 "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002236 }
2237 return 0;
2238 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002239 ival = PyInt_FromLong(i = c->c_nlocals++);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002240 if (ival == NULL)
2241 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002242 else if (PyDict_SetItem(c->c_locals, nameval, ival) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002243 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002244 else if (PyList_Append(c->c_varnames, nameval) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002245 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002246 Py_XDECREF(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002247 return i;
2248}
2249
2250static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002251com_addlocal_o(struct compiling *c, PyObject *nameval)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002252{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002253 PyObject *ival = PyDict_GetItem(c->c_locals, nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002254 if (ival != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002255 return PyInt_AsLong(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002256 return com_newlocal_o(c, nameval);
2257}
2258
2259static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002260com_newlocal(struct compiling *c, char *name)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002261{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002262 PyObject *nameval = PyString_InternFromString(name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002263 int i;
2264 if (nameval == NULL) {
2265 c->c_errors++;
2266 return 0;
2267 }
2268 i = com_newlocal_o(c, nameval);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002269 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002270 return i;
2271}
2272
Guido van Rossumc5e96291991-12-10 13:53:51 +00002273static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002274com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002275{
2276 REQ(n, exec_stmt);
2277 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2278 com_node(c, CHILD(n, 1));
2279 if (NCH(n) >= 4)
2280 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002281 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002282 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002283 com_push(c, 1);
2284 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002285 if (NCH(n) >= 6)
2286 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002287 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002288 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002289 com_push(c, 1);
2290 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002291 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002292 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002293}
2294
Guido van Rossum7c531111997-03-11 18:42:21 +00002295static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002296is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002297{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002298 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002299 int i;
2300
2301 /* Label to avoid tail recursion */
2302 next:
2303 switch (TYPE(n)) {
2304
2305 case suite:
2306 if (NCH(n) == 1) {
2307 n = CHILD(n, 0);
2308 goto next;
2309 }
2310 /* Fall through */
2311 case file_input:
2312 for (i = 0; i < NCH(n); i++) {
2313 node *ch = CHILD(n, i);
2314 if (TYPE(ch) == stmt) {
2315 n = ch;
2316 goto next;
2317 }
2318 }
2319 break;
2320
2321 case stmt:
2322 case simple_stmt:
2323 case small_stmt:
2324 n = CHILD(n, 0);
2325 goto next;
2326
2327 case expr_stmt:
2328 case testlist:
2329 case test:
2330 case and_test:
2331 case not_test:
2332 case comparison:
2333 case expr:
2334 case xor_expr:
2335 case and_expr:
2336 case shift_expr:
2337 case arith_expr:
2338 case term:
2339 case factor:
2340 case power:
2341 case atom:
2342 if (NCH(n) == 1) {
2343 n = CHILD(n, 0);
2344 goto next;
2345 }
2346 break;
2347
2348 case NAME:
2349 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2350 return 1;
2351 break;
2352
2353 case NUMBER:
2354 v = parsenumber(c, STR(n));
2355 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002356 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002357 break;
2358 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002359 i = PyObject_IsTrue(v);
2360 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002361 return i == 0;
2362
2363 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002364 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002365 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002366 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002367 break;
2368 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002369 i = PyObject_IsTrue(v);
2370 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002371 return i == 0;
2372
2373 }
2374 return 0;
2375}
2376
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002377static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002378com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002379{
2380 int i;
2381 int anchor = 0;
2382 REQ(n, if_stmt);
2383 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2384 for (i = 0; i+3 < NCH(n); i+=4) {
2385 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002386 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002387 if (is_constant_false(c, ch))
2388 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002389 if (i > 0)
2390 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002391 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002392 com_addfwref(c, JUMP_IF_FALSE, &a);
2393 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002394 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002395 com_node(c, CHILD(n, i+3));
2396 com_addfwref(c, JUMP_FORWARD, &anchor);
2397 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002398 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002399 com_addbyte(c, POP_TOP);
2400 }
2401 if (i+2 < NCH(n))
2402 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002403 if (anchor)
2404 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002405}
2406
2407static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002408com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002409{
2410 int break_anchor = 0;
2411 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002412 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002413 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2414 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002415 block_push(c, SETUP_LOOP);
2416 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002417 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002418 com_node(c, CHILD(n, 1));
2419 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2420 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002421 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002422 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002423 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002424 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002425 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2426 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002427 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002428 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002429 com_addbyte(c, POP_TOP);
2430 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002431 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002432 if (NCH(n) > 4)
2433 com_node(c, CHILD(n, 6));
2434 com_backpatch(c, break_anchor);
2435}
2436
2437static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002438com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002439{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002440 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002441 int break_anchor = 0;
2442 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002443 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002444 REQ(n, for_stmt);
2445 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2446 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002447 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002448 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002449 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002450 if (v == NULL)
2451 c->c_errors++;
2452 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002453 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002454 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002455 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002456 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002457 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002458 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002459 com_assign(c, CHILD(n, 1), OP_ASSIGN);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002460 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002461 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002462 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002463 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2464 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002465 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002466 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002467 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002468 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002469 if (NCH(n) > 8)
2470 com_node(c, CHILD(n, 8));
2471 com_backpatch(c, break_anchor);
2472}
2473
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002474/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002475
2476 SETUP_FINALLY L
2477 <code for S>
2478 POP_BLOCK
2479 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002480 L: <code for Sf>
2481 END_FINALLY
2482
2483 The special instructions use the block stack. Each block
2484 stack entry contains the instruction that created it (here
2485 SETUP_FINALLY), the level of the value stack at the time the
2486 block stack entry was created, and a label (here L).
2487
2488 SETUP_FINALLY:
2489 Pushes the current value stack level and the label
2490 onto the block stack.
2491 POP_BLOCK:
2492 Pops en entry from the block stack, and pops the value
2493 stack until its level is the same as indicated on the
2494 block stack. (The label is ignored.)
2495 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002496 Pops a variable number of entries from the *value* stack
2497 and re-raises the exception they specify. The number of
2498 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002499
2500 The block stack is unwound when an exception is raised:
2501 when a SETUP_FINALLY entry is found, the exception is pushed
2502 onto the value stack (and the exception condition is cleared),
2503 and the interpreter jumps to the label gotten from the block
2504 stack.
2505
2506 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002507 (The contents of the value stack is shown in [], with the top
2508 at the right; 'tb' is trace-back info, 'val' the exception's
2509 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002510
2511 Value stack Label Instruction Argument
2512 [] SETUP_EXCEPT L1
2513 [] <code for S>
2514 [] POP_BLOCK
2515 [] JUMP_FORWARD L0
2516
Guido van Rossum3f5da241990-12-20 15:06:42 +00002517 [tb, val, exc] L1: DUP )
2518 [tb, val, exc, exc] <evaluate E1> )
2519 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2520 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2521 [tb, val, exc, 1] POP )
2522 [tb, val, exc] POP
2523 [tb, val] <assign to V1> (or POP if no V1)
2524 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002525 [] <code for S1>
2526 JUMP_FORWARD L0
2527
Guido van Rossum3f5da241990-12-20 15:06:42 +00002528 [tb, val, exc, 0] L2: POP
2529 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002530 .............................etc.......................
2531
Guido van Rossum3f5da241990-12-20 15:06:42 +00002532 [tb, val, exc, 0] Ln+1: POP
2533 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002534
2535 [] L0: <next statement>
2536
2537 Of course, parts are not generated if Vi or Ei is not present.
2538*/
2539
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002540static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002541com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002542{
2543 int except_anchor = 0;
2544 int end_anchor = 0;
2545 int else_anchor = 0;
2546 int i;
2547 node *ch;
2548
2549 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2550 block_push(c, SETUP_EXCEPT);
2551 com_node(c, CHILD(n, 2));
2552 com_addbyte(c, POP_BLOCK);
2553 block_pop(c, SETUP_EXCEPT);
2554 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2555 com_backpatch(c, except_anchor);
2556 for (i = 3;
2557 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2558 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002559 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002560 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002561 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002562 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002563 break;
2564 }
2565 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002566 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002567 com_addoparg(c, SET_LINENO, ch->n_lineno);
2568 if (NCH(ch) > 1) {
2569 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002570 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002571 com_node(c, CHILD(ch, 1));
2572 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002573 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002574 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2575 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002576 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002577 }
2578 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002579 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002580 if (NCH(ch) > 3)
Guido van Rossum8861b741996-07-30 16:49:37 +00002581 com_assign(c, CHILD(ch, 3), OP_ASSIGN);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002582 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002583 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002584 com_pop(c, 1);
2585 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002586 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002587 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002588 com_node(c, CHILD(n, i+2));
2589 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2590 if (except_anchor) {
2591 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002592 /* We come in with [tb, val, exc, 0] on the
2593 stack; one pop and it's the same as
2594 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002595 com_addbyte(c, POP_TOP);
2596 }
2597 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002598 /* We actually come in here with [tb, val, exc] but the
2599 END_FINALLY will zap those and jump around.
2600 The c_stacklevel does not reflect them so we need not pop
2601 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002602 com_addbyte(c, END_FINALLY);
2603 com_backpatch(c, else_anchor);
2604 if (i < NCH(n))
2605 com_node(c, CHILD(n, i+2));
2606 com_backpatch(c, end_anchor);
2607}
2608
2609static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002610com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002611{
2612 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002613 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002614
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002615 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2616 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002617 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002618 com_addbyte(c, POP_BLOCK);
2619 block_pop(c, SETUP_FINALLY);
2620 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002621 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002622 /* While the generated code pushes only one item,
2623 the try-finally handling can enter here with
2624 up to three items. OK, here are the details:
2625 3 for an exception, 2 for RETURN, 1 for BREAK. */
2626 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002627 com_backpatch(c, finally_anchor);
2628 ch = CHILD(n, NCH(n)-1);
2629 com_addoparg(c, SET_LINENO, ch->n_lineno);
2630 com_node(c, ch);
2631 com_addbyte(c, END_FINALLY);
2632 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002633 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002634}
2635
2636static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002637com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002638{
2639 REQ(n, try_stmt);
2640 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2641 | 'try' ':' suite 'finally' ':' suite */
2642 if (TYPE(CHILD(n, 3)) != except_clause)
2643 com_try_finally(c, n);
2644 else
2645 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002646}
2647
Guido van Rossum8b993a91997-01-17 21:04:03 +00002648static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002649get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002650{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002651 int i;
2652
Guido van Rossum8b993a91997-01-17 21:04:03 +00002653 /* Label to avoid tail recursion */
2654 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002655 switch (TYPE(n)) {
2656
2657 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002658 if (NCH(n) == 1) {
2659 n = CHILD(n, 0);
2660 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002661 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002662 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002663 case file_input:
2664 for (i = 0; i < NCH(n); i++) {
2665 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002666 if (TYPE(ch) == stmt) {
2667 n = ch;
2668 goto next;
2669 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002670 }
2671 break;
2672
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002673 case stmt:
2674 case simple_stmt:
2675 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002676 n = CHILD(n, 0);
2677 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002678
2679 case expr_stmt:
2680 case testlist:
2681 case test:
2682 case and_test:
2683 case not_test:
2684 case comparison:
2685 case expr:
2686 case xor_expr:
2687 case and_expr:
2688 case shift_expr:
2689 case arith_expr:
2690 case term:
2691 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002692 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002693 if (NCH(n) == 1) {
2694 n = CHILD(n, 0);
2695 goto next;
2696 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002697 break;
2698
2699 case atom:
2700 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002701 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002702 break;
2703
2704 }
2705 return NULL;
2706}
2707
Guido van Rossum79f25d91997-04-29 20:08:16 +00002708static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002709get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002710{
Guido van Rossum541563e1999-01-28 15:08:09 +00002711 /* Don't generate doc-strings if run with -OO */
2712 if (Py_OptimizeFlag > 1)
2713 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002714 n = get_rawdocstring(n);
2715 if (n == NULL)
2716 return NULL;
2717 return parsestrplus(n);
2718}
2719
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002720static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002721com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002722{
2723 REQ(n, suite);
2724 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2725 if (NCH(n) == 1) {
2726 com_node(c, CHILD(n, 0));
2727 }
2728 else {
2729 int i;
2730 for (i = 0; i < NCH(n); i++) {
2731 node *ch = CHILD(n, i);
2732 if (TYPE(ch) == stmt)
2733 com_node(c, ch);
2734 }
2735 }
2736}
2737
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002738/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002739static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002740com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002741{
2742 int i = c->c_nblocks;
2743 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2744 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2745 }
2746 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002747 com_error(c, PyExc_SyntaxError,
2748 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002749 }
2750 /* XXX Could allow it inside a 'finally' clause
2751 XXX if we could pop the exception still on the stack */
2752}
2753
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002754static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002755com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002756{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002757 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002758 if (TYPE(n) == lambdef) {
2759 /* lambdef: 'lambda' [varargslist] ':' test */
2760 n = CHILD(n, 1);
2761 }
2762 else {
2763 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2764 n = CHILD(n, 2);
2765 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2766 n = CHILD(n, 1);
2767 }
2768 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002769 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002770 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002771 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002772 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2773 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002774 nargs = 0;
2775 ndefs = 0;
2776 for (i = 0; i < nch; i++) {
2777 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002778 if (TYPE(CHILD(n, i)) == STAR ||
2779 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002780 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002781 nargs++;
2782 i++;
2783 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002784 t = RPAR; /* Anything except EQUAL or COMMA */
2785 else
2786 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002787 if (t == EQUAL) {
2788 i++;
2789 ndefs++;
2790 com_node(c, CHILD(n, i));
2791 i++;
2792 if (i >= nch)
2793 break;
2794 t = TYPE(CHILD(n, i));
2795 }
2796 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00002797 /* Treat "(a=1, b)" as an error */
2798 if (ndefs)
2799 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00002800 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002801 }
2802 if (t != COMMA)
2803 break;
2804 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002805 return ndefs;
2806}
2807
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002808static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002809com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002810{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002811 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002812 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002813 v = (PyObject *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002814 if (v == NULL)
2815 c->c_errors++;
2816 else {
2817 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002818 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002819 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002820 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002821 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002822 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002823 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002824 com_pop(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002825 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002826 }
2827}
2828
2829static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002830com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002831{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002832 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002833 REQ(n, testlist);
2834 /* testlist: test (',' test)* [','] */
2835 for (i = 0; i < NCH(n); i += 2)
2836 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002837 i = (NCH(n)+1) / 2;
2838 com_addoparg(c, BUILD_TUPLE, i);
2839 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00002840}
2841
2842static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002843com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002844{
Guido van Rossum25831651993-05-19 14:50:45 +00002845 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002846 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002847 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002848 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00002849 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00002850 c->c_errors++;
2851 return;
2852 }
2853 /* Push the class name on the stack */
2854 i = com_addconst(c, v);
2855 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002856 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002857 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00002858 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002859 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00002860 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002861 com_push(c, 1);
2862 }
Guido van Rossum25831651993-05-19 14:50:45 +00002863 else
2864 com_bases(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002865 v = (PyObject *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002866 if (v == NULL)
2867 c->c_errors++;
2868 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002869 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002870 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002871 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002872 com_addoparg(c, MAKE_FUNCTION, 0);
2873 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002874 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002875 com_pop(c, 2);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002876 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002877 Py_DECREF(v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002878 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002879}
2880
2881static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002882com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002883{
2884 switch (TYPE(n)) {
2885
2886 /* Definition nodes */
2887
2888 case funcdef:
2889 com_funcdef(c, n);
2890 break;
2891 case classdef:
2892 com_classdef(c, n);
2893 break;
2894
2895 /* Trivial parse tree nodes */
2896
2897 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002898 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002899 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002900 com_node(c, CHILD(n, 0));
2901 break;
2902
2903 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002904 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2905 com_addoparg(c, SET_LINENO, n->n_lineno);
2906 {
2907 int i;
2908 for (i = 0; i < NCH(n)-1; i += 2)
2909 com_node(c, CHILD(n, i));
2910 }
2911 break;
2912
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002913 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002914 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002915 com_node(c, CHILD(n, 0));
2916 break;
2917
2918 /* Statement nodes */
2919
2920 case expr_stmt:
2921 com_expr_stmt(c, n);
2922 break;
2923 case print_stmt:
2924 com_print_stmt(c, n);
2925 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002926 case del_stmt: /* 'del' exprlist */
Guido van Rossum8861b741996-07-30 16:49:37 +00002927 com_assign(c, CHILD(n, 1), OP_DELETE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002928 break;
2929 case pass_stmt:
2930 break;
2931 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002932 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002933 com_error(c, PyExc_SyntaxError,
2934 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002935 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002936 com_addbyte(c, BREAK_LOOP);
2937 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002938 case continue_stmt:
2939 com_continue_stmt(c, n);
2940 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002941 case return_stmt:
2942 com_return_stmt(c, n);
2943 break;
2944 case raise_stmt:
2945 com_raise_stmt(c, n);
2946 break;
2947 case import_stmt:
2948 com_import_stmt(c, n);
2949 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002950 case global_stmt:
2951 com_global_stmt(c, n);
2952 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002953 case exec_stmt:
2954 com_exec_stmt(c, n);
2955 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002956 case assert_stmt:
2957 com_assert_stmt(c, n);
2958 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002959 case if_stmt:
2960 com_if_stmt(c, n);
2961 break;
2962 case while_stmt:
2963 com_while_stmt(c, n);
2964 break;
2965 case for_stmt:
2966 com_for_stmt(c, n);
2967 break;
2968 case try_stmt:
2969 com_try_stmt(c, n);
2970 break;
2971 case suite:
2972 com_suite(c, n);
2973 break;
2974
2975 /* Expression nodes */
2976
2977 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002978 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002979 break;
2980 case test:
2981 com_test(c, n);
2982 break;
2983 case and_test:
2984 com_and_test(c, n);
2985 break;
2986 case not_test:
2987 com_not_test(c, n);
2988 break;
2989 case comparison:
2990 com_comparison(c, n);
2991 break;
2992 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002993 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002994 break;
2995 case expr:
2996 com_expr(c, n);
2997 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002998 case xor_expr:
2999 com_xor_expr(c, n);
3000 break;
3001 case and_expr:
3002 com_and_expr(c, n);
3003 break;
3004 case shift_expr:
3005 com_shift_expr(c, n);
3006 break;
3007 case arith_expr:
3008 com_arith_expr(c, n);
3009 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003010 case term:
3011 com_term(c, n);
3012 break;
3013 case factor:
3014 com_factor(c, n);
3015 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003016 case power:
3017 com_power(c, n);
3018 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003019 case atom:
3020 com_atom(c, n);
3021 break;
3022
3023 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003024 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003025 com_error(c, PyExc_SystemError,
3026 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003027 }
3028}
3029
Tim Petersdbd9ba62000-07-09 03:09:57 +00003030static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003031
3032static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003033com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003034{
3035 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3036 if (TYPE(CHILD(n, 0)) == LPAR)
3037 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003038 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003039 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003040 com_pop(c, 1);
3041 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003042}
3043
3044static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003045com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003046{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003047 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003048 if (NCH(n) == 1) {
3049 com_fpdef(c, CHILD(n, 0));
3050 }
3051 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003052 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003053 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003054 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003055 for (i = 0; i < NCH(n); i += 2)
3056 com_fpdef(c, CHILD(n, i));
3057 }
3058}
3059
3060static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003061com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003062{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003063 int nch, i;
3064 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003065 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003066 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003067 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003068 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003069 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003070 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003071 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003072 node *ch = CHILD(n, i);
3073 node *fp;
3074 char *name;
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003075 PyObject *nameval;
Guido van Rossum50564e81996-01-12 01:13:16 +00003076 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003077 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003078 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3079 fp = CHILD(ch, 0);
3080 if (TYPE(fp) == NAME)
3081 name = STR(fp);
3082 else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003083 name = nbuf;
3084 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003085 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003086 }
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003087 nameval = PyString_InternFromString(name);
3088 if (nameval == NULL) {
3089 c->c_errors++;
3090 }
Peter Schneider-Kamp9a5086c2000-07-13 06:24:29 +00003091 if (PyDict_GetItem(c->c_locals, nameval)) {
Fred Drakedcf08e02000-08-15 15:49:44 +00003092 com_error(c, PyExc_SyntaxError,
3093 "duplicate argument in function definition");
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003094 }
3095 com_newlocal_o(c, nameval);
3096 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003097 c->c_argcount++;
3098 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003099 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003100 ch = CHILD(n, i);
3101 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003102 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003103 else
3104 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003105 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003106 /* Handle *arguments */
3107 if (i < nch) {
3108 node *ch;
3109 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003110 if (TYPE(ch) != DOUBLESTAR) {
3111 REQ(ch, STAR);
3112 ch = CHILD(n, i+1);
3113 if (TYPE(ch) == NAME) {
3114 c->c_flags |= CO_VARARGS;
3115 i += 3;
3116 com_newlocal(c, STR(ch));
3117 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003118 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003119 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003120 /* Handle **keywords */
3121 if (i < nch) {
3122 node *ch;
3123 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003124 if (TYPE(ch) != DOUBLESTAR) {
3125 REQ(ch, STAR);
3126 ch = CHILD(n, i+1);
3127 REQ(ch, STAR);
3128 ch = CHILD(n, i+2);
3129 }
3130 else
3131 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003132 REQ(ch, NAME);
3133 c->c_flags |= CO_VARKEYWORDS;
3134 com_newlocal(c, STR(ch));
3135 }
3136 if (complex) {
3137 /* Generate code for complex arguments only after
3138 having counted the simple arguments */
3139 int ilocal = 0;
3140 for (i = 0; i < nch; i++) {
3141 node *ch = CHILD(n, i);
3142 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003143 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003144 break;
3145 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3146 fp = CHILD(ch, 0);
3147 if (TYPE(fp) != NAME) {
3148 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003149 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003150 com_fpdef(c, ch);
3151 }
3152 ilocal++;
3153 if (++i >= nch)
3154 break;
3155 ch = CHILD(n, i);
3156 if (TYPE(ch) == EQUAL)
3157 i += 2;
3158 else
3159 REQ(ch, COMMA);
3160 }
3161 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003162}
3163
3164static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003165com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003166{
3167 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003168 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003169 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003170 doc = get_docstring(n);
3171 if (doc != NULL) {
3172 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003173 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003174 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003175 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003176 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003177 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003178 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003179 for (i = 0; i < NCH(n); i++) {
3180 node *ch = CHILD(n, i);
3181 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3182 com_node(c, ch);
3183 }
3184}
3185
3186/* Top-level compile-node interface */
3187
3188static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003189compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003190{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003191 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003192 node *ch;
3193 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003194 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003195 doc = get_docstring(CHILD(n, 4));
3196 if (doc != NULL) {
3197 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003198 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003199 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003200 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003201 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003202 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3203 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003204 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003205 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003206 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003207 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003208 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003209 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003210 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003211 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003212 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003213}
3214
3215static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003216compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003217{
Guido van Rossum590baa41993-11-30 13:40:46 +00003218 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003219 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003220 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003221
3222 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003223 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003224 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003225 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003226 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003227 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003228 else
3229 ch = CHILD(n, 2);
3230 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003231 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003232 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003233}
3234
3235static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003236compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003237{
3238 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003239 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003240 REQ(n, classdef);
3241 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3242 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003243#ifdef PRIVATE_NAME_MANGLING
3244 c->c_private = c->c_name;
3245#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003246 ch = CHILD(n, NCH(n)-1); /* The suite */
3247 doc = get_docstring(ch);
3248 if (doc != NULL) {
3249 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003250 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003251 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003252 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003253 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003254 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003255 }
3256 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003257 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003258 com_node(c, ch);
3259 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003260 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003261 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003262 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003263}
3264
3265static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003266compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003267{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003268 com_addoparg(c, SET_LINENO, n->n_lineno);
3269
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003270 switch (TYPE(n)) {
3271
Guido van Rossum4c417781991-01-21 16:09:22 +00003272 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003273 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003274 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003275 n = CHILD(n, 0);
3276 if (TYPE(n) != NEWLINE)
3277 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003278 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003279 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003280 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003281 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003282 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003283 break;
3284
Guido van Rossum4c417781991-01-21 16:09:22 +00003285 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003286 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003287 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003288 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003289 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003290 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003291 break;
3292
Guido van Rossum590baa41993-11-30 13:40:46 +00003293 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003294 com_node(c, CHILD(n, 0));
3295 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003296 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003297 break;
3298
Guido van Rossum590baa41993-11-30 13:40:46 +00003299 case lambdef: /* anonymous function definition */
3300 compile_lambdef(c, n);
3301 break;
3302
Guido van Rossum4c417781991-01-21 16:09:22 +00003303 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003304 compile_funcdef(c, n);
3305 break;
3306
Guido van Rossum4c417781991-01-21 16:09:22 +00003307 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003308 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003309 break;
3310
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003311 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003312 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003313 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003314 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003315 }
3316}
3317
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003318/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00003319
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003320 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
3321 instructions that refer to local variables with LOAD_FAST etc.
3322 The latter instructions are much faster because they don't need to
3323 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003324
Guido van Rossum681d79a1995-07-18 14:51:37 +00003325 To find all local variables, we check all STORE_NAME, IMPORT_FROM
3326 and DELETE_NAME instructions. This yields all local variables,
3327 function definitions, class definitions and import statements.
3328 Argument names have already been entered into the list by the
3329 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003330
3331 All remaining LOAD_NAME instructions must refer to non-local (global
3332 or builtin) variables, so are replaced by LOAD_GLOBAL.
3333
3334 There are two problems: 'from foo import *' and 'exec' may introduce
3335 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00003336 case, we can still optimize bona fide locals (since those
3337 statements will be surrounded by fast_2_locals() and
3338 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003339
Guido van Rossum681d79a1995-07-18 14:51:37 +00003340 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00003341
3342static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003343optimize(struct compiling *c)
Guido van Rossum282914b1991-04-04 10:42:56 +00003344{
Guido van Rossum0a697f61991-04-16 08:39:12 +00003345 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00003346 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00003347 int oparg = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003348 PyObject *name;
3349 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003350
Guido van Rossum282914b1991-04-04 10:42:56 +00003351#define NEXTOP() (*next_instr++)
3352#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossum79f25d91997-04-29 20:08:16 +00003353#define GETITEM(v, i) (PyList_GetItem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003354#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
3355
Guido van Rossum79f25d91997-04-29 20:08:16 +00003356 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003357
3358 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00003359
Guido van Rossum79f25d91997-04-29 20:08:16 +00003360 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003361 for (;;) {
3362 opcode = NEXTOP();
3363 if (opcode == STOP_CODE)
3364 break;
3365 if (HAS_ARG(opcode))
3366 oparg = NEXTARG();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003367 switch (opcode) {
3368 case STORE_NAME:
3369 case DELETE_NAME:
3370 case IMPORT_FROM:
3371 com_addlocal_o(c, GETNAMEOBJ(oparg));
3372 break;
Thomas Wouters52152252000-08-17 22:55:00 +00003373 case IMPORT_STAR:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003374 case EXEC_STMT:
3375 c->c_flags &= ~CO_OPTIMIZED;
3376 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00003377 }
3378 }
3379
Thomas Wouters52152252000-08-17 22:55:00 +00003380 /* TBD: Is this still necessary ? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003381 if (PyDict_GetItemString(c->c_locals, "*") != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003382 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003383
Guido van Rossum79f25d91997-04-29 20:08:16 +00003384 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003385 for (;;) {
3386 cur_instr = next_instr;
3387 opcode = NEXTOP();
3388 if (opcode == STOP_CODE)
3389 break;
3390 if (HAS_ARG(opcode))
3391 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003392 if (opcode == LOAD_NAME ||
3393 opcode == STORE_NAME ||
3394 opcode == DELETE_NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003395 PyObject *v;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003396 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00003397 name = GETNAMEOBJ(oparg);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003398 v = PyDict_GetItem(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003399 if (v == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003400 if (opcode == LOAD_NAME &&
3401 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003402 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003403 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00003404 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003405 i = PyInt_AsLong(v);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003406 switch (opcode) {
3407 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
3408 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
3409 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
3410 }
3411 cur_instr[1] = i & 0xff;
3412 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00003413 }
3414 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003415
Guido van Rossum681d79a1995-07-18 14:51:37 +00003416 if (c->c_errors == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00003417 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00003418}
3419
Guido van Rossum79f25d91997-04-29 20:08:16 +00003420PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003421PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003422{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003423 return jcompile(n, filename, NULL);
3424}
3425
Guido van Rossum79f25d91997-04-29 20:08:16 +00003426static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003427icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003428{
3429 return jcompile(n, base->c_filename, base);
3430}
3431
Guido van Rossum79f25d91997-04-29 20:08:16 +00003432static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003433jcompile(node *n, char *filename, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003434{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003435 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003436 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003437 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003438 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003439#ifdef PRIVATE_NAME_MANGLING
3440 if (base)
3441 sc.c_private = base->c_private;
3442 else
3443 sc.c_private = NULL;
3444#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003445 compile_node(&sc, n);
3446 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003447 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003448 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003449 sc.c_flags |= CO_NEWLOCALS;
3450 }
3451 else if (TYPE(n) == classdef)
3452 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00003453 co = NULL;
3454 if (sc.c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003455 PyObject *consts, *names, *varnames, *filename, *name;
3456 consts = PyList_AsTuple(sc.c_consts);
3457 names = PyList_AsTuple(sc.c_names);
3458 varnames = PyList_AsTuple(sc.c_varnames);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003459 filename = PyString_InternFromString(sc.c_filename);
3460 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003461 if (!PyErr_Occurred())
3462 co = PyCode_New(sc.c_argcount,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003463 sc.c_nlocals,
Guido van Rossum8b993a91997-01-17 21:04:03 +00003464 sc.c_maxstacklevel,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003465 sc.c_flags,
3466 sc.c_code,
3467 consts,
3468 names,
3469 varnames,
3470 filename,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003471 name,
3472 sc.c_firstlineno,
3473 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003474 Py_XDECREF(consts);
3475 Py_XDECREF(names);
3476 Py_XDECREF(varnames);
3477 Py_XDECREF(filename);
3478 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003479 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003480 else if (!PyErr_Occurred()) {
3481 /* This could happen if someone called PyErr_Clear() after an
3482 error was reported above. That's not supposed to happen,
3483 but I just plugged one case and I'm not sure there can't be
3484 others. In that case, raise SystemError so that at least
3485 it gets reported instead dumping core. */
3486 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3487 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003488 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003489 return co;
3490}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003491
3492int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003493PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003494{
3495 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003496 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003497 int line = co->co_firstlineno;
3498 int addr = 0;
3499 while (--size >= 0) {
3500 addr += *p++;
3501 if (addr > addrq)
3502 break;
3503 line += *p++;
3504 }
3505 return line;
3506}