blob: e18f627dd83fff555d0e3f8a66f275db35bba3cc [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009******************************************************************/
10
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011/* Compile an expression node to intermediate code */
12
Guido van Rossum3f5da241990-12-20 15:06:42 +000013/* XXX TO DO:
Guido van Rossum8b993a91997-01-17 21:04:03 +000014 XXX add __doc__ attribute == co_doc to code object attributes?
15 XXX (it's currently the first item of the co_const tuple)
Guido van Rossum3f5da241990-12-20 15:06:42 +000016 XXX Generate simple jump for break/return outside 'try...finally'
Guido van Rossum8b993a91997-01-17 21:04:03 +000017 XXX Allow 'continue' inside try-finally
Guido van Rossum8b993a91997-01-17 21:04:03 +000018 XXX New opcode for loading the initial index for a for loop
Guido van Rossum681d79a1995-07-18 14:51:37 +000019 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000020*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000021
Guido van Rossum8ff077b1996-08-24 06:21:31 +000022#ifndef NO_PRIVATE_NAME_MANGLING
23#define PRIVATE_NAME_MANGLING
24#endif
25
Guido van Rossum79f25d91997-04-29 20:08:16 +000026#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000027
Guido van Rossum10dc2e81990-11-18 17:27:39 +000028#include "node.h"
29#include "token.h"
30#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000031#include "compile.h"
32#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000033#include "structmember.h"
34
35#include <ctype.h>
Jack Jansen41aa8e52000-07-03 21:39:47 +000036#ifdef HAVE_LIMITS_H
37#include <limits.h>
38#endif
Guido van Rossum282914b1991-04-04 10:42:56 +000039
Guido van Rossumb05a5c71997-05-07 17:46:13 +000040/* Three symbols from graminit.h are also defined in Python.h, with
41 Py_ prefixes to their names. Python.h can't include graminit.h
42 (which defines too many confusing symbols), but we can check here
43 that they haven't changed (which is very unlikely, but possible). */
44#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000045 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000046#endif
47#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000048 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000049#endif
50#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000051 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000052#endif
53
Guido van Rossum8e793d91997-03-03 19:13:14 +000054int Py_OptimizeFlag = 0;
55
Guido van Rossum8861b741996-07-30 16:49:37 +000056#define OP_DELETE 0
57#define OP_ASSIGN 1
58#define OP_APPLY 2
59
Guido van Rossum79f25d91997-04-29 20:08:16 +000060#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000061
62static struct memberlist code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000063 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
64 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000065 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000066 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000067 {"co_code", T_OBJECT, OFF(co_code), READONLY},
68 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
69 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000070 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000071 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000072 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000073 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
74 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000075 {NULL} /* Sentinel */
76};
77
Guido van Rossum79f25d91997-04-29 20:08:16 +000078static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000079code_getattr(PyCodeObject *co, char *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +000080{
Guido van Rossum79f25d91997-04-29 20:08:16 +000081 return PyMember_Get((char *)co, code_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +000082}
Guido van Rossum10dc2e81990-11-18 17:27:39 +000083
84static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000085code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +000086{
Guido van Rossum79f25d91997-04-29 20:08:16 +000087 Py_XDECREF(co->co_code);
88 Py_XDECREF(co->co_consts);
89 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +000090 Py_XDECREF(co->co_varnames);
Guido van Rossum79f25d91997-04-29 20:08:16 +000091 Py_XDECREF(co->co_filename);
92 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +000093 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +000094 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +000095}
96
Guido van Rossum79f25d91997-04-29 20:08:16 +000097static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000098code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +000099{
100 char buf[500];
101 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000102 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000103 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000104
Guido van Rossuma396a882000-04-07 01:21:36 +0000105 if (co->co_firstlineno != 0)
106 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000107 if (co->co_filename && PyString_Check(co->co_filename))
108 filename = PyString_AsString(co->co_filename);
109 if (co->co_name && PyString_Check(co->co_name))
110 name = PyString_AsString(co->co_name);
Fred Drake615ae552000-06-30 16:20:13 +0000111 sprintf(buf, "<code object %.100s at %p, file \"%.300s\", line %d>",
112 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000113 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000114}
115
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000116static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000117code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000118{
119 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000120 cmp = PyObject_Compare(co->co_name, cp->co_name);
121 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000122 cmp = co->co_argcount - cp->co_argcount;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000123 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000124 cmp = co->co_nlocals - cp->co_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000125 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000126 cmp = co->co_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000127 if (cmp) return cmp;
Guido van Rossumd076c731998-10-07 19:42:25 +0000128 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000129 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000130 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000131 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000132 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000133 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000134 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000135 return cmp;
136}
137
138static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000139code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000140{
Guido van Rossum44679592000-04-10 16:20:31 +0000141 long h, h0, h1, h2, h3, h4;
142 h0 = PyObject_Hash(co->co_name);
143 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000144 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000145 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000146 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000147 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000148 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000149 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000150 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000151 if (h4 == -1) return -1;
Guido van Rossum44679592000-04-10 16:20:31 +0000152 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000153 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000154 if (h == -1) h = -2;
155 return h;
156}
157
Guido van Rossum79f25d91997-04-29 20:08:16 +0000158PyTypeObject PyCode_Type = {
159 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000160 0,
161 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000162 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000163 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000164 (destructor)code_dealloc, /*tp_dealloc*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000165 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000166 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000167 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000168 (cmpfunc)code_compare, /*tp_compare*/
169 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000170 0, /*tp_as_number*/
171 0, /*tp_as_sequence*/
172 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000173 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000174};
175
Guido van Rossum644a12b1997-04-09 19:24:53 +0000176#define NAME_CHARS \
177 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
178
Guido van Rossum79f25d91997-04-29 20:08:16 +0000179PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000180PyCode_New(int argcount, int nlocals, int stacksize, int flags,
181 PyObject *code, PyObject *consts, PyObject *names,
182 PyObject *varnames, PyObject *filename, PyObject *name,
183 int firstlineno, PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000184{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000185 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000186 int i;
Guido van Rossumd076c731998-10-07 19:42:25 +0000187 PyBufferProcs *pb;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000188 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000189 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000190 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000191 consts == NULL || !PyTuple_Check(consts) ||
192 names == NULL || !PyTuple_Check(names) ||
193 varnames == NULL || !PyTuple_Check(varnames) ||
194 name == NULL || !PyString_Check(name) ||
195 filename == NULL || !PyString_Check(filename) ||
196 lnotab == NULL || !PyString_Check(lnotab)) {
197 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000198 return NULL;
199 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000200 pb = code->ob_type->tp_as_buffer;
201 if (pb == NULL ||
202 pb->bf_getreadbuffer == NULL ||
203 pb->bf_getsegcount == NULL ||
204 (*pb->bf_getsegcount)(code, NULL) != 1)
205 {
206 PyErr_BadInternalCall();
207 return NULL;
208 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000209 /* Make sure names and varnames are all strings, & intern them */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000210 for (i = PyTuple_Size(names); --i >= 0; ) {
211 PyObject *v = PyTuple_GetItem(names, i);
212 if (v == NULL || !PyString_Check(v)) {
213 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000214 return NULL;
215 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000216 PyString_InternInPlace(&PyTuple_GET_ITEM(names, i));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000217 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000218 for (i = PyTuple_Size(varnames); --i >= 0; ) {
219 PyObject *v = PyTuple_GetItem(varnames, i);
220 if (v == NULL || !PyString_Check(v)) {
221 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000222 return NULL;
223 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000224 PyString_InternInPlace(&PyTuple_GET_ITEM(varnames, i));
225 }
226 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000227 for (i = PyTuple_Size(consts); --i >= 0; ) {
228 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000229 char *p;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000230 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000231 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000232 p = PyString_AsString(v);
Guido van Rossum582acec2000-06-28 22:07:35 +0000233 if (strspn(p, NAME_CHARS)
234 != (size_t)PyString_Size(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000235 continue;
236 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000237 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000238 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000239 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000240 co->co_argcount = argcount;
241 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000242 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000243 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000245 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000246 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000247 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000248 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000249 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000250 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000251 co->co_varnames = varnames;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000252 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000253 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000254 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000255 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000256 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000257 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000258 co->co_lnotab = lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000259 }
260 return co;
261}
262
263
264/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000265
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000266struct compiling {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000267 PyObject *c_code; /* string */
268 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000269 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000270 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000271 PyObject *c_name_dict; /* inverse of c_names */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000272 PyObject *c_globals; /* dictionary (value=None) */
273 PyObject *c_locals; /* dictionary (value=localID) */
274 PyObject *c_varnames; /* list (inverse of c_locals) */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000275 int c_nlocals; /* index of next local */
276 int c_argcount; /* number of top-level arguments */
277 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000278 int c_nexti; /* index into c_code */
279 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000280 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000281 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000282 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000283 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000284 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000285 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000286 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000287 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000288 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000289 int c_stacklevel; /* Current stack level */
290 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000291 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000292 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000293 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000294#ifdef PRIVATE_NAME_MANGLING
295 char *c_private; /* for private name mangling */
296#endif
Skip Montanaro803d6e52000-08-12 18:09:51 +0000297 int c_tmpname; /* temporary local name counter */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000298};
299
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000300
Guido van Rossum452a9831996-09-17 14:32:04 +0000301/* Error message including line number */
302
303static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000304com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000305{
Guido van Rossum582acec2000-06-28 22:07:35 +0000306 size_t n = strlen(msg);
Fred Drakedcf08e02000-08-15 15:49:44 +0000307 PyObject *v, *tb, *tmp;
Guido van Rossum635abd21997-01-06 22:56:52 +0000308 c->c_errors++;
Guido van Rossum452a9831996-09-17 14:32:04 +0000309 if (c->c_lineno <= 1) {
310 /* Unknown line number or single interactive command */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000311 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000312 return;
313 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000314 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000315 if (v == NULL)
316 return; /* MemoryError, too bad */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000317 PyErr_SetObject(exc, v);
318 Py_DECREF(v);
Fred Drakedcf08e02000-08-15 15:49:44 +0000319
320 /* add attributes for the line number and filename for the error */
321 PyErr_Fetch(&exc, &v, &tb);
322 PyErr_NormalizeException(&exc, &v, &tb);
323 tmp = PyInt_FromLong(c->c_lineno);
324 if (tmp == NULL)
325 PyErr_Clear();
326 else {
327 if (PyObject_SetAttrString(v, "lineno", tmp))
328 PyErr_Clear();
329 Py_DECREF(tmp);
330 }
331 if (c->c_filename != NULL) {
332 tmp = PyString_FromString(c->c_filename);
333 if (tmp == NULL)
334 PyErr_Clear();
335 else {
336 if (PyObject_SetAttrString(v, "filename", tmp))
337 PyErr_Clear();
338 Py_DECREF(tmp);
339 }
340 }
341 PyErr_Restore(exc, v, tb);
Guido van Rossum452a9831996-09-17 14:32:04 +0000342}
343
344
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000345/* Interface to the block stack */
346
347static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000348block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000349{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000350 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000351 com_error(c, PyExc_SystemError,
352 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000353 }
354 else {
355 c->c_block[c->c_nblocks++] = type;
356 }
357}
358
359static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000360block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000361{
362 if (c->c_nblocks > 0)
363 c->c_nblocks--;
364 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000365 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000366 }
367}
368
369
Guido van Rossum681d79a1995-07-18 14:51:37 +0000370/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000371
Tim Petersdbd9ba62000-07-09 03:09:57 +0000372static int com_init(struct compiling *, char *);
373static void com_free(struct compiling *);
374static void com_push(struct compiling *, int);
375static void com_pop(struct compiling *, int);
376static void com_done(struct compiling *);
377static void com_node(struct compiling *, struct _node *);
378static void com_factor(struct compiling *, struct _node *);
379static void com_addbyte(struct compiling *, int);
380static void com_addint(struct compiling *, int);
381static void com_addoparg(struct compiling *, int, int);
382static void com_addfwref(struct compiling *, int, int *);
383static void com_backpatch(struct compiling *, int);
384static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
385static int com_addconst(struct compiling *, PyObject *);
386static int com_addname(struct compiling *, PyObject *);
387static void com_addopname(struct compiling *, int, node *);
388static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000389static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000390static int com_argdefs(struct compiling *, node *);
391static int com_newlocal(struct compiling *, char *);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000392static void com_assign(struct compiling *, node *, int);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000393static PyCodeObject *icompile(struct _node *, struct compiling *);
394static PyCodeObject *jcompile(struct _node *, char *,
395 struct compiling *);
396static PyObject *parsestrplus(node *);
397static PyObject *parsestr(char *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000398
399static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000400com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000401{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000402 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000403 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
404 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000405 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000406 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000407 goto fail;
408 if ((c->c_const_dict = PyDict_New()) == NULL)
409 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000410 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000411 goto fail;
412 if ((c->c_name_dict = PyDict_New()) == NULL)
413 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000414 if ((c->c_globals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000415 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000416 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000417 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000418 if ((c->c_varnames = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000419 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000420 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
421 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000422 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000423 c->c_nlocals = 0;
424 c->c_argcount = 0;
425 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000426 c->c_nexti = 0;
427 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000428 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000429 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000430 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000431 c->c_begin = 0;
432 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000433 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000434 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000435 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000436 c->c_stacklevel = 0;
437 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000438 c->c_firstlineno = 0;
439 c->c_last_addr = 0;
440 c->c_last_line = 0;
441 c-> c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000442 c->c_tmpname = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000443 return 1;
444
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000445 fail:
446 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000447 return 0;
448}
449
450static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000451com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000452{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000453 Py_XDECREF(c->c_code);
454 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000455 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000456 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000457 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000458 Py_XDECREF(c->c_globals);
459 Py_XDECREF(c->c_locals);
460 Py_XDECREF(c->c_varnames);
461 Py_XDECREF(c->c_lnotab);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000462}
463
464static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000465com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000466{
467 c->c_stacklevel += n;
468 if (c->c_stacklevel > c->c_maxstacklevel)
469 c->c_maxstacklevel = c->c_stacklevel;
470}
471
472static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000473com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000474{
475 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000476 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000477 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
478 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000479 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000480 c->c_stacklevel = 0;
481 }
482 else
483 c->c_stacklevel -= n;
484}
485
486static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000487com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000488{
489 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000490 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000491 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000492 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000493}
494
495static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000496com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000497{
498 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000499 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000500 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000501 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000502 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000503 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000504 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000505 com_error(c, PyExc_SystemError,
506 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000507 }
508 if (c->c_code == NULL)
509 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000510 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000511 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000512 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000513 c->c_errors++;
514 return;
515 }
516 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000517 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000518}
519
520static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000521com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000522{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000523 com_addbyte(c, x & 0xff);
524 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000525}
526
527static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000528com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000529{
530 int size;
531 char *p;
532 if (c->c_lnotab == NULL)
533 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000534 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000535 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000536 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000537 c->c_errors++;
538 return;
539 }
540 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000541 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000542 *p++ = addr;
543 *p++ = line;
544 c->c_lnotab_next += 2;
545}
546
547static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000548com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000549{
550 c->c_lineno = lineno;
551 if (c->c_firstlineno == 0) {
552 c->c_firstlineno = c->c_last_line = lineno;
553 }
554 else {
555 int incr_addr = c->c_nexti - c->c_last_addr;
556 int incr_line = lineno - c->c_last_line;
557 while (incr_addr > 0 || incr_line > 0) {
558 int trunc_addr = incr_addr;
559 int trunc_line = incr_line;
560 if (trunc_addr > 255)
561 trunc_addr = 255;
562 if (trunc_line > 255)
563 trunc_line = 255;
564 com_add_lnotab(c, trunc_addr, trunc_line);
565 incr_addr -= trunc_addr;
566 incr_line -= trunc_line;
567 }
568 c->c_last_addr = c->c_nexti;
569 c->c_last_line = lineno;
570 }
571}
572
573static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000574com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000575{
Guido van Rossum8e793d91997-03-03 19:13:14 +0000576 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000577 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000578 if (Py_OptimizeFlag)
579 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000580 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000581 com_addbyte(c, op);
582 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000583}
584
585static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000586com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000587{
588 /* Compile a forward reference for backpatching */
589 int here;
590 int anchor;
591 com_addbyte(c, op);
592 here = c->c_nexti;
593 anchor = *p_anchor;
594 *p_anchor = here;
595 com_addint(c, anchor == 0 ? 0 : here - anchor);
596}
597
598static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000599com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000600{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000601 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000602 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000603 int dist;
604 int prev;
605 for (;;) {
606 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000607 prev = code[anchor] + (code[anchor+1] << 8);
608 dist = target - (anchor+2);
609 code[anchor] = dist & 0xff;
610 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000611 if (!prev)
612 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000613 anchor -= prev;
614 }
615}
616
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000617/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000618
619static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000620com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000621{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000622 PyObject *w, *t, *np=NULL;
623 long n;
624
625 t = Py_BuildValue("(OO)", v, v->ob_type);
626 if (t == NULL)
627 goto fail;
628 w = PyDict_GetItem(dict, t);
629 if (w != NULL) {
630 n = PyInt_AsLong(w);
631 } else {
632 n = PyList_Size(list);
633 np = PyInt_FromLong(n);
634 if (np == NULL)
635 goto fail;
636 if (PyList_Append(list, v) != 0)
637 goto fail;
638 if (PyDict_SetItem(dict, t, np) != 0)
639 goto fail;
640 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000641 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000642 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000643 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000644 fail:
645 Py_XDECREF(np);
646 Py_XDECREF(t);
647 c->c_errors++;
648 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000649}
650
651static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000652com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000653{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000654 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000655}
656
657static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000658com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000659{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000660 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000661}
662
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000663#ifdef PRIVATE_NAME_MANGLING
664static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000665com_mangle(struct compiling *c, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000666{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000667 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000668 This is independent from how the name is used. */
669 char *p;
Guido van Rossum582acec2000-06-28 22:07:35 +0000670 size_t nlen, plen;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000671 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000672 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000673 return 0; /* Don't mangle __extremely_long_names */
674 if (name[nlen-1] == '_' && name[nlen-2] == '_')
675 return 0; /* Don't mangle __whatever__ */
676 p = c->c_private;
677 /* Strip leading underscores from class name */
678 while (*p == '_')
679 p++;
680 if (*p == '\0')
681 return 0; /* Don't mangle if class is just underscores */
682 plen = strlen(p);
683 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000684 plen = maxlen-nlen-2; /* Truncate class name if too long */
685 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000686 buffer[0] = '_';
687 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000688 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000689 /* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
690 return 1;
691}
692#endif
693
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000694static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000695com_addopnamestr(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000696{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000697 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000698 int i;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000699#ifdef PRIVATE_NAME_MANGLING
700 char buffer[256];
701 if (name != NULL && name[0] == '_' && name[1] == '_' &&
702 c->c_private != NULL &&
Guido van Rossum582acec2000-06-28 22:07:35 +0000703 com_mangle(c, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000704 name = buffer;
705#endif
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000706 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000707 c->c_errors++;
708 i = 255;
709 }
710 else {
711 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000712 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000713 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000714 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
715 switch (op) {
716 case LOAD_NAME:
717 case STORE_NAME:
718 case DELETE_NAME:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000719 if (PyDict_GetItemString(c->c_globals, name) != NULL) {
Guido van Rossumc5e96291991-12-10 13:53:51 +0000720 switch (op) {
721 case LOAD_NAME: op = LOAD_GLOBAL; break;
722 case STORE_NAME: op = STORE_GLOBAL; break;
723 case DELETE_NAME: op = DELETE_GLOBAL; break;
724 }
725 }
726 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000727 com_addoparg(c, op, i);
728}
729
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000730static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000731com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000732{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000733 char *name;
734 char buffer[1000];
735 /* XXX it is possible to write this code without the 1000
736 chars on the total length of dotted names, I just can't be
737 bothered right now */
738 if (TYPE(n) == STAR)
739 name = "*";
740 else if (TYPE(n) == dotted_name) {
741 char *p = buffer;
742 int i;
743 name = buffer;
744 for (i = 0; i < NCH(n); i += 2) {
745 char *s = STR(CHILD(n, i));
746 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000747 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000748 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +0000749 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000750 break;
751 }
752 if (p != buffer)
753 *p++ = '.';
754 strcpy(p, s);
755 p = strchr(p, '\0');
756 }
757 }
758 else {
759 REQ(n, NAME);
760 name = STR(n);
761 }
762 com_addopnamestr(c, op, name);
763}
764
Guido van Rossum79f25d91997-04-29 20:08:16 +0000765static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000766parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000767{
Tim Petersdbd9ba62000-07-09 03:09:57 +0000768 extern double atof(const char *);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000769 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000770 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000771 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +0000772#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +0000773 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +0000774 int imflag;
775#endif
776
Guido van Rossum282914b1991-04-04 10:42:56 +0000777 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000778 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +0000779#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +0000780 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +0000781#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000782 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000783 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000784 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000785 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000786 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000787 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000788 if (*end == '\0') {
789 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000790 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000791 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000792 return NULL;
793 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000794 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000795 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000796 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +0000797#ifndef WITHOUT_COMPLEX
798 if (imflag) {
799 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000800 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +0000801 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000802 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000803 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +0000804 }
Guido van Rossumac1fc951997-10-08 15:23:55 +0000805 else
Guido van Rossum50564e81996-01-12 01:13:16 +0000806#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +0000807 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000808 PyFPE_START_PROTECT("atof", return 0)
809 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000810 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000811 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000812 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000813}
814
Guido van Rossum79f25d91997-04-29 20:08:16 +0000815static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000816parsestr(char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000817{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000818 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +0000819 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000820 char *buf;
821 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000822 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000823 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +0000824 int first = *s;
825 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000826 int rawmode = 0;
827 int unicode = 0;
828 if (isalpha(quote) || quote == '_') {
829 if (quote == 'u' || quote == 'U') {
830 quote = *++s;
831 unicode = 1;
832 }
833 if (quote == 'r' || quote == 'R') {
834 quote = *++s;
835 rawmode = 1;
836 }
837 }
Guido van Rossum8054fad1993-10-26 15:19:44 +0000838 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000839 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000840 return NULL;
841 }
842 s++;
843 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +0000844 if (len > INT_MAX) {
845 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
846 return NULL;
847 }
Guido van Rossum8054fad1993-10-26 15:19:44 +0000848 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000849 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000850 return NULL;
851 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000852 if (len >= 4 && s[0] == quote && s[1] == quote) {
853 s += 2;
854 len -= 2;
855 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000856 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000857 return NULL;
858 }
859 }
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +0000860 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000861 if (rawmode)
862 return PyUnicode_DecodeRawUnicodeEscape(
863 s, len, NULL);
864 else
865 return PyUnicode_DecodeUnicodeEscape(
866 s, len, NULL);
867 }
868 else if (rawmode || strchr(s, '\\') == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000869 return PyString_FromStringAndSize(s, len);
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000870 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000871 v = PyString_FromStringAndSize((char *)NULL, len);
872 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000873 end = s + len;
874 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000875 if (*s != '\\') {
876 *p++ = *s++;
877 continue;
878 }
879 s++;
880 switch (*s++) {
881 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000882 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000883 case '\\': *p++ = '\\'; break;
884 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000885 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000886 case 'b': *p++ = '\b'; break;
887 case 'f': *p++ = '\014'; break; /* FF */
888 case 't': *p++ = '\t'; break;
889 case 'n': *p++ = '\n'; break;
890 case 'r': *p++ = '\r'; break;
891 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000892 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
893 case '0': case '1': case '2': case '3':
894 case '4': case '5': case '6': case '7':
895 c = s[-1] - '0';
896 if ('0' <= *s && *s <= '7') {
897 c = (c<<3) + *s++ - '0';
898 if ('0' <= *s && *s <= '7')
899 c = (c<<3) + *s++ - '0';
900 }
901 *p++ = c;
902 break;
903 case 'x':
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000904 if (isxdigit(Py_CHARMASK(*s))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000905 unsigned int x = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000906 do {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000907 c = Py_CHARMASK(*s);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000908 s++;
Guido van Rossumed1100f1997-10-20 23:24:07 +0000909 x = (x<<4) & ~0xF;
910 if (isdigit(c))
911 x += c - '0';
912 else if (islower(c))
913 x += 10 + c - 'a';
914 else
915 x += 10 + c - 'A';
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000916 } while (isxdigit(Py_CHARMASK(*s)));
Guido van Rossumed1100f1997-10-20 23:24:07 +0000917 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000918 break;
919 }
920 /* FALLTHROUGH */
921 default: *p++ = '\\'; *p++ = s[-1]; break;
922 }
923 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000924 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000925 return v;
926}
927
Guido van Rossum79f25d91997-04-29 20:08:16 +0000928static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000929parsestrplus(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000930{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000931 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000932 int i;
933 REQ(CHILD(n, 0), STRING);
934 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
935 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +0000936 for (i = 1; i < NCH(n); i++) {
937 PyObject *s;
938 s = parsestr(STR(CHILD(n, i)));
939 if (s == NULL)
940 goto onError;
941 if (PyString_Check(v) && PyString_Check(s)) {
942 PyString_ConcatAndDel(&v, s);
943 if (v == NULL)
944 goto onError;
945 }
946 else {
947 PyObject *temp;
948 temp = PyUnicode_Concat(v, s);
949 Py_DECREF(s);
950 if (temp == NULL)
951 goto onError;
952 Py_DECREF(v);
953 v = temp;
954 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000955 }
956 }
957 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +0000958
959 onError:
960 Py_XDECREF(v);
961 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000962}
963
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000964static void
Skip Montanaro803d6e52000-08-12 18:09:51 +0000965com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000966{
Skip Montanaro803d6e52000-08-12 18:09:51 +0000967 PyObject *v;
968 int anchor = 0;
969 int save_begin = c->c_begin;
970
971 /* list_iter: for v in expr [list_iter] */
972 com_node(c, CHILD(n, 3)); /* expr */
973 v = PyInt_FromLong(0L);
974 if (v == NULL)
975 c->c_errors++;
976 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
977 com_push(c, 1);
978 Py_XDECREF(v);
979 c->c_begin = c->c_nexti;
980 com_addoparg(c, SET_LINENO, n->n_lineno);
981 com_addfwref(c, FOR_LOOP, &anchor);
982 com_push(c, 1);
983 com_assign(c, CHILD(n, 1), OP_ASSIGN);
984 c->c_loops++;
985 com_list_iter(c, n, e, t);
986 c->c_loops--;
987 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
988 c->c_begin = save_begin;
989 com_backpatch(c, anchor);
990 com_pop(c, 2); /* FOR_LOOP has popped these */
991}
992
993static void
994com_list_if(struct compiling *c, node *n, node *e, char *t)
995{
996 int anchor = 0;
997 int a = 0;
998 /* list_iter: 'if' test [list_iter] */
999 com_addoparg(c, SET_LINENO, n->n_lineno);
1000 com_node(c, CHILD(n, 1));
1001 com_addfwref(c, JUMP_IF_FALSE, &a);
1002 com_addbyte(c, POP_TOP);
1003 com_pop(c, 1);
1004 com_list_iter(c, n, e, t);
1005 com_addfwref(c, JUMP_FORWARD, &anchor);
1006 com_backpatch(c, a);
1007 /* We jump here with an extra entry which we now pop */
1008 com_addbyte(c, POP_TOP);
1009 com_backpatch(c, anchor);
1010}
1011
1012static void
1013com_list_iter(struct compiling *c,
1014 node *p, /* parent of list_iter node */
1015 node *e, /* element expression node */
1016 char *t /* name of result list temp local */)
1017{
1018 /* list_iter is the last child in a listmaker, list_for, or list_if */
1019 node *n = CHILD(p, NCH(p)-1);
1020 if (TYPE(n) == list_iter) {
1021 n = CHILD(n, 0);
1022 switch (TYPE(n)) {
1023 case list_for:
1024 com_list_for(c, n, e, t);
1025 break;
1026 case list_if:
1027 com_list_if(c, n, e, t);
1028 break;
1029 default:
1030 com_error(c, PyExc_SystemError,
1031 "invalid list_iter node type");
1032 }
1033 }
1034 else {
1035 com_addopnamestr(c, LOAD_NAME, t);
1036 com_push(c, 1);
1037 com_node(c, e);
1038 com_addoparg(c, CALL_FUNCTION, 1);
1039 com_addbyte(c, POP_TOP);
1040 com_pop(c, 2);
1041 }
1042}
1043
1044static void
1045com_list_comprehension(struct compiling *c, node *n)
1046{
1047 /* listmaker: test list_iter */
1048 char tmpname[12];
1049 sprintf(tmpname, "__%d__", ++c->c_tmpname);
1050 com_addoparg(c, BUILD_LIST, 0);
1051 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1052 com_push(c, 2);
1053 com_addopnamestr(c, LOAD_ATTR, "append");
1054 com_addopnamestr(c, STORE_NAME, tmpname);
1055 com_pop(c, 1);
1056 com_list_iter(c, n, CHILD(n, 0), tmpname);
1057 com_addopnamestr(c, DELETE_NAME, tmpname);
1058 --c->c_tmpname;
1059}
1060
1061static void
1062com_listmaker(struct compiling *c, node *n)
1063{
1064 /* listmaker: test ( list_iter | (',' test)* [','] ) */
Thomas Wouters87df80d2000-08-13 17:05:17 +00001065 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_iter)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001066 com_list_comprehension(c, n);
1067 else {
1068 int len = 0;
1069 int i;
1070 for (i = 0; i < NCH(n); i += 2, len++)
1071 com_node(c, CHILD(n, i));
1072 com_addoparg(c, BUILD_LIST, len);
1073 com_pop(c, len-1);
1074 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001075}
1076
1077static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001078com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001079{
1080 int i;
1081 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1082 for (i = 0; i+2 < NCH(n); i += 4) {
1083 /* We must arrange things just right for STORE_SUBSCR.
1084 It wants the stack to look like (value) (dict) (key) */
1085 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001086 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001087 com_node(c, CHILD(n, i+2)); /* value */
1088 com_addbyte(c, ROT_TWO);
1089 com_node(c, CHILD(n, i)); /* key */
1090 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001091 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001092 }
1093}
1094
1095static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001096com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001097{
1098 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001099 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001100 int i;
1101 REQ(n, atom);
1102 ch = CHILD(n, 0);
1103 switch (TYPE(ch)) {
1104 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001105 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001106 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001107 com_push(c, 1);
1108 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001109 else
1110 com_node(c, CHILD(n, 1));
1111 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001112 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001113 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001114 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001115 com_push(c, 1);
1116 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001117 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001118 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001119 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001120 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001121 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001122 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001123 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001124 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001125 break;
1126 case BACKQUOTE:
1127 com_node(c, CHILD(n, 1));
1128 com_addbyte(c, UNARY_CONVERT);
1129 break;
1130 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001131 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001132 i = 255;
1133 }
1134 else {
1135 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001136 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001137 }
1138 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001139 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001140 break;
1141 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001142 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001143 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001144 c->c_errors++;
1145 i = 255;
1146 }
1147 else {
1148 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001149 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001150 }
1151 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001152 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001153 break;
1154 case NAME:
1155 com_addopname(c, LOAD_NAME, ch);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001156 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001157 break;
1158 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001159 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001160 com_error(c, PyExc_SystemError,
1161 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001162 }
1163}
1164
1165static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001166com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001167{
1168 if (NCH(n) == 1) {
1169 com_addbyte(c, op);
1170 }
1171 else if (NCH(n) == 2) {
1172 if (TYPE(CHILD(n, 0)) != COLON) {
1173 com_node(c, CHILD(n, 0));
1174 com_addbyte(c, op+1);
1175 }
1176 else {
1177 com_node(c, CHILD(n, 1));
1178 com_addbyte(c, op+2);
1179 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001180 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001181 }
1182 else {
1183 com_node(c, CHILD(n, 0));
1184 com_node(c, CHILD(n, 2));
1185 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001186 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001187 }
1188}
1189
Guido van Rossum635abd21997-01-06 22:56:52 +00001190static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001191com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001192{
1193 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001194 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001195 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001196 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001197 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001198 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001199 }
1200 else {
1201 com_node(c, CHILD(n, 0));
1202 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001203 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001204 }
1205 m = n;
1206 do {
1207 m = CHILD(m, 0);
1208 } while (NCH(m) == 1);
1209 if (TYPE(m) != NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001210 com_error(c, PyExc_SyntaxError,
1211 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001212 }
1213 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001214 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001215 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001216 *pkeywords = PyDict_New();
Guido van Rossum635abd21997-01-06 22:56:52 +00001217 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001218 c->c_errors++;
1219 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001220 if (PyDict_GetItem(*pkeywords, v) != NULL)
1221 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001222 "duplicate keyword argument");
1223 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001224 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001225 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001226 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001227 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001228 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001229 }
1230 }
1231 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001232}
1233
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001234static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001235com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001236{
1237 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001238 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001239 }
1240 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001241 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001242 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001243 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001244 int star_flag = 0;
1245 int starstar_flag = 0;
1246 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001247 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001248 na = 0;
1249 nk = 0;
1250 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001251 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001252 if (TYPE(ch) == STAR ||
1253 TYPE(ch) == DOUBLESTAR)
1254 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001255 if (ch->n_lineno != lineno) {
1256 lineno = ch->n_lineno;
1257 com_addoparg(c, SET_LINENO, lineno);
1258 }
1259 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001260 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001261 na++;
1262 else
1263 nk++;
1264 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001265 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001266 while (i < NCH(n)) {
1267 node *tok = CHILD(n, i);
1268 node *ch = CHILD(n, i+1);
1269 i += 3;
1270 switch (TYPE(tok)) {
1271 case STAR: star_flag = 1; break;
1272 case DOUBLESTAR: starstar_flag = 1; break;
1273 }
1274 com_node(c, ch);
1275 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001276 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001277 com_error(c, PyExc_SyntaxError,
1278 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001279 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001280 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001281 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001282 star_flag + (starstar_flag << 1);
1283 else
1284 opcode = CALL_FUNCTION;
1285 com_addoparg(c, opcode, na | (nk << 8));
1286 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001287 }
1288}
1289
1290static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001291com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001292{
1293 com_addopname(c, LOAD_ATTR, n);
1294}
1295
1296static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001297com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001298{
1299 int i=0;
1300 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001301 node *ch;
1302
1303 /* first argument */
1304 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001305 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001306 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001307 i++;
1308 }
1309 else {
1310 com_node(c, CHILD(n,i));
1311 i++;
1312 REQ(CHILD(n,i),COLON);
1313 i++;
1314 }
1315 /* second argument */
1316 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1317 com_node(c, CHILD(n,i));
1318 i++;
1319 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001320 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001321 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001322 com_push(c, 1);
1323 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001324 /* remaining arguments */
1325 for (; i < NCH(n); i++) {
1326 ns++;
1327 ch=CHILD(n,i);
1328 REQ(ch, sliceop);
1329 if (NCH(ch) == 1) {
1330 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001331 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001332 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001333 }
1334 else
1335 com_node(c, CHILD(ch,1));
1336 }
1337 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001338 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001339}
1340
1341static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001342com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001343{
1344 node *ch;
1345 REQ(n, subscript);
1346 ch = CHILD(n,0);
1347 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001348 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001349 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001350 com_push(c, 1);
1351 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001352 else {
1353 /* check for slice */
1354 if ((TYPE(ch) == COLON || NCH(n) > 1))
1355 com_sliceobj(c, n);
1356 else {
1357 REQ(ch, test);
1358 com_node(c, ch);
1359 }
1360 }
1361}
1362
1363static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001364com_subscriptlist(struct compiling *c, node *n, int assigning)
Guido van Rossum8861b741996-07-30 16:49:37 +00001365{
1366 int i, op;
1367 REQ(n, subscriptlist);
1368 /* Check to make backward compatible slice behavior for '[i:j]' */
1369 if (NCH(n) == 1) {
1370 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001371 /* 'Basic' slice, should have exactly one colon. */
1372 if ((TYPE(CHILD(sub, 0)) == COLON
1373 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1374 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1375 {
Guido van Rossum8861b741996-07-30 16:49:37 +00001376 if (assigning == OP_APPLY)
1377 op = SLICE;
1378 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001379 op = ((assigning == OP_ASSIGN) ?
1380 STORE_SLICE : DELETE_SLICE);
Guido van Rossum8861b741996-07-30 16:49:37 +00001381 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001382 if (op == STORE_SLICE)
1383 com_pop(c, 2);
1384 else if (op == DELETE_SLICE)
1385 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001386 return;
1387 }
1388 }
1389 /* Else normal subscriptlist. Compile each subscript. */
1390 for (i = 0; i < NCH(n); i += 2)
1391 com_subscript(c, CHILD(n, i));
1392 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001393 if (NCH(n) > 1) {
1394 i = (NCH(n)+1) / 2;
1395 com_addoparg(c, BUILD_TUPLE, i);
1396 com_pop(c, i-1);
1397 }
1398 if (assigning == OP_APPLY) {
Guido van Rossum8861b741996-07-30 16:49:37 +00001399 op = BINARY_SUBSCR;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001400 i = 1;
1401 }
1402 else if (assigning == OP_ASSIGN) {
1403 op = STORE_SUBSCR;
1404 i = 3;
1405 }
1406 else {
1407 op = DELETE_SUBSCR;
1408 i = 2;
1409 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001410 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001411 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001412}
1413
1414static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001415com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001416{
1417 REQ(n, trailer);
1418 switch (TYPE(CHILD(n, 0))) {
1419 case LPAR:
1420 com_call_function(c, CHILD(n, 1));
1421 break;
1422 case DOT:
1423 com_select_member(c, CHILD(n, 1));
1424 break;
1425 case LSQB:
Guido van Rossum8861b741996-07-30 16:49:37 +00001426 com_subscriptlist(c, CHILD(n, 1), OP_APPLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001427 break;
1428 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001429 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001430 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001431 }
1432}
1433
1434static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001435com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001436{
1437 int i;
1438 REQ(n, power);
1439 com_atom(c, CHILD(n, 0));
1440 for (i = 1; i < NCH(n); i++) {
1441 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1442 com_factor(c, CHILD(n, i+1));
1443 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001444 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001445 break;
1446 }
1447 else
1448 com_apply_trailer(c, CHILD(n, i));
1449 }
1450}
1451
1452static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001453com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001454{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001455 REQ(n, factor);
1456 if (TYPE(CHILD(n, 0)) == PLUS) {
1457 com_factor(c, CHILD(n, 1));
1458 com_addbyte(c, UNARY_POSITIVE);
1459 }
1460 else if (TYPE(CHILD(n, 0)) == MINUS) {
1461 com_factor(c, CHILD(n, 1));
1462 com_addbyte(c, UNARY_NEGATIVE);
1463 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001464 else if (TYPE(CHILD(n, 0)) == TILDE) {
1465 com_factor(c, CHILD(n, 1));
1466 com_addbyte(c, UNARY_INVERT);
1467 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001468 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001469 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001470 }
1471}
1472
1473static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001474com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001475{
1476 int i;
1477 int op;
1478 REQ(n, term);
1479 com_factor(c, CHILD(n, 0));
1480 for (i = 2; i < NCH(n); i += 2) {
1481 com_factor(c, CHILD(n, i));
1482 switch (TYPE(CHILD(n, i-1))) {
1483 case STAR:
1484 op = BINARY_MULTIPLY;
1485 break;
1486 case SLASH:
1487 op = BINARY_DIVIDE;
1488 break;
1489 case PERCENT:
1490 op = BINARY_MODULO;
1491 break;
1492 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001493 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001494 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001495 op = 255;
1496 }
1497 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001498 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001499 }
1500}
1501
1502static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001503com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001504{
1505 int i;
1506 int op;
1507 REQ(n, arith_expr);
1508 com_term(c, CHILD(n, 0));
1509 for (i = 2; i < NCH(n); i += 2) {
1510 com_term(c, CHILD(n, i));
1511 switch (TYPE(CHILD(n, i-1))) {
1512 case PLUS:
1513 op = BINARY_ADD;
1514 break;
1515 case MINUS:
1516 op = BINARY_SUBTRACT;
1517 break;
1518 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001519 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001520 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001521 op = 255;
1522 }
1523 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001524 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001525 }
1526}
1527
1528static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001529com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001530{
1531 int i;
1532 int op;
1533 REQ(n, shift_expr);
1534 com_arith_expr(c, CHILD(n, 0));
1535 for (i = 2; i < NCH(n); i += 2) {
1536 com_arith_expr(c, CHILD(n, i));
1537 switch (TYPE(CHILD(n, i-1))) {
1538 case LEFTSHIFT:
1539 op = BINARY_LSHIFT;
1540 break;
1541 case RIGHTSHIFT:
1542 op = BINARY_RSHIFT;
1543 break;
1544 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001545 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001546 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001547 op = 255;
1548 }
1549 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001550 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001551 }
1552}
1553
1554static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001555com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001556{
1557 int i;
1558 int op;
1559 REQ(n, and_expr);
1560 com_shift_expr(c, CHILD(n, 0));
1561 for (i = 2; i < NCH(n); i += 2) {
1562 com_shift_expr(c, CHILD(n, i));
1563 if (TYPE(CHILD(n, i-1)) == AMPER) {
1564 op = BINARY_AND;
1565 }
1566 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001567 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001568 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001569 op = 255;
1570 }
1571 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001572 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001573 }
1574}
1575
1576static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001577com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001578{
1579 int i;
1580 int op;
1581 REQ(n, xor_expr);
1582 com_and_expr(c, CHILD(n, 0));
1583 for (i = 2; i < NCH(n); i += 2) {
1584 com_and_expr(c, CHILD(n, i));
1585 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1586 op = BINARY_XOR;
1587 }
1588 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001589 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001590 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001591 op = 255;
1592 }
1593 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001594 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001595 }
1596}
1597
1598static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001599com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001600{
1601 int i;
1602 int op;
1603 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001604 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001605 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001606 com_xor_expr(c, CHILD(n, i));
1607 if (TYPE(CHILD(n, i-1)) == VBAR) {
1608 op = BINARY_OR;
1609 }
1610 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001611 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001612 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001613 op = 255;
1614 }
1615 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001616 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001617 }
1618}
1619
1620static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001621cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001622{
1623 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001624 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001625 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1626 if (NCH(n) == 1) {
1627 n = CHILD(n, 0);
1628 switch (TYPE(n)) {
1629 case LESS: return LT;
1630 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001631 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001632 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001633 case LESSEQUAL: return LE;
1634 case GREATEREQUAL: return GE;
1635 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001636 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1637 if (strcmp(STR(n), "is") == 0) return IS;
1638 }
1639 }
1640 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001641 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001642 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1643 return NOT_IN;
1644 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1645 return IS_NOT;
1646 }
1647 }
1648 return BAD;
1649}
1650
1651static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001652com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001653{
1654 int i;
1655 enum cmp_op op;
1656 int anchor;
1657 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1658 com_expr(c, CHILD(n, 0));
1659 if (NCH(n) == 1)
1660 return;
1661
1662 /****************************************************************
1663 The following code is generated for all but the last
1664 comparison in a chain:
1665
1666 label: on stack: opcode: jump to:
1667
1668 a <code to load b>
1669 a, b DUP_TOP
1670 a, b, b ROT_THREE
1671 b, a, b COMPARE_OP
1672 b, 0-or-1 JUMP_IF_FALSE L1
1673 b, 1 POP_TOP
1674 b
1675
1676 We are now ready to repeat this sequence for the next
1677 comparison in the chain.
1678
1679 For the last we generate:
1680
1681 b <code to load c>
1682 b, c COMPARE_OP
1683 0-or-1
1684
1685 If there were any jumps to L1 (i.e., there was more than one
1686 comparison), we generate:
1687
1688 0-or-1 JUMP_FORWARD L2
1689 L1: b, 0 ROT_TWO
1690 0, b POP_TOP
1691 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00001692 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001693 ****************************************************************/
1694
1695 anchor = 0;
1696
1697 for (i = 2; i < NCH(n); i += 2) {
1698 com_expr(c, CHILD(n, i));
1699 if (i+2 < NCH(n)) {
1700 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001701 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001702 com_addbyte(c, ROT_THREE);
1703 }
1704 op = cmp_type(CHILD(n, i-1));
1705 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001706 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001707 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001708 }
1709 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001710 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001711 if (i+2 < NCH(n)) {
1712 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1713 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001714 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001715 }
1716 }
1717
1718 if (anchor) {
1719 int anchor2 = 0;
1720 com_addfwref(c, JUMP_FORWARD, &anchor2);
1721 com_backpatch(c, anchor);
1722 com_addbyte(c, ROT_TWO);
1723 com_addbyte(c, POP_TOP);
1724 com_backpatch(c, anchor2);
1725 }
1726}
1727
1728static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001729com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001730{
1731 REQ(n, not_test); /* 'not' not_test | comparison */
1732 if (NCH(n) == 1) {
1733 com_comparison(c, CHILD(n, 0));
1734 }
1735 else {
1736 com_not_test(c, CHILD(n, 1));
1737 com_addbyte(c, UNARY_NOT);
1738 }
1739}
1740
1741static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001742com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001743{
1744 int i;
1745 int anchor;
1746 REQ(n, and_test); /* not_test ('and' not_test)* */
1747 anchor = 0;
1748 i = 0;
1749 for (;;) {
1750 com_not_test(c, CHILD(n, i));
1751 if ((i += 2) >= NCH(n))
1752 break;
1753 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1754 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001755 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001756 }
1757 if (anchor)
1758 com_backpatch(c, anchor);
1759}
1760
1761static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001762com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001763{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001764 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00001765 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001766 PyObject *v;
Guido van Rossum57531fe1993-11-30 14:57:42 +00001767 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001768 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001769 v = (PyObject *) icompile(CHILD(n, 0), c);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001770 if (v == NULL) {
1771 c->c_errors++;
1772 i = 255;
1773 }
1774 else {
1775 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001776 Py_DECREF(v);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001777 }
1778 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001779 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001780 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001781 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001782 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001783 else {
1784 int anchor = 0;
1785 int i = 0;
1786 for (;;) {
1787 com_and_test(c, CHILD(n, i));
1788 if ((i += 2) >= NCH(n))
1789 break;
1790 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1791 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001792 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001793 }
1794 if (anchor)
1795 com_backpatch(c, anchor);
1796 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001797}
1798
1799static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001800com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001801{
1802 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001803 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001804 com_node(c, CHILD(n, 0));
1805 }
1806 else {
1807 int i;
1808 int len;
1809 len = (NCH(n) + 1) / 2;
1810 for (i = 0; i < NCH(n); i += 2)
1811 com_node(c, CHILD(n, i));
1812 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001813 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001814 }
1815}
1816
1817
1818/* Begin of assignment compilation */
1819
Tim Petersdbd9ba62000-07-09 03:09:57 +00001820static void com_assign_name(struct compiling *, node *, int);
1821static void com_assign(struct compiling *, node *, int);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001822
1823static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001824com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001825{
1826 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001827 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001828}
1829
1830static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001831com_assign_trailer(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001832{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001833 REQ(n, trailer);
1834 switch (TYPE(CHILD(n, 0))) {
1835 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001836 com_error(c, PyExc_SyntaxError,
1837 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001838 break;
1839 case DOT: /* '.' NAME */
1840 com_assign_attr(c, CHILD(n, 1), assigning);
1841 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001842 case LSQB: /* '[' subscriptlist ']' */
1843 com_subscriptlist(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001844 break;
1845 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001846 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001847 }
1848}
1849
1850static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001851com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001852{
1853 int i;
1854 if (TYPE(n) != testlist)
1855 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001856 if (assigning) {
1857 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001858 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001859 com_push(c, i-1);
1860 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001861 for (i = 0; i < NCH(n); i += 2)
1862 com_assign(c, CHILD(n, i), assigning);
1863}
1864
1865static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001866com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001867{
1868 REQ(n, NAME);
1869 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001870 if (assigning)
1871 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001872}
1873
1874static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001875com_assign(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001876{
1877 /* Loop to avoid trivial recursion */
1878 for (;;) {
1879 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001880
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001881 case exprlist:
1882 case testlist:
1883 if (NCH(n) > 1) {
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001884 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001885 return;
1886 }
1887 n = CHILD(n, 0);
1888 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001889
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001890 case test:
1891 case and_test:
1892 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001893 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001894 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001895 case xor_expr:
1896 case and_expr:
1897 case shift_expr:
1898 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001899 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00001900 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001901 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001902 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001903 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001904 return;
1905 }
1906 n = CHILD(n, 0);
1907 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001908
Guido van Rossum50564e81996-01-12 01:13:16 +00001909 case power: /* atom trailer* ('**' power)* */
1910/* ('+'|'-'|'~') factor | atom trailer* */
1911 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001912 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001913 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001914 return;
1915 }
Guido van Rossum50564e81996-01-12 01:13:16 +00001916 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001917 int i;
1918 com_node(c, CHILD(n, 0));
1919 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00001920 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001921 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001922 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00001923 return;
1924 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001925 com_apply_trailer(c, CHILD(n, i));
1926 } /* NB i is still alive */
1927 com_assign_trailer(c,
1928 CHILD(n, i), assigning);
1929 return;
1930 }
1931 n = CHILD(n, 0);
1932 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001933
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001934 case atom:
1935 switch (TYPE(CHILD(n, 0))) {
1936 case LPAR:
1937 n = CHILD(n, 1);
1938 if (TYPE(n) == RPAR) {
1939 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001940 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001941 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001942 return;
1943 }
1944 break;
1945 case LSQB:
1946 n = CHILD(n, 1);
1947 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001948 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001949 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001950 return;
1951 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001952 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001953 return;
1954 case NAME:
1955 com_assign_name(c, CHILD(n, 0), assigning);
1956 return;
1957 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001958 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001959 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001960 return;
1961 }
1962 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001963
1964 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001965 com_error(c, PyExc_SyntaxError,
1966 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001967 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001968
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001969 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001970 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001971 com_error(c, PyExc_SystemError,
1972 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001973 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001974
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001975 }
1976 }
1977}
Guido van Rossum7c531111997-03-11 18:42:21 +00001978
Tim Petersdbd9ba62000-07-09 03:09:57 +00001979/* Forward */ static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001980
1981static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001982com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001983{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001984 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001985 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001986 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001987 return;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001988 com_node(c, CHILD(n, NCH(n)-1));
1989 if (NCH(n) == 1) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001990 if (c->c_interactive)
1991 com_addbyte(c, PRINT_EXPR);
1992 else
1993 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001994 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001995 }
1996 else {
1997 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001998 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001999 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002000 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002001 com_push(c, 1);
2002 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002003 com_assign(c, CHILD(n, i), OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002004 }
2005 }
2006}
2007
2008static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002009com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002010{
2011 int a = 0, b = 0;
2012 int i;
2013 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2014 /* Generate code like for
2015
2016 if __debug__:
2017 if not <test>:
2018 raise AssertionError [, <message>]
2019
2020 where <message> is the second test, if present.
2021 */
2022 if (Py_OptimizeFlag)
2023 return;
2024 com_addopnamestr(c, LOAD_GLOBAL, "__debug__");
2025 com_push(c, 1);
2026 com_addfwref(c, JUMP_IF_FALSE, &a);
2027 com_addbyte(c, POP_TOP);
2028 com_pop(c, 1);
2029 com_node(c, CHILD(n, 1));
2030 com_addfwref(c, JUMP_IF_TRUE, &b);
2031 com_addbyte(c, POP_TOP);
2032 com_pop(c, 1);
2033 /* Raise that exception! */
2034 com_addopnamestr(c, LOAD_GLOBAL, "AssertionError");
2035 com_push(c, 1);
2036 i = NCH(n)/2; /* Either 2 or 4 */
2037 if (i > 1)
2038 com_node(c, CHILD(n, 3));
2039 com_addoparg(c, RAISE_VARARGS, i);
2040 com_pop(c, i);
2041 /* The interpreter does not fall through */
2042 /* All jumps converge here */
2043 com_backpatch(c, a);
2044 com_backpatch(c, b);
2045 com_addbyte(c, POP_TOP);
2046}
2047
2048static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002049com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002050{
2051 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002052 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
2053 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002054 com_node(c, CHILD(n, i));
2055 com_addbyte(c, PRINT_ITEM);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002056 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002057 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002058 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002059 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002060 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002061}
2062
2063static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002064com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002065{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002066 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002067 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002068 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002069 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002070 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002071 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002072 com_push(c, 1);
2073 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002074 else
2075 com_node(c, CHILD(n, 1));
2076 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002077 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002078}
2079
2080static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002081com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002082{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002083 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002084 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2085 if (NCH(n) > 1) {
2086 com_node(c, CHILD(n, 1));
2087 if (NCH(n) > 3) {
2088 com_node(c, CHILD(n, 3));
2089 if (NCH(n) > 5)
2090 com_node(c, CHILD(n, 5));
2091 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002092 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002093 i = NCH(n)/2;
2094 com_addoparg(c, RAISE_VARARGS, i);
2095 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002096}
2097
2098static void
Thomas Wouters52152252000-08-17 22:55:00 +00002099com_from_import(struct compiling *c, node *n)
2100{
2101 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2102 com_push(c, 1);
2103 if (NCH(n) > 1) {
2104 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2105 com_error(c, PyExc_SyntaxError, "invalid syntax");
2106 return;
2107 }
2108 com_addopname(c, STORE_NAME, CHILD(n, 2));
2109 } else
2110 com_addopname(c, STORE_NAME, CHILD(n, 0));
2111 com_pop(c, 1);
2112}
2113
2114static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002115com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002116{
2117 int i;
2118 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002119 /* 'import' dotted_name (',' dotted_name)* |
2120 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002121 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002122 /* 'from' dotted_name 'import' ... */
2123 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002124 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002125 com_push(c, 1);
Thomas Wouters52152252000-08-17 22:55:00 +00002126 if (TYPE(CHILD(n, 3)) == STAR)
2127 com_addbyte(c, IMPORT_STAR);
2128 else {
2129 for (i = 3; i < NCH(n); i += 2)
2130 com_from_import(c, CHILD(n, i));
2131 com_addbyte(c, POP_TOP);
2132 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002133 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002134 }
2135 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002136 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002137 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002138 node *subn = CHILD(n, i);
2139 REQ(subn, dotted_as_name);
2140 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002141 com_push(c, 1);
Thomas Wouters52152252000-08-17 22:55:00 +00002142 if (NCH(subn) > 1) {
2143 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
2144 com_error(c, PyExc_SyntaxError,
2145 "invalid syntax");
2146 return;
2147 }
2148 com_addopname(c, STORE_NAME, CHILD(subn, 2));
2149 } else
2150 com_addopname(c, STORE_NAME,
2151 CHILD(CHILD(subn, 0),0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002152 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002153 }
2154 }
2155}
2156
2157static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002158com_global_stmt(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002159{
2160 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002161 REQ(n, global_stmt);
2162 /* 'global' NAME (',' NAME)* */
2163 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002164 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002165#ifdef PRIVATE_NAME_MANGLING
2166 char buffer[256];
2167 if (s != NULL && s[0] == '_' && s[1] == '_' &&
2168 c->c_private != NULL &&
Guido van Rossum582acec2000-06-28 22:07:35 +00002169 com_mangle(c, s, buffer, sizeof(buffer)))
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002170 s = buffer;
2171#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +00002172 if (PyDict_GetItemString(c->c_locals, s) != NULL) {
2173 com_error(c, PyExc_SyntaxError,
2174 "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002175 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002176 else if (PyDict_SetItemString(c->c_globals, s, Py_None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002177 c->c_errors++;
2178 }
2179}
2180
Guido van Rossum681d79a1995-07-18 14:51:37 +00002181static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002182com_newlocal_o(struct compiling *c, PyObject *nameval)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002183{
2184 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002185 PyObject *ival;
2186 if (PyList_Size(c->c_varnames) != c->c_nlocals) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002187 /* This is usually caused by an error on a previous call */
2188 if (c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002189 com_error(c, PyExc_SystemError,
2190 "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002191 }
2192 return 0;
2193 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002194 ival = PyInt_FromLong(i = c->c_nlocals++);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002195 if (ival == NULL)
2196 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002197 else if (PyDict_SetItem(c->c_locals, nameval, ival) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002198 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002199 else if (PyList_Append(c->c_varnames, nameval) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002200 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002201 Py_XDECREF(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002202 return i;
2203}
2204
2205static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002206com_addlocal_o(struct compiling *c, PyObject *nameval)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002207{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002208 PyObject *ival = PyDict_GetItem(c->c_locals, nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002209 if (ival != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002210 return PyInt_AsLong(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002211 return com_newlocal_o(c, nameval);
2212}
2213
2214static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002215com_newlocal(struct compiling *c, char *name)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002216{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002217 PyObject *nameval = PyString_InternFromString(name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002218 int i;
2219 if (nameval == NULL) {
2220 c->c_errors++;
2221 return 0;
2222 }
2223 i = com_newlocal_o(c, nameval);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002224 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002225 return i;
2226}
2227
Guido van Rossumc5e96291991-12-10 13:53:51 +00002228static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002229com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002230{
2231 REQ(n, exec_stmt);
2232 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2233 com_node(c, CHILD(n, 1));
2234 if (NCH(n) >= 4)
2235 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002236 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002237 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002238 com_push(c, 1);
2239 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002240 if (NCH(n) >= 6)
2241 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002242 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002243 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002244 com_push(c, 1);
2245 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002246 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002247 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002248}
2249
Guido van Rossum7c531111997-03-11 18:42:21 +00002250static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002251is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002252{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002253 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002254 int i;
2255
2256 /* Label to avoid tail recursion */
2257 next:
2258 switch (TYPE(n)) {
2259
2260 case suite:
2261 if (NCH(n) == 1) {
2262 n = CHILD(n, 0);
2263 goto next;
2264 }
2265 /* Fall through */
2266 case file_input:
2267 for (i = 0; i < NCH(n); i++) {
2268 node *ch = CHILD(n, i);
2269 if (TYPE(ch) == stmt) {
2270 n = ch;
2271 goto next;
2272 }
2273 }
2274 break;
2275
2276 case stmt:
2277 case simple_stmt:
2278 case small_stmt:
2279 n = CHILD(n, 0);
2280 goto next;
2281
2282 case expr_stmt:
2283 case testlist:
2284 case test:
2285 case and_test:
2286 case not_test:
2287 case comparison:
2288 case expr:
2289 case xor_expr:
2290 case and_expr:
2291 case shift_expr:
2292 case arith_expr:
2293 case term:
2294 case factor:
2295 case power:
2296 case atom:
2297 if (NCH(n) == 1) {
2298 n = CHILD(n, 0);
2299 goto next;
2300 }
2301 break;
2302
2303 case NAME:
2304 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2305 return 1;
2306 break;
2307
2308 case NUMBER:
2309 v = parsenumber(c, STR(n));
2310 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002311 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002312 break;
2313 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002314 i = PyObject_IsTrue(v);
2315 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002316 return i == 0;
2317
2318 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002319 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002320 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002321 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002322 break;
2323 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002324 i = PyObject_IsTrue(v);
2325 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002326 return i == 0;
2327
2328 }
2329 return 0;
2330}
2331
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002332static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002333com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002334{
2335 int i;
2336 int anchor = 0;
2337 REQ(n, if_stmt);
2338 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2339 for (i = 0; i+3 < NCH(n); i+=4) {
2340 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002341 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002342 if (is_constant_false(c, ch))
2343 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002344 if (i > 0)
2345 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002346 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002347 com_addfwref(c, JUMP_IF_FALSE, &a);
2348 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002349 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002350 com_node(c, CHILD(n, i+3));
2351 com_addfwref(c, JUMP_FORWARD, &anchor);
2352 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002353 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002354 com_addbyte(c, POP_TOP);
2355 }
2356 if (i+2 < NCH(n))
2357 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002358 if (anchor)
2359 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002360}
2361
2362static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002363com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002364{
2365 int break_anchor = 0;
2366 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002367 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002368 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2369 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002370 block_push(c, SETUP_LOOP);
2371 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002372 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002373 com_node(c, CHILD(n, 1));
2374 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2375 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002376 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002377 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002378 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002379 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002380 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2381 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002382 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002383 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002384 com_addbyte(c, POP_TOP);
2385 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002386 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002387 if (NCH(n) > 4)
2388 com_node(c, CHILD(n, 6));
2389 com_backpatch(c, break_anchor);
2390}
2391
2392static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002393com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002394{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002395 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002396 int break_anchor = 0;
2397 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002398 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002399 REQ(n, for_stmt);
2400 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2401 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002402 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002403 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002404 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002405 if (v == NULL)
2406 c->c_errors++;
2407 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002408 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002409 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002410 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002411 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002412 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002413 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002414 com_assign(c, CHILD(n, 1), OP_ASSIGN);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002415 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002416 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002417 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002418 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2419 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002420 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002421 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002422 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002423 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002424 if (NCH(n) > 8)
2425 com_node(c, CHILD(n, 8));
2426 com_backpatch(c, break_anchor);
2427}
2428
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002429/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002430
2431 SETUP_FINALLY L
2432 <code for S>
2433 POP_BLOCK
2434 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002435 L: <code for Sf>
2436 END_FINALLY
2437
2438 The special instructions use the block stack. Each block
2439 stack entry contains the instruction that created it (here
2440 SETUP_FINALLY), the level of the value stack at the time the
2441 block stack entry was created, and a label (here L).
2442
2443 SETUP_FINALLY:
2444 Pushes the current value stack level and the label
2445 onto the block stack.
2446 POP_BLOCK:
2447 Pops en entry from the block stack, and pops the value
2448 stack until its level is the same as indicated on the
2449 block stack. (The label is ignored.)
2450 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002451 Pops a variable number of entries from the *value* stack
2452 and re-raises the exception they specify. The number of
2453 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002454
2455 The block stack is unwound when an exception is raised:
2456 when a SETUP_FINALLY entry is found, the exception is pushed
2457 onto the value stack (and the exception condition is cleared),
2458 and the interpreter jumps to the label gotten from the block
2459 stack.
2460
2461 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002462 (The contents of the value stack is shown in [], with the top
2463 at the right; 'tb' is trace-back info, 'val' the exception's
2464 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002465
2466 Value stack Label Instruction Argument
2467 [] SETUP_EXCEPT L1
2468 [] <code for S>
2469 [] POP_BLOCK
2470 [] JUMP_FORWARD L0
2471
Guido van Rossum3f5da241990-12-20 15:06:42 +00002472 [tb, val, exc] L1: DUP )
2473 [tb, val, exc, exc] <evaluate E1> )
2474 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2475 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2476 [tb, val, exc, 1] POP )
2477 [tb, val, exc] POP
2478 [tb, val] <assign to V1> (or POP if no V1)
2479 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002480 [] <code for S1>
2481 JUMP_FORWARD L0
2482
Guido van Rossum3f5da241990-12-20 15:06:42 +00002483 [tb, val, exc, 0] L2: POP
2484 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002485 .............................etc.......................
2486
Guido van Rossum3f5da241990-12-20 15:06:42 +00002487 [tb, val, exc, 0] Ln+1: POP
2488 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002489
2490 [] L0: <next statement>
2491
2492 Of course, parts are not generated if Vi or Ei is not present.
2493*/
2494
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002495static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002496com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002497{
2498 int except_anchor = 0;
2499 int end_anchor = 0;
2500 int else_anchor = 0;
2501 int i;
2502 node *ch;
2503
2504 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2505 block_push(c, SETUP_EXCEPT);
2506 com_node(c, CHILD(n, 2));
2507 com_addbyte(c, POP_BLOCK);
2508 block_pop(c, SETUP_EXCEPT);
2509 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2510 com_backpatch(c, except_anchor);
2511 for (i = 3;
2512 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2513 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002514 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002515 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002516 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002517 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002518 break;
2519 }
2520 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002521 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002522 com_addoparg(c, SET_LINENO, ch->n_lineno);
2523 if (NCH(ch) > 1) {
2524 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002525 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002526 com_node(c, CHILD(ch, 1));
2527 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002528 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002529 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2530 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002531 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002532 }
2533 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002534 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002535 if (NCH(ch) > 3)
Guido van Rossum8861b741996-07-30 16:49:37 +00002536 com_assign(c, CHILD(ch, 3), OP_ASSIGN);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002537 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002538 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002539 com_pop(c, 1);
2540 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002541 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002542 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002543 com_node(c, CHILD(n, i+2));
2544 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2545 if (except_anchor) {
2546 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002547 /* We come in with [tb, val, exc, 0] on the
2548 stack; one pop and it's the same as
2549 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002550 com_addbyte(c, POP_TOP);
2551 }
2552 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002553 /* We actually come in here with [tb, val, exc] but the
2554 END_FINALLY will zap those and jump around.
2555 The c_stacklevel does not reflect them so we need not pop
2556 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002557 com_addbyte(c, END_FINALLY);
2558 com_backpatch(c, else_anchor);
2559 if (i < NCH(n))
2560 com_node(c, CHILD(n, i+2));
2561 com_backpatch(c, end_anchor);
2562}
2563
2564static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002565com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002566{
2567 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002568 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002569
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002570 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2571 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002572 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002573 com_addbyte(c, POP_BLOCK);
2574 block_pop(c, SETUP_FINALLY);
2575 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002576 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002577 /* While the generated code pushes only one item,
2578 the try-finally handling can enter here with
2579 up to three items. OK, here are the details:
2580 3 for an exception, 2 for RETURN, 1 for BREAK. */
2581 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002582 com_backpatch(c, finally_anchor);
2583 ch = CHILD(n, NCH(n)-1);
2584 com_addoparg(c, SET_LINENO, ch->n_lineno);
2585 com_node(c, ch);
2586 com_addbyte(c, END_FINALLY);
2587 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002588 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002589}
2590
2591static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002592com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002593{
2594 REQ(n, try_stmt);
2595 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2596 | 'try' ':' suite 'finally' ':' suite */
2597 if (TYPE(CHILD(n, 3)) != except_clause)
2598 com_try_finally(c, n);
2599 else
2600 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002601}
2602
Guido van Rossum8b993a91997-01-17 21:04:03 +00002603static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002604get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002605{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002606 int i;
2607
Guido van Rossum8b993a91997-01-17 21:04:03 +00002608 /* Label to avoid tail recursion */
2609 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002610 switch (TYPE(n)) {
2611
2612 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002613 if (NCH(n) == 1) {
2614 n = CHILD(n, 0);
2615 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002616 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002617 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002618 case file_input:
2619 for (i = 0; i < NCH(n); i++) {
2620 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002621 if (TYPE(ch) == stmt) {
2622 n = ch;
2623 goto next;
2624 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002625 }
2626 break;
2627
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002628 case stmt:
2629 case simple_stmt:
2630 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002631 n = CHILD(n, 0);
2632 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002633
2634 case expr_stmt:
2635 case testlist:
2636 case test:
2637 case and_test:
2638 case not_test:
2639 case comparison:
2640 case expr:
2641 case xor_expr:
2642 case and_expr:
2643 case shift_expr:
2644 case arith_expr:
2645 case term:
2646 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002647 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002648 if (NCH(n) == 1) {
2649 n = CHILD(n, 0);
2650 goto next;
2651 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002652 break;
2653
2654 case atom:
2655 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002656 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002657 break;
2658
2659 }
2660 return NULL;
2661}
2662
Guido van Rossum79f25d91997-04-29 20:08:16 +00002663static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002664get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002665{
Guido van Rossum541563e1999-01-28 15:08:09 +00002666 /* Don't generate doc-strings if run with -OO */
2667 if (Py_OptimizeFlag > 1)
2668 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002669 n = get_rawdocstring(n);
2670 if (n == NULL)
2671 return NULL;
2672 return parsestrplus(n);
2673}
2674
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002675static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002676com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002677{
2678 REQ(n, suite);
2679 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2680 if (NCH(n) == 1) {
2681 com_node(c, CHILD(n, 0));
2682 }
2683 else {
2684 int i;
2685 for (i = 0; i < NCH(n); i++) {
2686 node *ch = CHILD(n, i);
2687 if (TYPE(ch) == stmt)
2688 com_node(c, ch);
2689 }
2690 }
2691}
2692
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002693/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002694static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002695com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002696{
2697 int i = c->c_nblocks;
2698 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2699 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2700 }
2701 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002702 com_error(c, PyExc_SyntaxError,
2703 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002704 }
2705 /* XXX Could allow it inside a 'finally' clause
2706 XXX if we could pop the exception still on the stack */
2707}
2708
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002709static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002710com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002711{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002712 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002713 if (TYPE(n) == lambdef) {
2714 /* lambdef: 'lambda' [varargslist] ':' test */
2715 n = CHILD(n, 1);
2716 }
2717 else {
2718 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2719 n = CHILD(n, 2);
2720 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2721 n = CHILD(n, 1);
2722 }
2723 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002724 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002725 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002726 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002727 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2728 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002729 nargs = 0;
2730 ndefs = 0;
2731 for (i = 0; i < nch; i++) {
2732 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002733 if (TYPE(CHILD(n, i)) == STAR ||
2734 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002735 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002736 nargs++;
2737 i++;
2738 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002739 t = RPAR; /* Anything except EQUAL or COMMA */
2740 else
2741 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002742 if (t == EQUAL) {
2743 i++;
2744 ndefs++;
2745 com_node(c, CHILD(n, i));
2746 i++;
2747 if (i >= nch)
2748 break;
2749 t = TYPE(CHILD(n, i));
2750 }
2751 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00002752 /* Treat "(a=1, b)" as an error */
2753 if (ndefs)
2754 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00002755 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002756 }
2757 if (t != COMMA)
2758 break;
2759 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002760 return ndefs;
2761}
2762
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002763static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002764com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002765{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002766 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002767 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002768 v = (PyObject *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002769 if (v == NULL)
2770 c->c_errors++;
2771 else {
2772 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002773 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002774 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002775 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002776 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002777 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002778 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002779 com_pop(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002780 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002781 }
2782}
2783
2784static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002785com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002786{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002787 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002788 REQ(n, testlist);
2789 /* testlist: test (',' test)* [','] */
2790 for (i = 0; i < NCH(n); i += 2)
2791 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002792 i = (NCH(n)+1) / 2;
2793 com_addoparg(c, BUILD_TUPLE, i);
2794 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00002795}
2796
2797static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002798com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002799{
Guido van Rossum25831651993-05-19 14:50:45 +00002800 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002801 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002802 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002803 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00002804 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00002805 c->c_errors++;
2806 return;
2807 }
2808 /* Push the class name on the stack */
2809 i = com_addconst(c, v);
2810 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002811 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002812 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00002813 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002814 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00002815 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002816 com_push(c, 1);
2817 }
Guido van Rossum25831651993-05-19 14:50:45 +00002818 else
2819 com_bases(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002820 v = (PyObject *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002821 if (v == NULL)
2822 c->c_errors++;
2823 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002824 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002825 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002826 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002827 com_addoparg(c, MAKE_FUNCTION, 0);
2828 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002829 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002830 com_pop(c, 2);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002831 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002832 Py_DECREF(v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002833 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002834}
2835
2836static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002837com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002838{
2839 switch (TYPE(n)) {
2840
2841 /* Definition nodes */
2842
2843 case funcdef:
2844 com_funcdef(c, n);
2845 break;
2846 case classdef:
2847 com_classdef(c, n);
2848 break;
2849
2850 /* Trivial parse tree nodes */
2851
2852 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002853 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002854 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002855 com_node(c, CHILD(n, 0));
2856 break;
2857
2858 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002859 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2860 com_addoparg(c, SET_LINENO, n->n_lineno);
2861 {
2862 int i;
2863 for (i = 0; i < NCH(n)-1; i += 2)
2864 com_node(c, CHILD(n, i));
2865 }
2866 break;
2867
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002868 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002869 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002870 com_node(c, CHILD(n, 0));
2871 break;
2872
2873 /* Statement nodes */
2874
2875 case expr_stmt:
2876 com_expr_stmt(c, n);
2877 break;
2878 case print_stmt:
2879 com_print_stmt(c, n);
2880 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002881 case del_stmt: /* 'del' exprlist */
Guido van Rossum8861b741996-07-30 16:49:37 +00002882 com_assign(c, CHILD(n, 1), OP_DELETE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002883 break;
2884 case pass_stmt:
2885 break;
2886 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002887 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002888 com_error(c, PyExc_SyntaxError,
2889 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002890 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002891 com_addbyte(c, BREAK_LOOP);
2892 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002893 case continue_stmt:
2894 com_continue_stmt(c, n);
2895 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002896 case return_stmt:
2897 com_return_stmt(c, n);
2898 break;
2899 case raise_stmt:
2900 com_raise_stmt(c, n);
2901 break;
2902 case import_stmt:
2903 com_import_stmt(c, n);
2904 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002905 case global_stmt:
2906 com_global_stmt(c, n);
2907 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002908 case exec_stmt:
2909 com_exec_stmt(c, n);
2910 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002911 case assert_stmt:
2912 com_assert_stmt(c, n);
2913 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002914 case if_stmt:
2915 com_if_stmt(c, n);
2916 break;
2917 case while_stmt:
2918 com_while_stmt(c, n);
2919 break;
2920 case for_stmt:
2921 com_for_stmt(c, n);
2922 break;
2923 case try_stmt:
2924 com_try_stmt(c, n);
2925 break;
2926 case suite:
2927 com_suite(c, n);
2928 break;
2929
2930 /* Expression nodes */
2931
2932 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002933 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002934 break;
2935 case test:
2936 com_test(c, n);
2937 break;
2938 case and_test:
2939 com_and_test(c, n);
2940 break;
2941 case not_test:
2942 com_not_test(c, n);
2943 break;
2944 case comparison:
2945 com_comparison(c, n);
2946 break;
2947 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002948 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002949 break;
2950 case expr:
2951 com_expr(c, n);
2952 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002953 case xor_expr:
2954 com_xor_expr(c, n);
2955 break;
2956 case and_expr:
2957 com_and_expr(c, n);
2958 break;
2959 case shift_expr:
2960 com_shift_expr(c, n);
2961 break;
2962 case arith_expr:
2963 com_arith_expr(c, n);
2964 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002965 case term:
2966 com_term(c, n);
2967 break;
2968 case factor:
2969 com_factor(c, n);
2970 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00002971 case power:
2972 com_power(c, n);
2973 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002974 case atom:
2975 com_atom(c, n);
2976 break;
2977
2978 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002979 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002980 com_error(c, PyExc_SystemError,
2981 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002982 }
2983}
2984
Tim Petersdbd9ba62000-07-09 03:09:57 +00002985static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002986
2987static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002988com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002989{
2990 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
2991 if (TYPE(CHILD(n, 0)) == LPAR)
2992 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002993 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002994 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002995 com_pop(c, 1);
2996 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002997}
2998
2999static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003000com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003001{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003002 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003003 if (NCH(n) == 1) {
3004 com_fpdef(c, CHILD(n, 0));
3005 }
3006 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003007 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003008 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003009 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003010 for (i = 0; i < NCH(n); i += 2)
3011 com_fpdef(c, CHILD(n, i));
3012 }
3013}
3014
3015static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003016com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003017{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003018 int nch, i;
3019 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003020 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003021 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003022 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003023 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003024 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003025 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003026 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003027 node *ch = CHILD(n, i);
3028 node *fp;
3029 char *name;
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003030 PyObject *nameval;
Guido van Rossum50564e81996-01-12 01:13:16 +00003031 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003032 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003033 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3034 fp = CHILD(ch, 0);
3035 if (TYPE(fp) == NAME)
3036 name = STR(fp);
3037 else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003038 name = nbuf;
3039 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003040 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003041 }
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003042 nameval = PyString_InternFromString(name);
3043 if (nameval == NULL) {
3044 c->c_errors++;
3045 }
Peter Schneider-Kamp9a5086c2000-07-13 06:24:29 +00003046 if (PyDict_GetItem(c->c_locals, nameval)) {
Fred Drakedcf08e02000-08-15 15:49:44 +00003047 com_error(c, PyExc_SyntaxError,
3048 "duplicate argument in function definition");
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003049 }
3050 com_newlocal_o(c, nameval);
3051 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003052 c->c_argcount++;
3053 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003054 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003055 ch = CHILD(n, i);
3056 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003057 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003058 else
3059 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003060 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003061 /* Handle *arguments */
3062 if (i < nch) {
3063 node *ch;
3064 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003065 if (TYPE(ch) != DOUBLESTAR) {
3066 REQ(ch, STAR);
3067 ch = CHILD(n, i+1);
3068 if (TYPE(ch) == NAME) {
3069 c->c_flags |= CO_VARARGS;
3070 i += 3;
3071 com_newlocal(c, STR(ch));
3072 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003073 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003074 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003075 /* Handle **keywords */
3076 if (i < nch) {
3077 node *ch;
3078 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003079 if (TYPE(ch) != DOUBLESTAR) {
3080 REQ(ch, STAR);
3081 ch = CHILD(n, i+1);
3082 REQ(ch, STAR);
3083 ch = CHILD(n, i+2);
3084 }
3085 else
3086 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003087 REQ(ch, NAME);
3088 c->c_flags |= CO_VARKEYWORDS;
3089 com_newlocal(c, STR(ch));
3090 }
3091 if (complex) {
3092 /* Generate code for complex arguments only after
3093 having counted the simple arguments */
3094 int ilocal = 0;
3095 for (i = 0; i < nch; i++) {
3096 node *ch = CHILD(n, i);
3097 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003098 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003099 break;
3100 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3101 fp = CHILD(ch, 0);
3102 if (TYPE(fp) != NAME) {
3103 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003104 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003105 com_fpdef(c, ch);
3106 }
3107 ilocal++;
3108 if (++i >= nch)
3109 break;
3110 ch = CHILD(n, i);
3111 if (TYPE(ch) == EQUAL)
3112 i += 2;
3113 else
3114 REQ(ch, COMMA);
3115 }
3116 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003117}
3118
3119static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003120com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003121{
3122 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003123 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003124 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003125 doc = get_docstring(n);
3126 if (doc != NULL) {
3127 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003128 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003129 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003130 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003131 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003132 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003133 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003134 for (i = 0; i < NCH(n); i++) {
3135 node *ch = CHILD(n, i);
3136 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3137 com_node(c, ch);
3138 }
3139}
3140
3141/* Top-level compile-node interface */
3142
3143static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003144compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003145{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003146 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003147 node *ch;
3148 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003149 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003150 doc = get_docstring(CHILD(n, 4));
3151 if (doc != NULL) {
3152 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003153 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003154 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003155 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003156 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003157 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3158 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003159 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003160 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003161 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003162 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003163 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003164 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003165 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003166 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003167 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003168}
3169
3170static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003171compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003172{
Guido van Rossum590baa41993-11-30 13:40:46 +00003173 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003174 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003175 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003176
3177 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003178 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003179 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003180 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003181 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003182 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003183 else
3184 ch = CHILD(n, 2);
3185 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003186 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003187 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003188}
3189
3190static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003191compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003192{
3193 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003194 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003195 REQ(n, classdef);
3196 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3197 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003198#ifdef PRIVATE_NAME_MANGLING
3199 c->c_private = c->c_name;
3200#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003201 ch = CHILD(n, NCH(n)-1); /* The suite */
3202 doc = get_docstring(ch);
3203 if (doc != NULL) {
3204 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003205 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003206 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003207 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003208 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003209 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003210 }
3211 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003212 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003213 com_node(c, ch);
3214 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003215 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003216 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003217 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003218}
3219
3220static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003221compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003222{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003223 com_addoparg(c, SET_LINENO, n->n_lineno);
3224
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003225 switch (TYPE(n)) {
3226
Guido van Rossum4c417781991-01-21 16:09:22 +00003227 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003228 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003229 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003230 n = CHILD(n, 0);
3231 if (TYPE(n) != NEWLINE)
3232 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003233 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003234 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003235 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003236 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003237 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003238 break;
3239
Guido van Rossum4c417781991-01-21 16:09:22 +00003240 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003241 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003242 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003243 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003244 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003245 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003246 break;
3247
Guido van Rossum590baa41993-11-30 13:40:46 +00003248 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003249 com_node(c, CHILD(n, 0));
3250 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003251 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003252 break;
3253
Guido van Rossum590baa41993-11-30 13:40:46 +00003254 case lambdef: /* anonymous function definition */
3255 compile_lambdef(c, n);
3256 break;
3257
Guido van Rossum4c417781991-01-21 16:09:22 +00003258 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003259 compile_funcdef(c, n);
3260 break;
3261
Guido van Rossum4c417781991-01-21 16:09:22 +00003262 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003263 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003264 break;
3265
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003266 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003267 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003268 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003269 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003270 }
3271}
3272
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003273/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00003274
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003275 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
3276 instructions that refer to local variables with LOAD_FAST etc.
3277 The latter instructions are much faster because they don't need to
3278 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003279
Guido van Rossum681d79a1995-07-18 14:51:37 +00003280 To find all local variables, we check all STORE_NAME, IMPORT_FROM
3281 and DELETE_NAME instructions. This yields all local variables,
3282 function definitions, class definitions and import statements.
3283 Argument names have already been entered into the list by the
3284 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003285
3286 All remaining LOAD_NAME instructions must refer to non-local (global
3287 or builtin) variables, so are replaced by LOAD_GLOBAL.
3288
3289 There are two problems: 'from foo import *' and 'exec' may introduce
3290 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00003291 case, we can still optimize bona fide locals (since those
3292 statements will be surrounded by fast_2_locals() and
3293 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003294
Guido van Rossum681d79a1995-07-18 14:51:37 +00003295 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00003296
3297static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003298optimize(struct compiling *c)
Guido van Rossum282914b1991-04-04 10:42:56 +00003299{
Guido van Rossum0a697f61991-04-16 08:39:12 +00003300 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00003301 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00003302 int oparg = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003303 PyObject *name;
3304 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003305
Guido van Rossum282914b1991-04-04 10:42:56 +00003306#define NEXTOP() (*next_instr++)
3307#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossum79f25d91997-04-29 20:08:16 +00003308#define GETITEM(v, i) (PyList_GetItem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003309#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
3310
Guido van Rossum79f25d91997-04-29 20:08:16 +00003311 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003312
3313 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00003314
Guido van Rossum79f25d91997-04-29 20:08:16 +00003315 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003316 for (;;) {
3317 opcode = NEXTOP();
3318 if (opcode == STOP_CODE)
3319 break;
3320 if (HAS_ARG(opcode))
3321 oparg = NEXTARG();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003322 switch (opcode) {
3323 case STORE_NAME:
3324 case DELETE_NAME:
3325 case IMPORT_FROM:
3326 com_addlocal_o(c, GETNAMEOBJ(oparg));
3327 break;
Thomas Wouters52152252000-08-17 22:55:00 +00003328 case IMPORT_STAR:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003329 case EXEC_STMT:
3330 c->c_flags &= ~CO_OPTIMIZED;
3331 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00003332 }
3333 }
3334
Thomas Wouters52152252000-08-17 22:55:00 +00003335 /* TBD: Is this still necessary ? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003336 if (PyDict_GetItemString(c->c_locals, "*") != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003337 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003338
Guido van Rossum79f25d91997-04-29 20:08:16 +00003339 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003340 for (;;) {
3341 cur_instr = next_instr;
3342 opcode = NEXTOP();
3343 if (opcode == STOP_CODE)
3344 break;
3345 if (HAS_ARG(opcode))
3346 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003347 if (opcode == LOAD_NAME ||
3348 opcode == STORE_NAME ||
3349 opcode == DELETE_NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003350 PyObject *v;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003351 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00003352 name = GETNAMEOBJ(oparg);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003353 v = PyDict_GetItem(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003354 if (v == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003355 if (opcode == LOAD_NAME &&
3356 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003357 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003358 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00003359 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003360 i = PyInt_AsLong(v);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003361 switch (opcode) {
3362 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
3363 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
3364 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
3365 }
3366 cur_instr[1] = i & 0xff;
3367 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00003368 }
3369 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003370
Guido van Rossum681d79a1995-07-18 14:51:37 +00003371 if (c->c_errors == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00003372 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00003373}
3374
Guido van Rossum79f25d91997-04-29 20:08:16 +00003375PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003376PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003377{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003378 return jcompile(n, filename, NULL);
3379}
3380
Guido van Rossum79f25d91997-04-29 20:08:16 +00003381static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003382icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003383{
3384 return jcompile(n, base->c_filename, base);
3385}
3386
Guido van Rossum79f25d91997-04-29 20:08:16 +00003387static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003388jcompile(node *n, char *filename, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003389{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003390 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003391 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003392 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003393 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003394#ifdef PRIVATE_NAME_MANGLING
3395 if (base)
3396 sc.c_private = base->c_private;
3397 else
3398 sc.c_private = NULL;
3399#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003400 compile_node(&sc, n);
3401 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003402 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003403 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003404 sc.c_flags |= CO_NEWLOCALS;
3405 }
3406 else if (TYPE(n) == classdef)
3407 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00003408 co = NULL;
3409 if (sc.c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003410 PyObject *consts, *names, *varnames, *filename, *name;
3411 consts = PyList_AsTuple(sc.c_consts);
3412 names = PyList_AsTuple(sc.c_names);
3413 varnames = PyList_AsTuple(sc.c_varnames);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003414 filename = PyString_InternFromString(sc.c_filename);
3415 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003416 if (!PyErr_Occurred())
3417 co = PyCode_New(sc.c_argcount,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003418 sc.c_nlocals,
Guido van Rossum8b993a91997-01-17 21:04:03 +00003419 sc.c_maxstacklevel,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003420 sc.c_flags,
3421 sc.c_code,
3422 consts,
3423 names,
3424 varnames,
3425 filename,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003426 name,
3427 sc.c_firstlineno,
3428 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003429 Py_XDECREF(consts);
3430 Py_XDECREF(names);
3431 Py_XDECREF(varnames);
3432 Py_XDECREF(filename);
3433 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003434 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003435 else if (!PyErr_Occurred()) {
3436 /* This could happen if someone called PyErr_Clear() after an
3437 error was reported above. That's not supposed to happen,
3438 but I just plugged one case and I'm not sure there can't be
3439 others. In that case, raise SystemError so that at least
3440 it gets reported instead dumping core. */
3441 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3442 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003443 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003444 return co;
3445}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003446
3447int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003448PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003449{
3450 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003451 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003452 int line = co->co_firstlineno;
3453 int addr = 0;
3454 while (--size >= 0) {
3455 addr += *p++;
3456 if (addr > addrq)
3457 break;
3458 line += *p++;
3459 }
3460 return line;
3461}