blob: 49e5863d03b3a258d0b6e75d186f674618554a6c [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
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000297};
298
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000299
Guido van Rossum452a9831996-09-17 14:32:04 +0000300/* Error message including line number */
301
302static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000303com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000304{
Guido van Rossum582acec2000-06-28 22:07:35 +0000305 size_t n = strlen(msg);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000306 PyObject *v;
Guido van Rossum452a9831996-09-17 14:32:04 +0000307 char buffer[30];
308 char *s;
Guido van Rossum635abd21997-01-06 22:56:52 +0000309 c->c_errors++;
Guido van Rossum452a9831996-09-17 14:32:04 +0000310 if (c->c_lineno <= 1) {
311 /* Unknown line number or single interactive command */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000312 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000313 return;
314 }
315 sprintf(buffer, " (line %d)", c->c_lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000316 v = PyString_FromStringAndSize((char *)NULL, n + strlen(buffer));
Guido van Rossum452a9831996-09-17 14:32:04 +0000317 if (v == NULL)
318 return; /* MemoryError, too bad */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000319 s = PyString_AS_STRING((PyStringObject *)v);
Guido van Rossum452a9831996-09-17 14:32:04 +0000320 strcpy(s, msg);
321 strcat(s, buffer);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000322 PyErr_SetObject(exc, v);
323 Py_DECREF(v);
Guido van Rossum452a9831996-09-17 14:32:04 +0000324}
325
326
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000327/* Interface to the block stack */
328
329static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000330block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000331{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000332 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000333 com_error(c, PyExc_SystemError,
334 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000335 }
336 else {
337 c->c_block[c->c_nblocks++] = type;
338 }
339}
340
341static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000342block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000343{
344 if (c->c_nblocks > 0)
345 c->c_nblocks--;
346 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000347 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000348 }
349}
350
351
Guido van Rossum681d79a1995-07-18 14:51:37 +0000352/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000353
Tim Petersdbd9ba62000-07-09 03:09:57 +0000354static int com_init(struct compiling *, char *);
355static void com_free(struct compiling *);
356static void com_push(struct compiling *, int);
357static void com_pop(struct compiling *, int);
358static void com_done(struct compiling *);
359static void com_node(struct compiling *, struct _node *);
360static void com_factor(struct compiling *, struct _node *);
361static void com_addbyte(struct compiling *, int);
362static void com_addint(struct compiling *, int);
363static void com_addoparg(struct compiling *, int, int);
364static void com_addfwref(struct compiling *, int, int *);
365static void com_backpatch(struct compiling *, int);
366static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
367static int com_addconst(struct compiling *, PyObject *);
368static int com_addname(struct compiling *, PyObject *);
369static void com_addopname(struct compiling *, int, node *);
370static void com_list(struct compiling *, node *, int);
371static int com_argdefs(struct compiling *, node *);
372static int com_newlocal(struct compiling *, char *);
373static PyCodeObject *icompile(struct _node *, struct compiling *);
374static PyCodeObject *jcompile(struct _node *, char *,
375 struct compiling *);
376static PyObject *parsestrplus(node *);
377static PyObject *parsestr(char *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000378
379static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000380com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000381{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000382 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000383 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
384 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000385 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000386 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000387 goto fail;
388 if ((c->c_const_dict = PyDict_New()) == NULL)
389 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000390 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000391 goto fail;
392 if ((c->c_name_dict = PyDict_New()) == NULL)
393 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000394 if ((c->c_globals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000395 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000396 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000397 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000398 if ((c->c_varnames = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000399 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000400 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
401 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000402 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000403 c->c_nlocals = 0;
404 c->c_argcount = 0;
405 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000406 c->c_nexti = 0;
407 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000408 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000409 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000410 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000411 c->c_begin = 0;
412 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000413 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000414 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000415 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000416 c->c_stacklevel = 0;
417 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000418 c->c_firstlineno = 0;
419 c->c_last_addr = 0;
420 c->c_last_line = 0;
421 c-> c_lnotab_next = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000422 return 1;
423
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000424 fail:
425 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000426 return 0;
427}
428
429static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000430com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000431{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000432 Py_XDECREF(c->c_code);
433 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000434 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000435 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000436 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000437 Py_XDECREF(c->c_globals);
438 Py_XDECREF(c->c_locals);
439 Py_XDECREF(c->c_varnames);
440 Py_XDECREF(c->c_lnotab);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000441}
442
443static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000444com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000445{
446 c->c_stacklevel += n;
447 if (c->c_stacklevel > c->c_maxstacklevel)
448 c->c_maxstacklevel = c->c_stacklevel;
449}
450
451static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000452com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000453{
454 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000455 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000456 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
457 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000458 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000459 c->c_stacklevel = 0;
460 }
461 else
462 c->c_stacklevel -= n;
463}
464
465static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000466com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000467{
468 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000469 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000470 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000471 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000472}
473
474static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000475com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000476{
477 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000478 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000479 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000480 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000481 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000482 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000483 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000484 com_error(c, PyExc_SystemError,
485 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000486 }
487 if (c->c_code == NULL)
488 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000489 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000490 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000491 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000492 c->c_errors++;
493 return;
494 }
495 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000496 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000497}
498
499static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000500com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000501{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000502 com_addbyte(c, x & 0xff);
503 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000504}
505
506static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000507com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000508{
509 int size;
510 char *p;
511 if (c->c_lnotab == NULL)
512 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000513 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000514 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000515 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000516 c->c_errors++;
517 return;
518 }
519 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000520 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000521 *p++ = addr;
522 *p++ = line;
523 c->c_lnotab_next += 2;
524}
525
526static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000527com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000528{
529 c->c_lineno = lineno;
530 if (c->c_firstlineno == 0) {
531 c->c_firstlineno = c->c_last_line = lineno;
532 }
533 else {
534 int incr_addr = c->c_nexti - c->c_last_addr;
535 int incr_line = lineno - c->c_last_line;
536 while (incr_addr > 0 || incr_line > 0) {
537 int trunc_addr = incr_addr;
538 int trunc_line = incr_line;
539 if (trunc_addr > 255)
540 trunc_addr = 255;
541 if (trunc_line > 255)
542 trunc_line = 255;
543 com_add_lnotab(c, trunc_addr, trunc_line);
544 incr_addr -= trunc_addr;
545 incr_line -= trunc_line;
546 }
547 c->c_last_addr = c->c_nexti;
548 c->c_last_line = lineno;
549 }
550}
551
552static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000553com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000554{
Guido van Rossum8e793d91997-03-03 19:13:14 +0000555 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000556 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000557 if (Py_OptimizeFlag)
558 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000559 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000560 com_addbyte(c, op);
561 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000562}
563
564static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000565com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000566{
567 /* Compile a forward reference for backpatching */
568 int here;
569 int anchor;
570 com_addbyte(c, op);
571 here = c->c_nexti;
572 anchor = *p_anchor;
573 *p_anchor = here;
574 com_addint(c, anchor == 0 ? 0 : here - anchor);
575}
576
577static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000578com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000579{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000580 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000581 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000582 int dist;
583 int prev;
584 for (;;) {
585 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000586 prev = code[anchor] + (code[anchor+1] << 8);
587 dist = target - (anchor+2);
588 code[anchor] = dist & 0xff;
589 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000590 if (!prev)
591 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000592 anchor -= prev;
593 }
594}
595
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000596/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000597
598static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000599com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000600{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000601 PyObject *w, *t, *np=NULL;
602 long n;
603
604 t = Py_BuildValue("(OO)", v, v->ob_type);
605 if (t == NULL)
606 goto fail;
607 w = PyDict_GetItem(dict, t);
608 if (w != NULL) {
609 n = PyInt_AsLong(w);
610 } else {
611 n = PyList_Size(list);
612 np = PyInt_FromLong(n);
613 if (np == NULL)
614 goto fail;
615 if (PyList_Append(list, v) != 0)
616 goto fail;
617 if (PyDict_SetItem(dict, t, np) != 0)
618 goto fail;
619 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000620 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000621 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000622 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000623 fail:
624 Py_XDECREF(np);
625 Py_XDECREF(t);
626 c->c_errors++;
627 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000628}
629
630static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000631com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000632{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000633 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000634}
635
636static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000637com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000638{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000639 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000640}
641
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000642#ifdef PRIVATE_NAME_MANGLING
643static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000644com_mangle(struct compiling *c, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000645{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000646 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000647 This is independent from how the name is used. */
648 char *p;
Guido van Rossum582acec2000-06-28 22:07:35 +0000649 size_t nlen, plen;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000650 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000651 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000652 return 0; /* Don't mangle __extremely_long_names */
653 if (name[nlen-1] == '_' && name[nlen-2] == '_')
654 return 0; /* Don't mangle __whatever__ */
655 p = c->c_private;
656 /* Strip leading underscores from class name */
657 while (*p == '_')
658 p++;
659 if (*p == '\0')
660 return 0; /* Don't mangle if class is just underscores */
661 plen = strlen(p);
662 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000663 plen = maxlen-nlen-2; /* Truncate class name if too long */
664 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000665 buffer[0] = '_';
666 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000667 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000668 /* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
669 return 1;
670}
671#endif
672
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000673static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000674com_addopnamestr(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000675{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000676 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000677 int i;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000678#ifdef PRIVATE_NAME_MANGLING
679 char buffer[256];
680 if (name != NULL && name[0] == '_' && name[1] == '_' &&
681 c->c_private != NULL &&
Guido van Rossum582acec2000-06-28 22:07:35 +0000682 com_mangle(c, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000683 name = buffer;
684#endif
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000685 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000686 c->c_errors++;
687 i = 255;
688 }
689 else {
690 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000691 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000692 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000693 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
694 switch (op) {
695 case LOAD_NAME:
696 case STORE_NAME:
697 case DELETE_NAME:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000698 if (PyDict_GetItemString(c->c_globals, name) != NULL) {
Guido van Rossumc5e96291991-12-10 13:53:51 +0000699 switch (op) {
700 case LOAD_NAME: op = LOAD_GLOBAL; break;
701 case STORE_NAME: op = STORE_GLOBAL; break;
702 case DELETE_NAME: op = DELETE_GLOBAL; break;
703 }
704 }
705 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000706 com_addoparg(c, op, i);
707}
708
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000709static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000710com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000711{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000712 char *name;
713 char buffer[1000];
714 /* XXX it is possible to write this code without the 1000
715 chars on the total length of dotted names, I just can't be
716 bothered right now */
717 if (TYPE(n) == STAR)
718 name = "*";
719 else if (TYPE(n) == dotted_name) {
720 char *p = buffer;
721 int i;
722 name = buffer;
723 for (i = 0; i < NCH(n); i += 2) {
724 char *s = STR(CHILD(n, i));
725 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000726 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000727 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +0000728 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000729 break;
730 }
731 if (p != buffer)
732 *p++ = '.';
733 strcpy(p, s);
734 p = strchr(p, '\0');
735 }
736 }
737 else {
738 REQ(n, NAME);
739 name = STR(n);
740 }
741 com_addopnamestr(c, op, name);
742}
743
Guido van Rossum79f25d91997-04-29 20:08:16 +0000744static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000745parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000746{
Tim Petersdbd9ba62000-07-09 03:09:57 +0000747 extern double atof(const char *);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000748 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000749 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000750 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +0000751#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +0000752 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +0000753 int imflag;
754#endif
755
Guido van Rossum282914b1991-04-04 10:42:56 +0000756 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000757 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +0000758#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +0000759 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +0000760#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000761 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000762 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000763 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000764 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000765 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000766 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000767 if (*end == '\0') {
768 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000769 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000770 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000771 return NULL;
772 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000773 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000774 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000775 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +0000776#ifndef WITHOUT_COMPLEX
777 if (imflag) {
778 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000779 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +0000780 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000781 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000782 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +0000783 }
Guido van Rossumac1fc951997-10-08 15:23:55 +0000784 else
Guido van Rossum50564e81996-01-12 01:13:16 +0000785#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +0000786 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000787 PyFPE_START_PROTECT("atof", return 0)
788 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000789 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000790 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000791 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000792}
793
Guido van Rossum79f25d91997-04-29 20:08:16 +0000794static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000795parsestr(char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000796{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000797 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +0000798 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000799 char *buf;
800 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000801 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000802 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +0000803 int first = *s;
804 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000805 int rawmode = 0;
806 int unicode = 0;
807 if (isalpha(quote) || quote == '_') {
808 if (quote == 'u' || quote == 'U') {
809 quote = *++s;
810 unicode = 1;
811 }
812 if (quote == 'r' || quote == 'R') {
813 quote = *++s;
814 rawmode = 1;
815 }
816 }
Guido van Rossum8054fad1993-10-26 15:19:44 +0000817 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000818 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000819 return NULL;
820 }
821 s++;
822 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +0000823 if (len > INT_MAX) {
824 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
825 return NULL;
826 }
Guido van Rossum8054fad1993-10-26 15:19:44 +0000827 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000828 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000829 return NULL;
830 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000831 if (len >= 4 && s[0] == quote && s[1] == quote) {
832 s += 2;
833 len -= 2;
834 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000835 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000836 return NULL;
837 }
838 }
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +0000839 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000840 if (rawmode)
841 return PyUnicode_DecodeRawUnicodeEscape(
842 s, len, NULL);
843 else
844 return PyUnicode_DecodeUnicodeEscape(
845 s, len, NULL);
846 }
847 else if (rawmode || strchr(s, '\\') == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000848 return PyString_FromStringAndSize(s, len);
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000849 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000850 v = PyString_FromStringAndSize((char *)NULL, len);
851 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000852 end = s + len;
853 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000854 if (*s != '\\') {
855 *p++ = *s++;
856 continue;
857 }
858 s++;
859 switch (*s++) {
860 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000861 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000862 case '\\': *p++ = '\\'; break;
863 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000864 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000865 case 'b': *p++ = '\b'; break;
866 case 'f': *p++ = '\014'; break; /* FF */
867 case 't': *p++ = '\t'; break;
868 case 'n': *p++ = '\n'; break;
869 case 'r': *p++ = '\r'; break;
870 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000871 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
872 case '0': case '1': case '2': case '3':
873 case '4': case '5': case '6': case '7':
874 c = s[-1] - '0';
875 if ('0' <= *s && *s <= '7') {
876 c = (c<<3) + *s++ - '0';
877 if ('0' <= *s && *s <= '7')
878 c = (c<<3) + *s++ - '0';
879 }
880 *p++ = c;
881 break;
882 case 'x':
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000883 if (isxdigit(Py_CHARMASK(*s))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000884 unsigned int x = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000885 do {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000886 c = Py_CHARMASK(*s);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000887 s++;
Guido van Rossumed1100f1997-10-20 23:24:07 +0000888 x = (x<<4) & ~0xF;
889 if (isdigit(c))
890 x += c - '0';
891 else if (islower(c))
892 x += 10 + c - 'a';
893 else
894 x += 10 + c - 'A';
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000895 } while (isxdigit(Py_CHARMASK(*s)));
Guido van Rossumed1100f1997-10-20 23:24:07 +0000896 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000897 break;
898 }
899 /* FALLTHROUGH */
900 default: *p++ = '\\'; *p++ = s[-1]; break;
901 }
902 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000903 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000904 return v;
905}
906
Guido van Rossum79f25d91997-04-29 20:08:16 +0000907static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000908parsestrplus(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000909{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000910 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000911 int i;
912 REQ(CHILD(n, 0), STRING);
913 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
914 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +0000915 for (i = 1; i < NCH(n); i++) {
916 PyObject *s;
917 s = parsestr(STR(CHILD(n, i)));
918 if (s == NULL)
919 goto onError;
920 if (PyString_Check(v) && PyString_Check(s)) {
921 PyString_ConcatAndDel(&v, s);
922 if (v == NULL)
923 goto onError;
924 }
925 else {
926 PyObject *temp;
927 temp = PyUnicode_Concat(v, s);
928 Py_DECREF(s);
929 if (temp == NULL)
930 goto onError;
931 Py_DECREF(v);
932 v = temp;
933 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000934 }
935 }
936 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +0000937
938 onError:
939 Py_XDECREF(v);
940 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000941}
942
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000943static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000944com_list_constructor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000945{
946 int len;
947 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000948 if (TYPE(n) != testlist)
949 REQ(n, exprlist);
950 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
951 len = (NCH(n) + 1) / 2;
952 for (i = 0; i < NCH(n); i += 2)
953 com_node(c, CHILD(n, i));
954 com_addoparg(c, BUILD_LIST, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000955 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000956}
957
958static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000959com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000960{
961 int i;
962 /* dictmaker: test ':' test (',' test ':' value)* [','] */
963 for (i = 0; i+2 < NCH(n); i += 4) {
964 /* We must arrange things just right for STORE_SUBSCR.
965 It wants the stack to look like (value) (dict) (key) */
966 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000967 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000968 com_node(c, CHILD(n, i+2)); /* value */
969 com_addbyte(c, ROT_TWO);
970 com_node(c, CHILD(n, i)); /* key */
971 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000972 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000973 }
974}
975
976static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000977com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000978{
979 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000980 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000981 int i;
982 REQ(n, atom);
983 ch = CHILD(n, 0);
984 switch (TYPE(ch)) {
985 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +0000986 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000987 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000988 com_push(c, 1);
989 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000990 else
991 com_node(c, CHILD(n, 1));
992 break;
993 case LSQB:
Guido van Rossum8b993a91997-01-17 21:04:03 +0000994 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000995 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000996 com_push(c, 1);
997 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000998 else
999 com_list_constructor(c, CHILD(n, 1));
1000 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001001 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001002 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001003 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001004 if (TYPE(CHILD(n, 1)) != RBRACE)
1005 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001006 break;
1007 case BACKQUOTE:
1008 com_node(c, CHILD(n, 1));
1009 com_addbyte(c, UNARY_CONVERT);
1010 break;
1011 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001012 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001013 i = 255;
1014 }
1015 else {
1016 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001017 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001018 }
1019 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001020 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001021 break;
1022 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001023 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001024 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001025 c->c_errors++;
1026 i = 255;
1027 }
1028 else {
1029 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001030 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001031 }
1032 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001033 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001034 break;
1035 case NAME:
1036 com_addopname(c, LOAD_NAME, ch);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001037 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001038 break;
1039 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001040 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001041 com_error(c, PyExc_SystemError,
1042 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001043 }
1044}
1045
1046static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001047com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001048{
1049 if (NCH(n) == 1) {
1050 com_addbyte(c, op);
1051 }
1052 else if (NCH(n) == 2) {
1053 if (TYPE(CHILD(n, 0)) != COLON) {
1054 com_node(c, CHILD(n, 0));
1055 com_addbyte(c, op+1);
1056 }
1057 else {
1058 com_node(c, CHILD(n, 1));
1059 com_addbyte(c, op+2);
1060 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001061 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001062 }
1063 else {
1064 com_node(c, CHILD(n, 0));
1065 com_node(c, CHILD(n, 2));
1066 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001067 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001068 }
1069}
1070
Guido van Rossum635abd21997-01-06 22:56:52 +00001071static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001072com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001073{
1074 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001075 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001076 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001077 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001078 com_error(c, PyExc_SyntaxError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001079 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001080 }
1081 else {
1082 com_node(c, CHILD(n, 0));
1083 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001084 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001085 }
1086 m = n;
1087 do {
1088 m = CHILD(m, 0);
1089 } while (NCH(m) == 1);
1090 if (TYPE(m) != NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001091 com_error(c, PyExc_SyntaxError,
1092 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001093 }
1094 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001095 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001096 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001097 *pkeywords = PyDict_New();
Guido van Rossum635abd21997-01-06 22:56:52 +00001098 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001099 c->c_errors++;
1100 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001101 if (PyDict_GetItem(*pkeywords, v) != NULL)
1102 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001103 "duplicate keyword argument");
1104 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001105 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001106 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001107 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001108 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001109 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001110 }
1111 }
1112 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001113}
1114
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001115static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001116com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001117{
1118 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001119 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001120 }
1121 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001122 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001123 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001124 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001125 int star_flag = 0;
1126 int starstar_flag = 0;
1127 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001128 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001129 na = 0;
1130 nk = 0;
1131 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001132 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001133 if (TYPE(ch) == STAR ||
1134 TYPE(ch) == DOUBLESTAR)
1135 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001136 if (ch->n_lineno != lineno) {
1137 lineno = ch->n_lineno;
1138 com_addoparg(c, SET_LINENO, lineno);
1139 }
1140 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001141 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001142 na++;
1143 else
1144 nk++;
1145 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001146 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001147 while (i < NCH(n)) {
1148 node *tok = CHILD(n, i);
1149 node *ch = CHILD(n, i+1);
1150 i += 3;
1151 switch (TYPE(tok)) {
1152 case STAR: star_flag = 1; break;
1153 case DOUBLESTAR: starstar_flag = 1; break;
1154 }
1155 com_node(c, ch);
1156 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001157 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001158 com_error(c, PyExc_SyntaxError,
1159 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001160 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001161 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001162 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001163 star_flag + (starstar_flag << 1);
1164 else
1165 opcode = CALL_FUNCTION;
1166 com_addoparg(c, opcode, na | (nk << 8));
1167 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001168 }
1169}
1170
1171static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001172com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001173{
1174 com_addopname(c, LOAD_ATTR, n);
1175}
1176
1177static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001178com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001179{
1180 int i=0;
1181 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001182 node *ch;
1183
1184 /* first argument */
1185 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001186 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001187 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001188 i++;
1189 }
1190 else {
1191 com_node(c, CHILD(n,i));
1192 i++;
1193 REQ(CHILD(n,i),COLON);
1194 i++;
1195 }
1196 /* second argument */
1197 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1198 com_node(c, CHILD(n,i));
1199 i++;
1200 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001201 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001202 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001203 com_push(c, 1);
1204 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001205 /* remaining arguments */
1206 for (; i < NCH(n); i++) {
1207 ns++;
1208 ch=CHILD(n,i);
1209 REQ(ch, sliceop);
1210 if (NCH(ch) == 1) {
1211 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001212 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001213 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001214 }
1215 else
1216 com_node(c, CHILD(ch,1));
1217 }
1218 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001219 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001220}
1221
1222static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001223com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001224{
1225 node *ch;
1226 REQ(n, subscript);
1227 ch = CHILD(n,0);
1228 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001229 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001230 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001231 com_push(c, 1);
1232 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001233 else {
1234 /* check for slice */
1235 if ((TYPE(ch) == COLON || NCH(n) > 1))
1236 com_sliceobj(c, n);
1237 else {
1238 REQ(ch, test);
1239 com_node(c, ch);
1240 }
1241 }
1242}
1243
1244static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001245com_subscriptlist(struct compiling *c, node *n, int assigning)
Guido van Rossum8861b741996-07-30 16:49:37 +00001246{
1247 int i, op;
1248 REQ(n, subscriptlist);
1249 /* Check to make backward compatible slice behavior for '[i:j]' */
1250 if (NCH(n) == 1) {
1251 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001252 /* 'Basic' slice, should have exactly one colon. */
1253 if ((TYPE(CHILD(sub, 0)) == COLON
1254 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1255 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1256 {
Guido van Rossum8861b741996-07-30 16:49:37 +00001257 if (assigning == OP_APPLY)
1258 op = SLICE;
1259 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001260 op = ((assigning == OP_ASSIGN) ?
1261 STORE_SLICE : DELETE_SLICE);
Guido van Rossum8861b741996-07-30 16:49:37 +00001262 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001263 if (op == STORE_SLICE)
1264 com_pop(c, 2);
1265 else if (op == DELETE_SLICE)
1266 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001267 return;
1268 }
1269 }
1270 /* Else normal subscriptlist. Compile each subscript. */
1271 for (i = 0; i < NCH(n); i += 2)
1272 com_subscript(c, CHILD(n, i));
1273 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001274 if (NCH(n) > 1) {
1275 i = (NCH(n)+1) / 2;
1276 com_addoparg(c, BUILD_TUPLE, i);
1277 com_pop(c, i-1);
1278 }
1279 if (assigning == OP_APPLY) {
Guido van Rossum8861b741996-07-30 16:49:37 +00001280 op = BINARY_SUBSCR;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001281 i = 1;
1282 }
1283 else if (assigning == OP_ASSIGN) {
1284 op = STORE_SUBSCR;
1285 i = 3;
1286 }
1287 else {
1288 op = DELETE_SUBSCR;
1289 i = 2;
1290 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001291 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001292 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001293}
1294
1295static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001296com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001297{
1298 REQ(n, trailer);
1299 switch (TYPE(CHILD(n, 0))) {
1300 case LPAR:
1301 com_call_function(c, CHILD(n, 1));
1302 break;
1303 case DOT:
1304 com_select_member(c, CHILD(n, 1));
1305 break;
1306 case LSQB:
Guido van Rossum8861b741996-07-30 16:49:37 +00001307 com_subscriptlist(c, CHILD(n, 1), OP_APPLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001308 break;
1309 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001310 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001311 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001312 }
1313}
1314
1315static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001316com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001317{
1318 int i;
1319 REQ(n, power);
1320 com_atom(c, CHILD(n, 0));
1321 for (i = 1; i < NCH(n); i++) {
1322 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1323 com_factor(c, CHILD(n, i+1));
1324 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001325 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001326 break;
1327 }
1328 else
1329 com_apply_trailer(c, CHILD(n, i));
1330 }
1331}
1332
1333static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001334com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001335{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001336 REQ(n, factor);
1337 if (TYPE(CHILD(n, 0)) == PLUS) {
1338 com_factor(c, CHILD(n, 1));
1339 com_addbyte(c, UNARY_POSITIVE);
1340 }
1341 else if (TYPE(CHILD(n, 0)) == MINUS) {
1342 com_factor(c, CHILD(n, 1));
1343 com_addbyte(c, UNARY_NEGATIVE);
1344 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001345 else if (TYPE(CHILD(n, 0)) == TILDE) {
1346 com_factor(c, CHILD(n, 1));
1347 com_addbyte(c, UNARY_INVERT);
1348 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001349 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001350 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001351 }
1352}
1353
1354static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001355com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001356{
1357 int i;
1358 int op;
1359 REQ(n, term);
1360 com_factor(c, CHILD(n, 0));
1361 for (i = 2; i < NCH(n); i += 2) {
1362 com_factor(c, CHILD(n, i));
1363 switch (TYPE(CHILD(n, i-1))) {
1364 case STAR:
1365 op = BINARY_MULTIPLY;
1366 break;
1367 case SLASH:
1368 op = BINARY_DIVIDE;
1369 break;
1370 case PERCENT:
1371 op = BINARY_MODULO;
1372 break;
1373 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001374 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001375 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001376 op = 255;
1377 }
1378 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001379 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001380 }
1381}
1382
1383static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001384com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001385{
1386 int i;
1387 int op;
1388 REQ(n, arith_expr);
1389 com_term(c, CHILD(n, 0));
1390 for (i = 2; i < NCH(n); i += 2) {
1391 com_term(c, CHILD(n, i));
1392 switch (TYPE(CHILD(n, i-1))) {
1393 case PLUS:
1394 op = BINARY_ADD;
1395 break;
1396 case MINUS:
1397 op = BINARY_SUBTRACT;
1398 break;
1399 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001400 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001401 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001402 op = 255;
1403 }
1404 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001405 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001406 }
1407}
1408
1409static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001410com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001411{
1412 int i;
1413 int op;
1414 REQ(n, shift_expr);
1415 com_arith_expr(c, CHILD(n, 0));
1416 for (i = 2; i < NCH(n); i += 2) {
1417 com_arith_expr(c, CHILD(n, i));
1418 switch (TYPE(CHILD(n, i-1))) {
1419 case LEFTSHIFT:
1420 op = BINARY_LSHIFT;
1421 break;
1422 case RIGHTSHIFT:
1423 op = BINARY_RSHIFT;
1424 break;
1425 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001426 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001427 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001428 op = 255;
1429 }
1430 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001431 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001432 }
1433}
1434
1435static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001436com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001437{
1438 int i;
1439 int op;
1440 REQ(n, and_expr);
1441 com_shift_expr(c, CHILD(n, 0));
1442 for (i = 2; i < NCH(n); i += 2) {
1443 com_shift_expr(c, CHILD(n, i));
1444 if (TYPE(CHILD(n, i-1)) == AMPER) {
1445 op = BINARY_AND;
1446 }
1447 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001448 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001449 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001450 op = 255;
1451 }
1452 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001453 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001454 }
1455}
1456
1457static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001458com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001459{
1460 int i;
1461 int op;
1462 REQ(n, xor_expr);
1463 com_and_expr(c, CHILD(n, 0));
1464 for (i = 2; i < NCH(n); i += 2) {
1465 com_and_expr(c, CHILD(n, i));
1466 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1467 op = BINARY_XOR;
1468 }
1469 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001470 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001471 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001472 op = 255;
1473 }
1474 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001475 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001476 }
1477}
1478
1479static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001480com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001481{
1482 int i;
1483 int op;
1484 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001485 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001486 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001487 com_xor_expr(c, CHILD(n, i));
1488 if (TYPE(CHILD(n, i-1)) == VBAR) {
1489 op = BINARY_OR;
1490 }
1491 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001492 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001493 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001494 op = 255;
1495 }
1496 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001497 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001498 }
1499}
1500
1501static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001502cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001503{
1504 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001505 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001506 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1507 if (NCH(n) == 1) {
1508 n = CHILD(n, 0);
1509 switch (TYPE(n)) {
1510 case LESS: return LT;
1511 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001512 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001513 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001514 case LESSEQUAL: return LE;
1515 case GREATEREQUAL: return GE;
1516 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001517 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1518 if (strcmp(STR(n), "is") == 0) return IS;
1519 }
1520 }
1521 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001522 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001523 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1524 return NOT_IN;
1525 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1526 return IS_NOT;
1527 }
1528 }
1529 return BAD;
1530}
1531
1532static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001533com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001534{
1535 int i;
1536 enum cmp_op op;
1537 int anchor;
1538 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1539 com_expr(c, CHILD(n, 0));
1540 if (NCH(n) == 1)
1541 return;
1542
1543 /****************************************************************
1544 The following code is generated for all but the last
1545 comparison in a chain:
1546
1547 label: on stack: opcode: jump to:
1548
1549 a <code to load b>
1550 a, b DUP_TOP
1551 a, b, b ROT_THREE
1552 b, a, b COMPARE_OP
1553 b, 0-or-1 JUMP_IF_FALSE L1
1554 b, 1 POP_TOP
1555 b
1556
1557 We are now ready to repeat this sequence for the next
1558 comparison in the chain.
1559
1560 For the last we generate:
1561
1562 b <code to load c>
1563 b, c COMPARE_OP
1564 0-or-1
1565
1566 If there were any jumps to L1 (i.e., there was more than one
1567 comparison), we generate:
1568
1569 0-or-1 JUMP_FORWARD L2
1570 L1: b, 0 ROT_TWO
1571 0, b POP_TOP
1572 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00001573 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001574 ****************************************************************/
1575
1576 anchor = 0;
1577
1578 for (i = 2; i < NCH(n); i += 2) {
1579 com_expr(c, CHILD(n, i));
1580 if (i+2 < NCH(n)) {
1581 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001582 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001583 com_addbyte(c, ROT_THREE);
1584 }
1585 op = cmp_type(CHILD(n, i-1));
1586 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001587 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001588 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001589 }
1590 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001591 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001592 if (i+2 < NCH(n)) {
1593 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1594 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001595 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001596 }
1597 }
1598
1599 if (anchor) {
1600 int anchor2 = 0;
1601 com_addfwref(c, JUMP_FORWARD, &anchor2);
1602 com_backpatch(c, anchor);
1603 com_addbyte(c, ROT_TWO);
1604 com_addbyte(c, POP_TOP);
1605 com_backpatch(c, anchor2);
1606 }
1607}
1608
1609static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001610com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001611{
1612 REQ(n, not_test); /* 'not' not_test | comparison */
1613 if (NCH(n) == 1) {
1614 com_comparison(c, CHILD(n, 0));
1615 }
1616 else {
1617 com_not_test(c, CHILD(n, 1));
1618 com_addbyte(c, UNARY_NOT);
1619 }
1620}
1621
1622static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001623com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001624{
1625 int i;
1626 int anchor;
1627 REQ(n, and_test); /* not_test ('and' not_test)* */
1628 anchor = 0;
1629 i = 0;
1630 for (;;) {
1631 com_not_test(c, CHILD(n, i));
1632 if ((i += 2) >= NCH(n))
1633 break;
1634 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1635 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001636 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001637 }
1638 if (anchor)
1639 com_backpatch(c, anchor);
1640}
1641
1642static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001643com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001644{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001645 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00001646 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001647 PyObject *v;
Guido van Rossum57531fe1993-11-30 14:57:42 +00001648 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001649 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001650 v = (PyObject *) icompile(CHILD(n, 0), c);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001651 if (v == NULL) {
1652 c->c_errors++;
1653 i = 255;
1654 }
1655 else {
1656 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001657 Py_DECREF(v);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001658 }
1659 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001660 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001661 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001662 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001663 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001664 else {
1665 int anchor = 0;
1666 int i = 0;
1667 for (;;) {
1668 com_and_test(c, CHILD(n, i));
1669 if ((i += 2) >= NCH(n))
1670 break;
1671 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1672 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001673 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001674 }
1675 if (anchor)
1676 com_backpatch(c, anchor);
1677 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001678}
1679
1680static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001681com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001682{
1683 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001684 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001685 com_node(c, CHILD(n, 0));
1686 }
1687 else {
1688 int i;
1689 int len;
1690 len = (NCH(n) + 1) / 2;
1691 for (i = 0; i < NCH(n); i += 2)
1692 com_node(c, CHILD(n, i));
1693 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001694 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001695 }
1696}
1697
1698
1699/* Begin of assignment compilation */
1700
Tim Petersdbd9ba62000-07-09 03:09:57 +00001701static void com_assign_name(struct compiling *, node *, int);
1702static void com_assign(struct compiling *, node *, int);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001703
1704static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001705com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001706{
1707 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001708 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001709}
1710
1711static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001712com_assign_trailer(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001713{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001714 REQ(n, trailer);
1715 switch (TYPE(CHILD(n, 0))) {
1716 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001717 com_error(c, PyExc_SyntaxError,
1718 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001719 break;
1720 case DOT: /* '.' NAME */
1721 com_assign_attr(c, CHILD(n, 1), assigning);
1722 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001723 case LSQB: /* '[' subscriptlist ']' */
1724 com_subscriptlist(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001725 break;
1726 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001727 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001728 }
1729}
1730
1731static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001732com_assign_tuple(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001733{
1734 int i;
1735 if (TYPE(n) != testlist)
1736 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001737 if (assigning) {
1738 i = (NCH(n)+1)/2;
1739 com_addoparg(c, UNPACK_TUPLE, i);
1740 com_push(c, i-1);
1741 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001742 for (i = 0; i < NCH(n); i += 2)
1743 com_assign(c, CHILD(n, i), assigning);
1744}
1745
1746static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001747com_assign_list(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001748{
1749 int i;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001750 if (assigning) {
1751 i = (NCH(n)+1)/2;
1752 com_addoparg(c, UNPACK_LIST, i);
1753 com_push(c, i-1);
1754 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001755 for (i = 0; i < NCH(n); i += 2)
1756 com_assign(c, CHILD(n, i), assigning);
1757}
1758
1759static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001760com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001761{
1762 REQ(n, NAME);
1763 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001764 if (assigning)
1765 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001766}
1767
1768static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001769com_assign(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001770{
1771 /* Loop to avoid trivial recursion */
1772 for (;;) {
1773 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001774
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001775 case exprlist:
1776 case testlist:
1777 if (NCH(n) > 1) {
1778 com_assign_tuple(c, n, assigning);
1779 return;
1780 }
1781 n = CHILD(n, 0);
1782 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001783
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001784 case test:
1785 case and_test:
1786 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001787 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001788 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001789 case xor_expr:
1790 case and_expr:
1791 case shift_expr:
1792 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001793 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00001794 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001795 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001796 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001797 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001798 return;
1799 }
1800 n = CHILD(n, 0);
1801 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001802
Guido van Rossum50564e81996-01-12 01:13:16 +00001803 case power: /* atom trailer* ('**' power)* */
1804/* ('+'|'-'|'~') factor | atom trailer* */
1805 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001806 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001807 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001808 return;
1809 }
Guido van Rossum50564e81996-01-12 01:13:16 +00001810 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001811 int i;
1812 com_node(c, CHILD(n, 0));
1813 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00001814 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001815 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001816 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00001817 return;
1818 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001819 com_apply_trailer(c, CHILD(n, i));
1820 } /* NB i is still alive */
1821 com_assign_trailer(c,
1822 CHILD(n, i), assigning);
1823 return;
1824 }
1825 n = CHILD(n, 0);
1826 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001827
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001828 case atom:
1829 switch (TYPE(CHILD(n, 0))) {
1830 case LPAR:
1831 n = CHILD(n, 1);
1832 if (TYPE(n) == RPAR) {
1833 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001834 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001835 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001836 return;
1837 }
1838 break;
1839 case LSQB:
1840 n = CHILD(n, 1);
1841 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001842 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001843 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001844 return;
1845 }
1846 com_assign_list(c, n, assigning);
1847 return;
1848 case NAME:
1849 com_assign_name(c, CHILD(n, 0), assigning);
1850 return;
1851 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001852 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001853 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001854 return;
1855 }
1856 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001857
1858 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001859 com_error(c, PyExc_SyntaxError,
1860 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001861 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001862
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001863 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001864 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001865 com_error(c, PyExc_SystemError,
1866 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001867 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001868
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001869 }
1870 }
1871}
Guido van Rossum7c531111997-03-11 18:42:21 +00001872
Tim Petersdbd9ba62000-07-09 03:09:57 +00001873/* Forward */ static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001874
1875static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001876com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001877{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001878 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001879 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001880 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001881 return;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001882 com_node(c, CHILD(n, NCH(n)-1));
1883 if (NCH(n) == 1) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001884 if (c->c_interactive)
1885 com_addbyte(c, PRINT_EXPR);
1886 else
1887 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001888 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001889 }
1890 else {
1891 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001892 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001893 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001894 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001895 com_push(c, 1);
1896 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001897 com_assign(c, CHILD(n, i), OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001898 }
1899 }
1900}
1901
1902static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001903com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00001904{
1905 int a = 0, b = 0;
1906 int i;
1907 REQ(n, assert_stmt); /* 'assert' test [',' test] */
1908 /* Generate code like for
1909
1910 if __debug__:
1911 if not <test>:
1912 raise AssertionError [, <message>]
1913
1914 where <message> is the second test, if present.
1915 */
1916 if (Py_OptimizeFlag)
1917 return;
1918 com_addopnamestr(c, LOAD_GLOBAL, "__debug__");
1919 com_push(c, 1);
1920 com_addfwref(c, JUMP_IF_FALSE, &a);
1921 com_addbyte(c, POP_TOP);
1922 com_pop(c, 1);
1923 com_node(c, CHILD(n, 1));
1924 com_addfwref(c, JUMP_IF_TRUE, &b);
1925 com_addbyte(c, POP_TOP);
1926 com_pop(c, 1);
1927 /* Raise that exception! */
1928 com_addopnamestr(c, LOAD_GLOBAL, "AssertionError");
1929 com_push(c, 1);
1930 i = NCH(n)/2; /* Either 2 or 4 */
1931 if (i > 1)
1932 com_node(c, CHILD(n, 3));
1933 com_addoparg(c, RAISE_VARARGS, i);
1934 com_pop(c, i);
1935 /* The interpreter does not fall through */
1936 /* All jumps converge here */
1937 com_backpatch(c, a);
1938 com_backpatch(c, b);
1939 com_addbyte(c, POP_TOP);
1940}
1941
1942static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001943com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001944{
1945 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001946 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
1947 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001948 com_node(c, CHILD(n, i));
1949 com_addbyte(c, PRINT_ITEM);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001950 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001951 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001952 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001953 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001954 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001955}
1956
1957static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001958com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001959{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001960 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001961 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001962 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001963 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001964 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001965 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001966 com_push(c, 1);
1967 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001968 else
1969 com_node(c, CHILD(n, 1));
1970 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001971 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001972}
1973
1974static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001975com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001976{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001977 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00001978 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
1979 if (NCH(n) > 1) {
1980 com_node(c, CHILD(n, 1));
1981 if (NCH(n) > 3) {
1982 com_node(c, CHILD(n, 3));
1983 if (NCH(n) > 5)
1984 com_node(c, CHILD(n, 5));
1985 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001986 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001987 i = NCH(n)/2;
1988 com_addoparg(c, RAISE_VARARGS, i);
1989 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001990}
1991
1992static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001993com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001994{
1995 int i;
1996 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001997 /* 'import' dotted_name (',' dotted_name)* |
1998 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001999 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002000 /* 'from' dotted_name 'import' ... */
2001 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002002 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002003 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002004 for (i = 3; i < NCH(n); i += 2)
2005 com_addopname(c, IMPORT_FROM, CHILD(n, i));
2006 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002007 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002008 }
2009 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002010 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002011 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002012 REQ(CHILD(n, i), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002013 com_addopname(c, IMPORT_NAME, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002014 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002015 com_addopname(c, STORE_NAME, CHILD(CHILD(n, i), 0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002016 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002017 }
2018 }
2019}
2020
2021static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002022com_global_stmt(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002023{
2024 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002025 REQ(n, global_stmt);
2026 /* 'global' NAME (',' NAME)* */
2027 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002028 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002029#ifdef PRIVATE_NAME_MANGLING
2030 char buffer[256];
2031 if (s != NULL && s[0] == '_' && s[1] == '_' &&
2032 c->c_private != NULL &&
Guido van Rossum582acec2000-06-28 22:07:35 +00002033 com_mangle(c, s, buffer, sizeof(buffer)))
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002034 s = buffer;
2035#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +00002036 if (PyDict_GetItemString(c->c_locals, s) != NULL) {
2037 com_error(c, PyExc_SyntaxError,
2038 "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002039 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002040 else if (PyDict_SetItemString(c->c_globals, s, Py_None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002041 c->c_errors++;
2042 }
2043}
2044
Guido van Rossum681d79a1995-07-18 14:51:37 +00002045static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002046com_newlocal_o(struct compiling *c, PyObject *nameval)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002047{
2048 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002049 PyObject *ival;
2050 if (PyList_Size(c->c_varnames) != c->c_nlocals) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002051 /* This is usually caused by an error on a previous call */
2052 if (c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002053 com_error(c, PyExc_SystemError,
2054 "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002055 }
2056 return 0;
2057 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002058 ival = PyInt_FromLong(i = c->c_nlocals++);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002059 if (ival == NULL)
2060 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002061 else if (PyDict_SetItem(c->c_locals, nameval, ival) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002062 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002063 else if (PyList_Append(c->c_varnames, nameval) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002064 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002065 Py_XDECREF(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002066 return i;
2067}
2068
2069static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002070com_addlocal_o(struct compiling *c, PyObject *nameval)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002071{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002072 PyObject *ival = PyDict_GetItem(c->c_locals, nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002073 if (ival != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002074 return PyInt_AsLong(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002075 return com_newlocal_o(c, nameval);
2076}
2077
2078static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002079com_newlocal(struct compiling *c, char *name)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002080{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002081 PyObject *nameval = PyString_InternFromString(name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002082 int i;
2083 if (nameval == NULL) {
2084 c->c_errors++;
2085 return 0;
2086 }
2087 i = com_newlocal_o(c, nameval);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002088 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002089 return i;
2090}
2091
Guido van Rossumc5e96291991-12-10 13:53:51 +00002092static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002093com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002094{
2095 REQ(n, exec_stmt);
2096 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2097 com_node(c, CHILD(n, 1));
2098 if (NCH(n) >= 4)
2099 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002100 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002101 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002102 com_push(c, 1);
2103 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002104 if (NCH(n) >= 6)
2105 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002106 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002107 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002108 com_push(c, 1);
2109 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002110 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002111 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002112}
2113
Guido van Rossum7c531111997-03-11 18:42:21 +00002114static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002115is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002116{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002117 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002118 int i;
2119
2120 /* Label to avoid tail recursion */
2121 next:
2122 switch (TYPE(n)) {
2123
2124 case suite:
2125 if (NCH(n) == 1) {
2126 n = CHILD(n, 0);
2127 goto next;
2128 }
2129 /* Fall through */
2130 case file_input:
2131 for (i = 0; i < NCH(n); i++) {
2132 node *ch = CHILD(n, i);
2133 if (TYPE(ch) == stmt) {
2134 n = ch;
2135 goto next;
2136 }
2137 }
2138 break;
2139
2140 case stmt:
2141 case simple_stmt:
2142 case small_stmt:
2143 n = CHILD(n, 0);
2144 goto next;
2145
2146 case expr_stmt:
2147 case testlist:
2148 case test:
2149 case and_test:
2150 case not_test:
2151 case comparison:
2152 case expr:
2153 case xor_expr:
2154 case and_expr:
2155 case shift_expr:
2156 case arith_expr:
2157 case term:
2158 case factor:
2159 case power:
2160 case atom:
2161 if (NCH(n) == 1) {
2162 n = CHILD(n, 0);
2163 goto next;
2164 }
2165 break;
2166
2167 case NAME:
2168 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2169 return 1;
2170 break;
2171
2172 case NUMBER:
2173 v = parsenumber(c, STR(n));
2174 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002175 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002176 break;
2177 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002178 i = PyObject_IsTrue(v);
2179 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002180 return i == 0;
2181
2182 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002183 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002184 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002185 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002186 break;
2187 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002188 i = PyObject_IsTrue(v);
2189 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002190 return i == 0;
2191
2192 }
2193 return 0;
2194}
2195
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002196static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002197com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002198{
2199 int i;
2200 int anchor = 0;
2201 REQ(n, if_stmt);
2202 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2203 for (i = 0; i+3 < NCH(n); i+=4) {
2204 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002205 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002206 if (is_constant_false(c, ch))
2207 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002208 if (i > 0)
2209 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002210 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002211 com_addfwref(c, JUMP_IF_FALSE, &a);
2212 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002213 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002214 com_node(c, CHILD(n, i+3));
2215 com_addfwref(c, JUMP_FORWARD, &anchor);
2216 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002217 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002218 com_addbyte(c, POP_TOP);
2219 }
2220 if (i+2 < NCH(n))
2221 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002222 if (anchor)
2223 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002224}
2225
2226static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002227com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002228{
2229 int break_anchor = 0;
2230 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002231 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002232 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2233 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002234 block_push(c, SETUP_LOOP);
2235 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002236 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002237 com_node(c, CHILD(n, 1));
2238 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2239 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002240 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002241 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002242 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002243 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002244 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2245 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002246 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002247 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002248 com_addbyte(c, POP_TOP);
2249 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002250 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002251 if (NCH(n) > 4)
2252 com_node(c, CHILD(n, 6));
2253 com_backpatch(c, break_anchor);
2254}
2255
2256static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002257com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002258{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002259 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002260 int break_anchor = 0;
2261 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002262 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002263 REQ(n, for_stmt);
2264 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2265 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002266 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002267 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002268 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002269 if (v == NULL)
2270 c->c_errors++;
2271 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002272 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002273 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002274 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002275 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002276 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002277 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002278 com_assign(c, CHILD(n, 1), OP_ASSIGN);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002279 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002280 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002281 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002282 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2283 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002284 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002285 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002286 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002287 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002288 if (NCH(n) > 8)
2289 com_node(c, CHILD(n, 8));
2290 com_backpatch(c, break_anchor);
2291}
2292
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002293/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002294
2295 SETUP_FINALLY L
2296 <code for S>
2297 POP_BLOCK
2298 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002299 L: <code for Sf>
2300 END_FINALLY
2301
2302 The special instructions use the block stack. Each block
2303 stack entry contains the instruction that created it (here
2304 SETUP_FINALLY), the level of the value stack at the time the
2305 block stack entry was created, and a label (here L).
2306
2307 SETUP_FINALLY:
2308 Pushes the current value stack level and the label
2309 onto the block stack.
2310 POP_BLOCK:
2311 Pops en entry from the block stack, and pops the value
2312 stack until its level is the same as indicated on the
2313 block stack. (The label is ignored.)
2314 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002315 Pops a variable number of entries from the *value* stack
2316 and re-raises the exception they specify. The number of
2317 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002318
2319 The block stack is unwound when an exception is raised:
2320 when a SETUP_FINALLY entry is found, the exception is pushed
2321 onto the value stack (and the exception condition is cleared),
2322 and the interpreter jumps to the label gotten from the block
2323 stack.
2324
2325 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002326 (The contents of the value stack is shown in [], with the top
2327 at the right; 'tb' is trace-back info, 'val' the exception's
2328 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002329
2330 Value stack Label Instruction Argument
2331 [] SETUP_EXCEPT L1
2332 [] <code for S>
2333 [] POP_BLOCK
2334 [] JUMP_FORWARD L0
2335
Guido van Rossum3f5da241990-12-20 15:06:42 +00002336 [tb, val, exc] L1: DUP )
2337 [tb, val, exc, exc] <evaluate E1> )
2338 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2339 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2340 [tb, val, exc, 1] POP )
2341 [tb, val, exc] POP
2342 [tb, val] <assign to V1> (or POP if no V1)
2343 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002344 [] <code for S1>
2345 JUMP_FORWARD L0
2346
Guido van Rossum3f5da241990-12-20 15:06:42 +00002347 [tb, val, exc, 0] L2: POP
2348 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002349 .............................etc.......................
2350
Guido van Rossum3f5da241990-12-20 15:06:42 +00002351 [tb, val, exc, 0] Ln+1: POP
2352 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002353
2354 [] L0: <next statement>
2355
2356 Of course, parts are not generated if Vi or Ei is not present.
2357*/
2358
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002359static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002360com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002361{
2362 int except_anchor = 0;
2363 int end_anchor = 0;
2364 int else_anchor = 0;
2365 int i;
2366 node *ch;
2367
2368 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2369 block_push(c, SETUP_EXCEPT);
2370 com_node(c, CHILD(n, 2));
2371 com_addbyte(c, POP_BLOCK);
2372 block_pop(c, SETUP_EXCEPT);
2373 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2374 com_backpatch(c, except_anchor);
2375 for (i = 3;
2376 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2377 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002378 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002379 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002380 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002381 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002382 break;
2383 }
2384 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002385 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002386 com_addoparg(c, SET_LINENO, ch->n_lineno);
2387 if (NCH(ch) > 1) {
2388 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002389 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002390 com_node(c, CHILD(ch, 1));
2391 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002392 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002393 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2394 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002395 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002396 }
2397 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002398 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002399 if (NCH(ch) > 3)
Guido van Rossum8861b741996-07-30 16:49:37 +00002400 com_assign(c, CHILD(ch, 3), OP_ASSIGN);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002401 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002402 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002403 com_pop(c, 1);
2404 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002405 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002406 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002407 com_node(c, CHILD(n, i+2));
2408 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2409 if (except_anchor) {
2410 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002411 /* We come in with [tb, val, exc, 0] on the
2412 stack; one pop and it's the same as
2413 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002414 com_addbyte(c, POP_TOP);
2415 }
2416 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002417 /* We actually come in here with [tb, val, exc] but the
2418 END_FINALLY will zap those and jump around.
2419 The c_stacklevel does not reflect them so we need not pop
2420 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002421 com_addbyte(c, END_FINALLY);
2422 com_backpatch(c, else_anchor);
2423 if (i < NCH(n))
2424 com_node(c, CHILD(n, i+2));
2425 com_backpatch(c, end_anchor);
2426}
2427
2428static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002429com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002430{
2431 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002432 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002433
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002434 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2435 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002436 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002437 com_addbyte(c, POP_BLOCK);
2438 block_pop(c, SETUP_FINALLY);
2439 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002440 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002441 /* While the generated code pushes only one item,
2442 the try-finally handling can enter here with
2443 up to three items. OK, here are the details:
2444 3 for an exception, 2 for RETURN, 1 for BREAK. */
2445 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002446 com_backpatch(c, finally_anchor);
2447 ch = CHILD(n, NCH(n)-1);
2448 com_addoparg(c, SET_LINENO, ch->n_lineno);
2449 com_node(c, ch);
2450 com_addbyte(c, END_FINALLY);
2451 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002452 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002453}
2454
2455static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002456com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002457{
2458 REQ(n, try_stmt);
2459 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2460 | 'try' ':' suite 'finally' ':' suite */
2461 if (TYPE(CHILD(n, 3)) != except_clause)
2462 com_try_finally(c, n);
2463 else
2464 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002465}
2466
Guido van Rossum8b993a91997-01-17 21:04:03 +00002467static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002468get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002469{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002470 int i;
2471
Guido van Rossum8b993a91997-01-17 21:04:03 +00002472 /* Label to avoid tail recursion */
2473 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002474 switch (TYPE(n)) {
2475
2476 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002477 if (NCH(n) == 1) {
2478 n = CHILD(n, 0);
2479 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002480 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002481 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002482 case file_input:
2483 for (i = 0; i < NCH(n); i++) {
2484 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002485 if (TYPE(ch) == stmt) {
2486 n = ch;
2487 goto next;
2488 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002489 }
2490 break;
2491
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002492 case stmt:
2493 case simple_stmt:
2494 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002495 n = CHILD(n, 0);
2496 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002497
2498 case expr_stmt:
2499 case testlist:
2500 case test:
2501 case and_test:
2502 case not_test:
2503 case comparison:
2504 case expr:
2505 case xor_expr:
2506 case and_expr:
2507 case shift_expr:
2508 case arith_expr:
2509 case term:
2510 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002511 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002512 if (NCH(n) == 1) {
2513 n = CHILD(n, 0);
2514 goto next;
2515 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002516 break;
2517
2518 case atom:
2519 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002520 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002521 break;
2522
2523 }
2524 return NULL;
2525}
2526
Guido van Rossum79f25d91997-04-29 20:08:16 +00002527static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002528get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002529{
Guido van Rossum541563e1999-01-28 15:08:09 +00002530 /* Don't generate doc-strings if run with -OO */
2531 if (Py_OptimizeFlag > 1)
2532 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002533 n = get_rawdocstring(n);
2534 if (n == NULL)
2535 return NULL;
2536 return parsestrplus(n);
2537}
2538
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002539static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002540com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002541{
2542 REQ(n, suite);
2543 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2544 if (NCH(n) == 1) {
2545 com_node(c, CHILD(n, 0));
2546 }
2547 else {
2548 int i;
2549 for (i = 0; i < NCH(n); i++) {
2550 node *ch = CHILD(n, i);
2551 if (TYPE(ch) == stmt)
2552 com_node(c, ch);
2553 }
2554 }
2555}
2556
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002557/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002558static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002559com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002560{
2561 int i = c->c_nblocks;
2562 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2563 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2564 }
2565 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002566 com_error(c, PyExc_SyntaxError,
2567 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002568 }
2569 /* XXX Could allow it inside a 'finally' clause
2570 XXX if we could pop the exception still on the stack */
2571}
2572
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002573static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002574com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002575{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002576 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002577 if (TYPE(n) == lambdef) {
2578 /* lambdef: 'lambda' [varargslist] ':' test */
2579 n = CHILD(n, 1);
2580 }
2581 else {
2582 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2583 n = CHILD(n, 2);
2584 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2585 n = CHILD(n, 1);
2586 }
2587 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002588 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002589 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002590 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002591 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2592 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002593 nargs = 0;
2594 ndefs = 0;
2595 for (i = 0; i < nch; i++) {
2596 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002597 if (TYPE(CHILD(n, i)) == STAR ||
2598 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002599 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002600 nargs++;
2601 i++;
2602 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002603 t = RPAR; /* Anything except EQUAL or COMMA */
2604 else
2605 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002606 if (t == EQUAL) {
2607 i++;
2608 ndefs++;
2609 com_node(c, CHILD(n, i));
2610 i++;
2611 if (i >= nch)
2612 break;
2613 t = TYPE(CHILD(n, i));
2614 }
2615 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00002616 /* Treat "(a=1, b)" as an error */
2617 if (ndefs)
2618 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00002619 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002620 }
2621 if (t != COMMA)
2622 break;
2623 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002624 return ndefs;
2625}
2626
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002627static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002628com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002629{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002630 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002631 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002632 v = (PyObject *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002633 if (v == NULL)
2634 c->c_errors++;
2635 else {
2636 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002637 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002638 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002639 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002640 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002641 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002642 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002643 com_pop(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002644 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002645 }
2646}
2647
2648static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002649com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002650{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002651 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002652 REQ(n, testlist);
2653 /* testlist: test (',' test)* [','] */
2654 for (i = 0; i < NCH(n); i += 2)
2655 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002656 i = (NCH(n)+1) / 2;
2657 com_addoparg(c, BUILD_TUPLE, i);
2658 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00002659}
2660
2661static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002662com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002663{
Guido van Rossum25831651993-05-19 14:50:45 +00002664 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002665 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002666 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002667 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00002668 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00002669 c->c_errors++;
2670 return;
2671 }
2672 /* Push the class name on the stack */
2673 i = com_addconst(c, v);
2674 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002675 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002676 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00002677 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002678 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00002679 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002680 com_push(c, 1);
2681 }
Guido van Rossum25831651993-05-19 14:50:45 +00002682 else
2683 com_bases(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002684 v = (PyObject *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002685 if (v == NULL)
2686 c->c_errors++;
2687 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002688 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002689 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002690 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002691 com_addoparg(c, MAKE_FUNCTION, 0);
2692 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002693 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002694 com_pop(c, 2);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002695 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002696 Py_DECREF(v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002697 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002698}
2699
2700static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002701com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002702{
2703 switch (TYPE(n)) {
2704
2705 /* Definition nodes */
2706
2707 case funcdef:
2708 com_funcdef(c, n);
2709 break;
2710 case classdef:
2711 com_classdef(c, n);
2712 break;
2713
2714 /* Trivial parse tree nodes */
2715
2716 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002717 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002718 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002719 com_node(c, CHILD(n, 0));
2720 break;
2721
2722 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002723 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2724 com_addoparg(c, SET_LINENO, n->n_lineno);
2725 {
2726 int i;
2727 for (i = 0; i < NCH(n)-1; i += 2)
2728 com_node(c, CHILD(n, i));
2729 }
2730 break;
2731
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002732 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002733 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002734 com_node(c, CHILD(n, 0));
2735 break;
2736
2737 /* Statement nodes */
2738
2739 case expr_stmt:
2740 com_expr_stmt(c, n);
2741 break;
2742 case print_stmt:
2743 com_print_stmt(c, n);
2744 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002745 case del_stmt: /* 'del' exprlist */
Guido van Rossum8861b741996-07-30 16:49:37 +00002746 com_assign(c, CHILD(n, 1), OP_DELETE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002747 break;
2748 case pass_stmt:
2749 break;
2750 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002751 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002752 com_error(c, PyExc_SyntaxError,
2753 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002754 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002755 com_addbyte(c, BREAK_LOOP);
2756 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002757 case continue_stmt:
2758 com_continue_stmt(c, n);
2759 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002760 case return_stmt:
2761 com_return_stmt(c, n);
2762 break;
2763 case raise_stmt:
2764 com_raise_stmt(c, n);
2765 break;
2766 case import_stmt:
2767 com_import_stmt(c, n);
2768 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002769 case global_stmt:
2770 com_global_stmt(c, n);
2771 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002772 case exec_stmt:
2773 com_exec_stmt(c, n);
2774 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002775 case assert_stmt:
2776 com_assert_stmt(c, n);
2777 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002778 case if_stmt:
2779 com_if_stmt(c, n);
2780 break;
2781 case while_stmt:
2782 com_while_stmt(c, n);
2783 break;
2784 case for_stmt:
2785 com_for_stmt(c, n);
2786 break;
2787 case try_stmt:
2788 com_try_stmt(c, n);
2789 break;
2790 case suite:
2791 com_suite(c, n);
2792 break;
2793
2794 /* Expression nodes */
2795
2796 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002797 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002798 break;
2799 case test:
2800 com_test(c, n);
2801 break;
2802 case and_test:
2803 com_and_test(c, n);
2804 break;
2805 case not_test:
2806 com_not_test(c, n);
2807 break;
2808 case comparison:
2809 com_comparison(c, n);
2810 break;
2811 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002812 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002813 break;
2814 case expr:
2815 com_expr(c, n);
2816 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002817 case xor_expr:
2818 com_xor_expr(c, n);
2819 break;
2820 case and_expr:
2821 com_and_expr(c, n);
2822 break;
2823 case shift_expr:
2824 com_shift_expr(c, n);
2825 break;
2826 case arith_expr:
2827 com_arith_expr(c, n);
2828 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002829 case term:
2830 com_term(c, n);
2831 break;
2832 case factor:
2833 com_factor(c, n);
2834 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00002835 case power:
2836 com_power(c, n);
2837 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002838 case atom:
2839 com_atom(c, n);
2840 break;
2841
2842 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002843 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002844 com_error(c, PyExc_SystemError,
2845 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002846 }
2847}
2848
Tim Petersdbd9ba62000-07-09 03:09:57 +00002849static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002850
2851static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002852com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002853{
2854 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
2855 if (TYPE(CHILD(n, 0)) == LPAR)
2856 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002857 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002858 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002859 com_pop(c, 1);
2860 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002861}
2862
2863static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002864com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002865{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00002866 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002867 if (NCH(n) == 1) {
2868 com_fpdef(c, CHILD(n, 0));
2869 }
2870 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002871 int i = (NCH(n)+1)/2;
2872 com_addoparg(c, UNPACK_TUPLE, i);
2873 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002874 for (i = 0; i < NCH(n); i += 2)
2875 com_fpdef(c, CHILD(n, i));
2876 }
2877}
2878
2879static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002880com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002881{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002882 int nch, i;
2883 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00002884 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002885 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00002886 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002887 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002888 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002889 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002890 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002891 node *ch = CHILD(n, i);
2892 node *fp;
2893 char *name;
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00002894 PyObject *nameval;
Guido van Rossum50564e81996-01-12 01:13:16 +00002895 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002896 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002897 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
2898 fp = CHILD(ch, 0);
2899 if (TYPE(fp) == NAME)
2900 name = STR(fp);
2901 else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00002902 name = nbuf;
2903 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00002904 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002905 }
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00002906 nameval = PyString_InternFromString(name);
2907 if (nameval == NULL) {
2908 c->c_errors++;
2909 }
Peter Schneider-Kamp9a5086c2000-07-13 06:24:29 +00002910 if (PyDict_GetItem(c->c_locals, nameval)) {
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00002911 com_error(c, PyExc_SyntaxError,"duplicate argument in function definition");
2912 }
2913 com_newlocal_o(c, nameval);
2914 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002915 c->c_argcount++;
2916 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002917 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002918 ch = CHILD(n, i);
2919 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002920 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002921 else
2922 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002923 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002924 /* Handle *arguments */
2925 if (i < nch) {
2926 node *ch;
2927 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00002928 if (TYPE(ch) != DOUBLESTAR) {
2929 REQ(ch, STAR);
2930 ch = CHILD(n, i+1);
2931 if (TYPE(ch) == NAME) {
2932 c->c_flags |= CO_VARARGS;
2933 i += 3;
2934 com_newlocal(c, STR(ch));
2935 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002936 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002937 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002938 /* Handle **keywords */
2939 if (i < nch) {
2940 node *ch;
2941 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00002942 if (TYPE(ch) != DOUBLESTAR) {
2943 REQ(ch, STAR);
2944 ch = CHILD(n, i+1);
2945 REQ(ch, STAR);
2946 ch = CHILD(n, i+2);
2947 }
2948 else
2949 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002950 REQ(ch, NAME);
2951 c->c_flags |= CO_VARKEYWORDS;
2952 com_newlocal(c, STR(ch));
2953 }
2954 if (complex) {
2955 /* Generate code for complex arguments only after
2956 having counted the simple arguments */
2957 int ilocal = 0;
2958 for (i = 0; i < nch; i++) {
2959 node *ch = CHILD(n, i);
2960 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00002961 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002962 break;
2963 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
2964 fp = CHILD(ch, 0);
2965 if (TYPE(fp) != NAME) {
2966 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002967 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002968 com_fpdef(c, ch);
2969 }
2970 ilocal++;
2971 if (++i >= nch)
2972 break;
2973 ch = CHILD(n, i);
2974 if (TYPE(ch) == EQUAL)
2975 i += 2;
2976 else
2977 REQ(ch, COMMA);
2978 }
2979 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002980}
2981
2982static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002983com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002984{
2985 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002986 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002987 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002988 doc = get_docstring(n);
2989 if (doc != NULL) {
2990 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002991 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002992 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002993 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002994 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00002995 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002996 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002997 for (i = 0; i < NCH(n); i++) {
2998 node *ch = CHILD(n, i);
2999 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3000 com_node(c, ch);
3001 }
3002}
3003
3004/* Top-level compile-node interface */
3005
3006static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003007compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003008{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003009 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003010 node *ch;
3011 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003012 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003013 doc = get_docstring(CHILD(n, 4));
3014 if (doc != NULL) {
3015 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003016 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003017 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003018 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003019 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003020 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3021 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003022 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003023 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003024 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003025 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003026 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003027 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003028 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003029 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003030 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003031}
3032
3033static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003034compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003035{
Guido van Rossum590baa41993-11-30 13:40:46 +00003036 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003037 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003038 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003039
3040 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003041 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003042 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003043 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003044 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003045 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003046 else
3047 ch = CHILD(n, 2);
3048 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003049 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003050 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003051}
3052
3053static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003054compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003055{
3056 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003057 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003058 REQ(n, classdef);
3059 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3060 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003061#ifdef PRIVATE_NAME_MANGLING
3062 c->c_private = c->c_name;
3063#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003064 ch = CHILD(n, NCH(n)-1); /* The suite */
3065 doc = get_docstring(ch);
3066 if (doc != NULL) {
3067 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003068 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003069 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003070 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003071 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003072 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003073 }
3074 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003075 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003076 com_node(c, ch);
3077 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003078 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003079 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003080 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003081}
3082
3083static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003084compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003085{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003086 com_addoparg(c, SET_LINENO, n->n_lineno);
3087
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003088 switch (TYPE(n)) {
3089
Guido van Rossum4c417781991-01-21 16:09:22 +00003090 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003091 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003092 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003093 n = CHILD(n, 0);
3094 if (TYPE(n) != NEWLINE)
3095 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003096 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003097 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003098 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003099 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003100 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003101 break;
3102
Guido van Rossum4c417781991-01-21 16:09:22 +00003103 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003104 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003105 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003106 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003107 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003108 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003109 break;
3110
Guido van Rossum590baa41993-11-30 13:40:46 +00003111 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003112 com_node(c, CHILD(n, 0));
3113 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003114 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003115 break;
3116
Guido van Rossum590baa41993-11-30 13:40:46 +00003117 case lambdef: /* anonymous function definition */
3118 compile_lambdef(c, n);
3119 break;
3120
Guido van Rossum4c417781991-01-21 16:09:22 +00003121 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003122 compile_funcdef(c, n);
3123 break;
3124
Guido van Rossum4c417781991-01-21 16:09:22 +00003125 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003126 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003127 break;
3128
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003129 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003130 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003131 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003132 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003133 }
3134}
3135
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003136/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00003137
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003138 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
3139 instructions that refer to local variables with LOAD_FAST etc.
3140 The latter instructions are much faster because they don't need to
3141 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003142
Guido van Rossum681d79a1995-07-18 14:51:37 +00003143 To find all local variables, we check all STORE_NAME, IMPORT_FROM
3144 and DELETE_NAME instructions. This yields all local variables,
3145 function definitions, class definitions and import statements.
3146 Argument names have already been entered into the list by the
3147 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003148
3149 All remaining LOAD_NAME instructions must refer to non-local (global
3150 or builtin) variables, so are replaced by LOAD_GLOBAL.
3151
3152 There are two problems: 'from foo import *' and 'exec' may introduce
3153 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00003154 case, we can still optimize bona fide locals (since those
3155 statements will be surrounded by fast_2_locals() and
3156 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003157
Guido van Rossum681d79a1995-07-18 14:51:37 +00003158 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00003159
3160static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003161optimize(struct compiling *c)
Guido van Rossum282914b1991-04-04 10:42:56 +00003162{
Guido van Rossum0a697f61991-04-16 08:39:12 +00003163 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00003164 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00003165 int oparg = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003166 PyObject *name;
3167 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003168
Guido van Rossum282914b1991-04-04 10:42:56 +00003169#define NEXTOP() (*next_instr++)
3170#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossum79f25d91997-04-29 20:08:16 +00003171#define GETITEM(v, i) (PyList_GetItem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003172#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
3173
Guido van Rossum79f25d91997-04-29 20:08:16 +00003174 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003175
3176 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00003177
Guido van Rossum79f25d91997-04-29 20:08:16 +00003178 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003179 for (;;) {
3180 opcode = NEXTOP();
3181 if (opcode == STOP_CODE)
3182 break;
3183 if (HAS_ARG(opcode))
3184 oparg = NEXTARG();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003185 switch (opcode) {
3186 case STORE_NAME:
3187 case DELETE_NAME:
3188 case IMPORT_FROM:
3189 com_addlocal_o(c, GETNAMEOBJ(oparg));
3190 break;
3191 case EXEC_STMT:
3192 c->c_flags &= ~CO_OPTIMIZED;
3193 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00003194 }
3195 }
3196
Guido van Rossum79f25d91997-04-29 20:08:16 +00003197 if (PyDict_GetItemString(c->c_locals, "*") != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003198 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003199
Guido van Rossum79f25d91997-04-29 20:08:16 +00003200 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003201 for (;;) {
3202 cur_instr = next_instr;
3203 opcode = NEXTOP();
3204 if (opcode == STOP_CODE)
3205 break;
3206 if (HAS_ARG(opcode))
3207 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003208 if (opcode == LOAD_NAME ||
3209 opcode == STORE_NAME ||
3210 opcode == DELETE_NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003211 PyObject *v;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003212 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00003213 name = GETNAMEOBJ(oparg);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003214 v = PyDict_GetItem(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003215 if (v == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003216 if (opcode == LOAD_NAME &&
3217 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003218 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003219 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00003220 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003221 i = PyInt_AsLong(v);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003222 switch (opcode) {
3223 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
3224 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
3225 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
3226 }
3227 cur_instr[1] = i & 0xff;
3228 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00003229 }
3230 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003231
Guido van Rossum681d79a1995-07-18 14:51:37 +00003232 if (c->c_errors == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00003233 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00003234}
3235
Guido van Rossum79f25d91997-04-29 20:08:16 +00003236PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003237PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003238{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003239 return jcompile(n, filename, NULL);
3240}
3241
Guido van Rossum79f25d91997-04-29 20:08:16 +00003242static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003243icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003244{
3245 return jcompile(n, base->c_filename, base);
3246}
3247
Guido van Rossum79f25d91997-04-29 20:08:16 +00003248static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003249jcompile(node *n, char *filename, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003250{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003251 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003252 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003253 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003254 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003255#ifdef PRIVATE_NAME_MANGLING
3256 if (base)
3257 sc.c_private = base->c_private;
3258 else
3259 sc.c_private = NULL;
3260#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003261 compile_node(&sc, n);
3262 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003263 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003264 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003265 sc.c_flags |= CO_NEWLOCALS;
3266 }
3267 else if (TYPE(n) == classdef)
3268 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00003269 co = NULL;
3270 if (sc.c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003271 PyObject *consts, *names, *varnames, *filename, *name;
3272 consts = PyList_AsTuple(sc.c_consts);
3273 names = PyList_AsTuple(sc.c_names);
3274 varnames = PyList_AsTuple(sc.c_varnames);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003275 filename = PyString_InternFromString(sc.c_filename);
3276 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003277 if (!PyErr_Occurred())
3278 co = PyCode_New(sc.c_argcount,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003279 sc.c_nlocals,
Guido van Rossum8b993a91997-01-17 21:04:03 +00003280 sc.c_maxstacklevel,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003281 sc.c_flags,
3282 sc.c_code,
3283 consts,
3284 names,
3285 varnames,
3286 filename,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003287 name,
3288 sc.c_firstlineno,
3289 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003290 Py_XDECREF(consts);
3291 Py_XDECREF(names);
3292 Py_XDECREF(varnames);
3293 Py_XDECREF(filename);
3294 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003295 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003296 else if (!PyErr_Occurred()) {
3297 /* This could happen if someone called PyErr_Clear() after an
3298 error was reported above. That's not supposed to happen,
3299 but I just plugged one case and I'm not sure there can't be
3300 others. In that case, raise SystemError so that at least
3301 it gets reported instead dumping core. */
3302 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3303 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003304 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003305 return co;
3306}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003307
3308int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003309PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003310{
3311 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003312 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003313 int line = co->co_firstlineno;
3314 int addr = 0;
3315 while (--size >= 0) {
3316 addr += *p++;
3317 if (addr > addrq)
3318 break;
3319 line += *p++;
3320 }
3321 return line;
3322}