blob: b76586ccb99b5ea9a26b99adfc2ccf2fa23bdba8 [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 */
1252 /* Make it is a simple slice.
Guido van Rossum8b993a91997-01-17 21:04:03 +00001253 Should have exactly one colon. */
Guido van Rossum8861b741996-07-30 16:49:37 +00001254 if ((TYPE(CHILD(sub, 0)) == COLON
1255 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
Guido van Rossum8b993a91997-01-17 21:04:03 +00001256 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1257 {
Guido van Rossum8861b741996-07-30 16:49:37 +00001258 if (assigning == OP_APPLY)
1259 op = SLICE;
1260 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001261 op = ((assigning == OP_ASSIGN) ?
1262 STORE_SLICE : DELETE_SLICE);
Guido van Rossum8861b741996-07-30 16:49:37 +00001263 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001264 if (op == STORE_SLICE)
1265 com_pop(c, 2);
1266 else if (op == DELETE_SLICE)
1267 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001268 return;
1269 }
1270 }
1271 /* Else normal subscriptlist. Compile each subscript. */
1272 for (i = 0; i < NCH(n); i += 2)
1273 com_subscript(c, CHILD(n, i));
1274 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001275 if (NCH(n) > 1) {
1276 i = (NCH(n)+1) / 2;
1277 com_addoparg(c, BUILD_TUPLE, i);
1278 com_pop(c, i-1);
1279 }
1280 if (assigning == OP_APPLY) {
Guido van Rossum8861b741996-07-30 16:49:37 +00001281 op = BINARY_SUBSCR;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001282 i = 1;
1283 }
1284 else if (assigning == OP_ASSIGN) {
1285 op = STORE_SUBSCR;
1286 i = 3;
1287 }
1288 else {
1289 op = DELETE_SUBSCR;
1290 i = 2;
1291 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001292 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001293 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001294}
1295
1296static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001297com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001298{
1299 REQ(n, trailer);
1300 switch (TYPE(CHILD(n, 0))) {
1301 case LPAR:
1302 com_call_function(c, CHILD(n, 1));
1303 break;
1304 case DOT:
1305 com_select_member(c, CHILD(n, 1));
1306 break;
1307 case LSQB:
Guido van Rossum8861b741996-07-30 16:49:37 +00001308 com_subscriptlist(c, CHILD(n, 1), OP_APPLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001309 break;
1310 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001311 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001312 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001313 }
1314}
1315
1316static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001317com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001318{
1319 int i;
1320 REQ(n, power);
1321 com_atom(c, CHILD(n, 0));
1322 for (i = 1; i < NCH(n); i++) {
1323 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1324 com_factor(c, CHILD(n, i+1));
1325 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001326 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001327 break;
1328 }
1329 else
1330 com_apply_trailer(c, CHILD(n, i));
1331 }
1332}
1333
1334static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001335com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001336{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001337 REQ(n, factor);
1338 if (TYPE(CHILD(n, 0)) == PLUS) {
1339 com_factor(c, CHILD(n, 1));
1340 com_addbyte(c, UNARY_POSITIVE);
1341 }
1342 else if (TYPE(CHILD(n, 0)) == MINUS) {
1343 com_factor(c, CHILD(n, 1));
1344 com_addbyte(c, UNARY_NEGATIVE);
1345 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001346 else if (TYPE(CHILD(n, 0)) == TILDE) {
1347 com_factor(c, CHILD(n, 1));
1348 com_addbyte(c, UNARY_INVERT);
1349 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001350 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001351 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001352 }
1353}
1354
1355static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001356com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001357{
1358 int i;
1359 int op;
1360 REQ(n, term);
1361 com_factor(c, CHILD(n, 0));
1362 for (i = 2; i < NCH(n); i += 2) {
1363 com_factor(c, CHILD(n, i));
1364 switch (TYPE(CHILD(n, i-1))) {
1365 case STAR:
1366 op = BINARY_MULTIPLY;
1367 break;
1368 case SLASH:
1369 op = BINARY_DIVIDE;
1370 break;
1371 case PERCENT:
1372 op = BINARY_MODULO;
1373 break;
1374 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001375 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001376 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001377 op = 255;
1378 }
1379 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001380 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001381 }
1382}
1383
1384static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001385com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001386{
1387 int i;
1388 int op;
1389 REQ(n, arith_expr);
1390 com_term(c, CHILD(n, 0));
1391 for (i = 2; i < NCH(n); i += 2) {
1392 com_term(c, CHILD(n, i));
1393 switch (TYPE(CHILD(n, i-1))) {
1394 case PLUS:
1395 op = BINARY_ADD;
1396 break;
1397 case MINUS:
1398 op = BINARY_SUBTRACT;
1399 break;
1400 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001401 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001402 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001403 op = 255;
1404 }
1405 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001406 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001407 }
1408}
1409
1410static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001411com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001412{
1413 int i;
1414 int op;
1415 REQ(n, shift_expr);
1416 com_arith_expr(c, CHILD(n, 0));
1417 for (i = 2; i < NCH(n); i += 2) {
1418 com_arith_expr(c, CHILD(n, i));
1419 switch (TYPE(CHILD(n, i-1))) {
1420 case LEFTSHIFT:
1421 op = BINARY_LSHIFT;
1422 break;
1423 case RIGHTSHIFT:
1424 op = BINARY_RSHIFT;
1425 break;
1426 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001427 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001428 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001429 op = 255;
1430 }
1431 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001432 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001433 }
1434}
1435
1436static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001437com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001438{
1439 int i;
1440 int op;
1441 REQ(n, and_expr);
1442 com_shift_expr(c, CHILD(n, 0));
1443 for (i = 2; i < NCH(n); i += 2) {
1444 com_shift_expr(c, CHILD(n, i));
1445 if (TYPE(CHILD(n, i-1)) == AMPER) {
1446 op = BINARY_AND;
1447 }
1448 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001449 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001450 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001451 op = 255;
1452 }
1453 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001454 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001455 }
1456}
1457
1458static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001459com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001460{
1461 int i;
1462 int op;
1463 REQ(n, xor_expr);
1464 com_and_expr(c, CHILD(n, 0));
1465 for (i = 2; i < NCH(n); i += 2) {
1466 com_and_expr(c, CHILD(n, i));
1467 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1468 op = BINARY_XOR;
1469 }
1470 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001471 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001472 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001473 op = 255;
1474 }
1475 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001476 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001477 }
1478}
1479
1480static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001481com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001482{
1483 int i;
1484 int op;
1485 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001486 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001487 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001488 com_xor_expr(c, CHILD(n, i));
1489 if (TYPE(CHILD(n, i-1)) == VBAR) {
1490 op = BINARY_OR;
1491 }
1492 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001493 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001494 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001495 op = 255;
1496 }
1497 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001498 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001499 }
1500}
1501
1502static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001503cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001504{
1505 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001506 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001507 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1508 if (NCH(n) == 1) {
1509 n = CHILD(n, 0);
1510 switch (TYPE(n)) {
1511 case LESS: return LT;
1512 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001513 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001514 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001515 case LESSEQUAL: return LE;
1516 case GREATEREQUAL: return GE;
1517 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001518 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1519 if (strcmp(STR(n), "is") == 0) return IS;
1520 }
1521 }
1522 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001523 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001524 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1525 return NOT_IN;
1526 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1527 return IS_NOT;
1528 }
1529 }
1530 return BAD;
1531}
1532
1533static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001534com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001535{
1536 int i;
1537 enum cmp_op op;
1538 int anchor;
1539 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1540 com_expr(c, CHILD(n, 0));
1541 if (NCH(n) == 1)
1542 return;
1543
1544 /****************************************************************
1545 The following code is generated for all but the last
1546 comparison in a chain:
1547
1548 label: on stack: opcode: jump to:
1549
1550 a <code to load b>
1551 a, b DUP_TOP
1552 a, b, b ROT_THREE
1553 b, a, b COMPARE_OP
1554 b, 0-or-1 JUMP_IF_FALSE L1
1555 b, 1 POP_TOP
1556 b
1557
1558 We are now ready to repeat this sequence for the next
1559 comparison in the chain.
1560
1561 For the last we generate:
1562
1563 b <code to load c>
1564 b, c COMPARE_OP
1565 0-or-1
1566
1567 If there were any jumps to L1 (i.e., there was more than one
1568 comparison), we generate:
1569
1570 0-or-1 JUMP_FORWARD L2
1571 L1: b, 0 ROT_TWO
1572 0, b POP_TOP
1573 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00001574 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001575 ****************************************************************/
1576
1577 anchor = 0;
1578
1579 for (i = 2; i < NCH(n); i += 2) {
1580 com_expr(c, CHILD(n, i));
1581 if (i+2 < NCH(n)) {
1582 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001583 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001584 com_addbyte(c, ROT_THREE);
1585 }
1586 op = cmp_type(CHILD(n, i-1));
1587 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001588 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001589 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001590 }
1591 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001592 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001593 if (i+2 < NCH(n)) {
1594 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1595 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001596 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001597 }
1598 }
1599
1600 if (anchor) {
1601 int anchor2 = 0;
1602 com_addfwref(c, JUMP_FORWARD, &anchor2);
1603 com_backpatch(c, anchor);
1604 com_addbyte(c, ROT_TWO);
1605 com_addbyte(c, POP_TOP);
1606 com_backpatch(c, anchor2);
1607 }
1608}
1609
1610static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001611com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001612{
1613 REQ(n, not_test); /* 'not' not_test | comparison */
1614 if (NCH(n) == 1) {
1615 com_comparison(c, CHILD(n, 0));
1616 }
1617 else {
1618 com_not_test(c, CHILD(n, 1));
1619 com_addbyte(c, UNARY_NOT);
1620 }
1621}
1622
1623static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001624com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001625{
1626 int i;
1627 int anchor;
1628 REQ(n, and_test); /* not_test ('and' not_test)* */
1629 anchor = 0;
1630 i = 0;
1631 for (;;) {
1632 com_not_test(c, CHILD(n, i));
1633 if ((i += 2) >= NCH(n))
1634 break;
1635 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1636 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001637 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001638 }
1639 if (anchor)
1640 com_backpatch(c, anchor);
1641}
1642
1643static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001644com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001645{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001646 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00001647 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001648 PyObject *v;
Guido van Rossum57531fe1993-11-30 14:57:42 +00001649 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001650 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001651 v = (PyObject *) icompile(CHILD(n, 0), c);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001652 if (v == NULL) {
1653 c->c_errors++;
1654 i = 255;
1655 }
1656 else {
1657 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001658 Py_DECREF(v);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001659 }
1660 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001661 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001662 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001663 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001664 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001665 else {
1666 int anchor = 0;
1667 int i = 0;
1668 for (;;) {
1669 com_and_test(c, CHILD(n, i));
1670 if ((i += 2) >= NCH(n))
1671 break;
1672 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1673 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001674 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001675 }
1676 if (anchor)
1677 com_backpatch(c, anchor);
1678 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001679}
1680
1681static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001682com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001683{
1684 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001685 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001686 com_node(c, CHILD(n, 0));
1687 }
1688 else {
1689 int i;
1690 int len;
1691 len = (NCH(n) + 1) / 2;
1692 for (i = 0; i < NCH(n); i += 2)
1693 com_node(c, CHILD(n, i));
1694 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001695 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001696 }
1697}
1698
1699
1700/* Begin of assignment compilation */
1701
Tim Petersdbd9ba62000-07-09 03:09:57 +00001702static void com_assign_name(struct compiling *, node *, int);
1703static void com_assign(struct compiling *, node *, int);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001704
1705static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001706com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001707{
1708 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001709 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001710}
1711
1712static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001713com_assign_trailer(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001714{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001715 REQ(n, trailer);
1716 switch (TYPE(CHILD(n, 0))) {
1717 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001718 com_error(c, PyExc_SyntaxError,
1719 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001720 break;
1721 case DOT: /* '.' NAME */
1722 com_assign_attr(c, CHILD(n, 1), assigning);
1723 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001724 case LSQB: /* '[' subscriptlist ']' */
1725 com_subscriptlist(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001726 break;
1727 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001728 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001729 }
1730}
1731
1732static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001733com_assign_tuple(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001734{
1735 int i;
1736 if (TYPE(n) != testlist)
1737 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001738 if (assigning) {
1739 i = (NCH(n)+1)/2;
1740 com_addoparg(c, UNPACK_TUPLE, i);
1741 com_push(c, i-1);
1742 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001743 for (i = 0; i < NCH(n); i += 2)
1744 com_assign(c, CHILD(n, i), assigning);
1745}
1746
1747static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001748com_assign_list(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001749{
1750 int i;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001751 if (assigning) {
1752 i = (NCH(n)+1)/2;
1753 com_addoparg(c, UNPACK_LIST, i);
1754 com_push(c, i-1);
1755 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001756 for (i = 0; i < NCH(n); i += 2)
1757 com_assign(c, CHILD(n, i), assigning);
1758}
1759
1760static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001761com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001762{
1763 REQ(n, NAME);
1764 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001765 if (assigning)
1766 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001767}
1768
1769static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001770com_assign(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001771{
1772 /* Loop to avoid trivial recursion */
1773 for (;;) {
1774 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001775
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001776 case exprlist:
1777 case testlist:
1778 if (NCH(n) > 1) {
1779 com_assign_tuple(c, n, assigning);
1780 return;
1781 }
1782 n = CHILD(n, 0);
1783 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001784
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001785 case test:
1786 case and_test:
1787 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001788 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001789 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001790 case xor_expr:
1791 case and_expr:
1792 case shift_expr:
1793 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001794 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00001795 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001796 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001797 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001798 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001799 return;
1800 }
1801 n = CHILD(n, 0);
1802 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001803
Guido van Rossum50564e81996-01-12 01:13:16 +00001804 case power: /* atom trailer* ('**' power)* */
1805/* ('+'|'-'|'~') factor | atom trailer* */
1806 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001807 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001808 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001809 return;
1810 }
Guido van Rossum50564e81996-01-12 01:13:16 +00001811 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001812 int i;
1813 com_node(c, CHILD(n, 0));
1814 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00001815 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001816 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001817 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00001818 return;
1819 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001820 com_apply_trailer(c, CHILD(n, i));
1821 } /* NB i is still alive */
1822 com_assign_trailer(c,
1823 CHILD(n, i), assigning);
1824 return;
1825 }
1826 n = CHILD(n, 0);
1827 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001828
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001829 case atom:
1830 switch (TYPE(CHILD(n, 0))) {
1831 case LPAR:
1832 n = CHILD(n, 1);
1833 if (TYPE(n) == RPAR) {
1834 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001835 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001836 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001837 return;
1838 }
1839 break;
1840 case LSQB:
1841 n = CHILD(n, 1);
1842 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001843 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001844 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001845 return;
1846 }
1847 com_assign_list(c, n, assigning);
1848 return;
1849 case NAME:
1850 com_assign_name(c, CHILD(n, 0), assigning);
1851 return;
1852 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001853 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001854 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001855 return;
1856 }
1857 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001858
1859 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001860 com_error(c, PyExc_SyntaxError,
1861 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001862 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001863
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001864 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001865 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001866 com_error(c, PyExc_SystemError,
1867 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001868 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001869
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001870 }
1871 }
1872}
Guido van Rossum7c531111997-03-11 18:42:21 +00001873
Tim Petersdbd9ba62000-07-09 03:09:57 +00001874/* Forward */ static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001875
1876static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001877com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001878{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001879 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001880 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001881 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001882 return;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001883 com_node(c, CHILD(n, NCH(n)-1));
1884 if (NCH(n) == 1) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001885 if (c->c_interactive)
1886 com_addbyte(c, PRINT_EXPR);
1887 else
1888 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001889 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001890 }
1891 else {
1892 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001893 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001894 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001895 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001896 com_push(c, 1);
1897 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001898 com_assign(c, CHILD(n, i), OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001899 }
1900 }
1901}
1902
1903static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001904com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00001905{
1906 int a = 0, b = 0;
1907 int i;
1908 REQ(n, assert_stmt); /* 'assert' test [',' test] */
1909 /* Generate code like for
1910
1911 if __debug__:
1912 if not <test>:
1913 raise AssertionError [, <message>]
1914
1915 where <message> is the second test, if present.
1916 */
1917 if (Py_OptimizeFlag)
1918 return;
1919 com_addopnamestr(c, LOAD_GLOBAL, "__debug__");
1920 com_push(c, 1);
1921 com_addfwref(c, JUMP_IF_FALSE, &a);
1922 com_addbyte(c, POP_TOP);
1923 com_pop(c, 1);
1924 com_node(c, CHILD(n, 1));
1925 com_addfwref(c, JUMP_IF_TRUE, &b);
1926 com_addbyte(c, POP_TOP);
1927 com_pop(c, 1);
1928 /* Raise that exception! */
1929 com_addopnamestr(c, LOAD_GLOBAL, "AssertionError");
1930 com_push(c, 1);
1931 i = NCH(n)/2; /* Either 2 or 4 */
1932 if (i > 1)
1933 com_node(c, CHILD(n, 3));
1934 com_addoparg(c, RAISE_VARARGS, i);
1935 com_pop(c, i);
1936 /* The interpreter does not fall through */
1937 /* All jumps converge here */
1938 com_backpatch(c, a);
1939 com_backpatch(c, b);
1940 com_addbyte(c, POP_TOP);
1941}
1942
1943static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001944com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001945{
1946 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001947 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
1948 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001949 com_node(c, CHILD(n, i));
1950 com_addbyte(c, PRINT_ITEM);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001951 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001952 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001953 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001954 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001955 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001956}
1957
1958static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001959com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001960{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001961 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001962 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001963 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001964 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001965 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001966 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001967 com_push(c, 1);
1968 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001969 else
1970 com_node(c, CHILD(n, 1));
1971 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001972 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001973}
1974
1975static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001976com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001977{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001978 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00001979 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
1980 if (NCH(n) > 1) {
1981 com_node(c, CHILD(n, 1));
1982 if (NCH(n) > 3) {
1983 com_node(c, CHILD(n, 3));
1984 if (NCH(n) > 5)
1985 com_node(c, CHILD(n, 5));
1986 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001987 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001988 i = NCH(n)/2;
1989 com_addoparg(c, RAISE_VARARGS, i);
1990 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001991}
1992
1993static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001994com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001995{
1996 int i;
1997 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001998 /* 'import' dotted_name (',' dotted_name)* |
1999 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002000 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002001 /* 'from' dotted_name 'import' ... */
2002 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002003 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002004 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002005 for (i = 3; i < NCH(n); i += 2)
2006 com_addopname(c, IMPORT_FROM, CHILD(n, i));
2007 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002008 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002009 }
2010 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002011 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002012 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002013 REQ(CHILD(n, i), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002014 com_addopname(c, IMPORT_NAME, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002015 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002016 com_addopname(c, STORE_NAME, CHILD(CHILD(n, i), 0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002017 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002018 }
2019 }
2020}
2021
2022static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002023com_global_stmt(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002024{
2025 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002026 REQ(n, global_stmt);
2027 /* 'global' NAME (',' NAME)* */
2028 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002029 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002030#ifdef PRIVATE_NAME_MANGLING
2031 char buffer[256];
2032 if (s != NULL && s[0] == '_' && s[1] == '_' &&
2033 c->c_private != NULL &&
Guido van Rossum582acec2000-06-28 22:07:35 +00002034 com_mangle(c, s, buffer, sizeof(buffer)))
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002035 s = buffer;
2036#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +00002037 if (PyDict_GetItemString(c->c_locals, s) != NULL) {
2038 com_error(c, PyExc_SyntaxError,
2039 "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002040 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002041 else if (PyDict_SetItemString(c->c_globals, s, Py_None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002042 c->c_errors++;
2043 }
2044}
2045
Guido van Rossum681d79a1995-07-18 14:51:37 +00002046static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002047com_newlocal_o(struct compiling *c, PyObject *nameval)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002048{
2049 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002050 PyObject *ival;
2051 if (PyList_Size(c->c_varnames) != c->c_nlocals) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002052 /* This is usually caused by an error on a previous call */
2053 if (c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002054 com_error(c, PyExc_SystemError,
2055 "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002056 }
2057 return 0;
2058 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002059 ival = PyInt_FromLong(i = c->c_nlocals++);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002060 if (ival == NULL)
2061 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002062 else if (PyDict_SetItem(c->c_locals, nameval, ival) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002063 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002064 else if (PyList_Append(c->c_varnames, nameval) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002065 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002066 Py_XDECREF(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002067 return i;
2068}
2069
2070static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002071com_addlocal_o(struct compiling *c, PyObject *nameval)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002072{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002073 PyObject *ival = PyDict_GetItem(c->c_locals, nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002074 if (ival != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002075 return PyInt_AsLong(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002076 return com_newlocal_o(c, nameval);
2077}
2078
2079static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002080com_newlocal(struct compiling *c, char *name)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002081{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002082 PyObject *nameval = PyString_InternFromString(name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002083 int i;
2084 if (nameval == NULL) {
2085 c->c_errors++;
2086 return 0;
2087 }
2088 i = com_newlocal_o(c, nameval);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002089 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002090 return i;
2091}
2092
Guido van Rossumc5e96291991-12-10 13:53:51 +00002093static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002094com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002095{
2096 REQ(n, exec_stmt);
2097 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2098 com_node(c, CHILD(n, 1));
2099 if (NCH(n) >= 4)
2100 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002101 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002102 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002103 com_push(c, 1);
2104 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002105 if (NCH(n) >= 6)
2106 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002107 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002108 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002109 com_push(c, 1);
2110 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002111 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002112 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002113}
2114
Guido van Rossum7c531111997-03-11 18:42:21 +00002115static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002116is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002117{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002118 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002119 int i;
2120
2121 /* Label to avoid tail recursion */
2122 next:
2123 switch (TYPE(n)) {
2124
2125 case suite:
2126 if (NCH(n) == 1) {
2127 n = CHILD(n, 0);
2128 goto next;
2129 }
2130 /* Fall through */
2131 case file_input:
2132 for (i = 0; i < NCH(n); i++) {
2133 node *ch = CHILD(n, i);
2134 if (TYPE(ch) == stmt) {
2135 n = ch;
2136 goto next;
2137 }
2138 }
2139 break;
2140
2141 case stmt:
2142 case simple_stmt:
2143 case small_stmt:
2144 n = CHILD(n, 0);
2145 goto next;
2146
2147 case expr_stmt:
2148 case testlist:
2149 case test:
2150 case and_test:
2151 case not_test:
2152 case comparison:
2153 case expr:
2154 case xor_expr:
2155 case and_expr:
2156 case shift_expr:
2157 case arith_expr:
2158 case term:
2159 case factor:
2160 case power:
2161 case atom:
2162 if (NCH(n) == 1) {
2163 n = CHILD(n, 0);
2164 goto next;
2165 }
2166 break;
2167
2168 case NAME:
2169 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2170 return 1;
2171 break;
2172
2173 case NUMBER:
2174 v = parsenumber(c, STR(n));
2175 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002176 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002177 break;
2178 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002179 i = PyObject_IsTrue(v);
2180 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002181 return i == 0;
2182
2183 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002184 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002185 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002186 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002187 break;
2188 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002189 i = PyObject_IsTrue(v);
2190 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002191 return i == 0;
2192
2193 }
2194 return 0;
2195}
2196
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002197static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002198com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002199{
2200 int i;
2201 int anchor = 0;
2202 REQ(n, if_stmt);
2203 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2204 for (i = 0; i+3 < NCH(n); i+=4) {
2205 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002206 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002207 if (is_constant_false(c, ch))
2208 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002209 if (i > 0)
2210 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002211 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002212 com_addfwref(c, JUMP_IF_FALSE, &a);
2213 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002214 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002215 com_node(c, CHILD(n, i+3));
2216 com_addfwref(c, JUMP_FORWARD, &anchor);
2217 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002218 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002219 com_addbyte(c, POP_TOP);
2220 }
2221 if (i+2 < NCH(n))
2222 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002223 if (anchor)
2224 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002225}
2226
2227static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002228com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002229{
2230 int break_anchor = 0;
2231 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002232 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002233 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2234 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002235 block_push(c, SETUP_LOOP);
2236 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002237 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002238 com_node(c, CHILD(n, 1));
2239 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2240 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002241 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002242 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002243 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002244 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002245 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2246 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002247 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002248 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002249 com_addbyte(c, POP_TOP);
2250 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002251 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002252 if (NCH(n) > 4)
2253 com_node(c, CHILD(n, 6));
2254 com_backpatch(c, break_anchor);
2255}
2256
2257static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002258com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002259{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002260 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002261 int break_anchor = 0;
2262 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002263 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002264 REQ(n, for_stmt);
2265 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2266 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002267 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002268 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002269 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002270 if (v == NULL)
2271 c->c_errors++;
2272 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002273 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002274 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002275 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002276 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002277 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002278 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002279 com_assign(c, CHILD(n, 1), OP_ASSIGN);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002280 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002281 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002282 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002283 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2284 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002285 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002286 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002287 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002288 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002289 if (NCH(n) > 8)
2290 com_node(c, CHILD(n, 8));
2291 com_backpatch(c, break_anchor);
2292}
2293
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002294/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002295
2296 SETUP_FINALLY L
2297 <code for S>
2298 POP_BLOCK
2299 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002300 L: <code for Sf>
2301 END_FINALLY
2302
2303 The special instructions use the block stack. Each block
2304 stack entry contains the instruction that created it (here
2305 SETUP_FINALLY), the level of the value stack at the time the
2306 block stack entry was created, and a label (here L).
2307
2308 SETUP_FINALLY:
2309 Pushes the current value stack level and the label
2310 onto the block stack.
2311 POP_BLOCK:
2312 Pops en entry from the block stack, and pops the value
2313 stack until its level is the same as indicated on the
2314 block stack. (The label is ignored.)
2315 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002316 Pops a variable number of entries from the *value* stack
2317 and re-raises the exception they specify. The number of
2318 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002319
2320 The block stack is unwound when an exception is raised:
2321 when a SETUP_FINALLY entry is found, the exception is pushed
2322 onto the value stack (and the exception condition is cleared),
2323 and the interpreter jumps to the label gotten from the block
2324 stack.
2325
2326 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002327 (The contents of the value stack is shown in [], with the top
2328 at the right; 'tb' is trace-back info, 'val' the exception's
2329 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002330
2331 Value stack Label Instruction Argument
2332 [] SETUP_EXCEPT L1
2333 [] <code for S>
2334 [] POP_BLOCK
2335 [] JUMP_FORWARD L0
2336
Guido van Rossum3f5da241990-12-20 15:06:42 +00002337 [tb, val, exc] L1: DUP )
2338 [tb, val, exc, exc] <evaluate E1> )
2339 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2340 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2341 [tb, val, exc, 1] POP )
2342 [tb, val, exc] POP
2343 [tb, val] <assign to V1> (or POP if no V1)
2344 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002345 [] <code for S1>
2346 JUMP_FORWARD L0
2347
Guido van Rossum3f5da241990-12-20 15:06:42 +00002348 [tb, val, exc, 0] L2: POP
2349 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002350 .............................etc.......................
2351
Guido van Rossum3f5da241990-12-20 15:06:42 +00002352 [tb, val, exc, 0] Ln+1: POP
2353 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002354
2355 [] L0: <next statement>
2356
2357 Of course, parts are not generated if Vi or Ei is not present.
2358*/
2359
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002360static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002361com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002362{
2363 int except_anchor = 0;
2364 int end_anchor = 0;
2365 int else_anchor = 0;
2366 int i;
2367 node *ch;
2368
2369 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2370 block_push(c, SETUP_EXCEPT);
2371 com_node(c, CHILD(n, 2));
2372 com_addbyte(c, POP_BLOCK);
2373 block_pop(c, SETUP_EXCEPT);
2374 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2375 com_backpatch(c, except_anchor);
2376 for (i = 3;
2377 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2378 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002379 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002380 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002381 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002382 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002383 break;
2384 }
2385 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002386 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002387 com_addoparg(c, SET_LINENO, ch->n_lineno);
2388 if (NCH(ch) > 1) {
2389 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002390 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002391 com_node(c, CHILD(ch, 1));
2392 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002393 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002394 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2395 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002396 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002397 }
2398 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002399 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002400 if (NCH(ch) > 3)
Guido van Rossum8861b741996-07-30 16:49:37 +00002401 com_assign(c, CHILD(ch, 3), OP_ASSIGN);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002402 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002403 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002404 com_pop(c, 1);
2405 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002406 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002407 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002408 com_node(c, CHILD(n, i+2));
2409 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2410 if (except_anchor) {
2411 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002412 /* We come in with [tb, val, exc, 0] on the
2413 stack; one pop and it's the same as
2414 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002415 com_addbyte(c, POP_TOP);
2416 }
2417 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002418 /* We actually come in here with [tb, val, exc] but the
2419 END_FINALLY will zap those and jump around.
2420 The c_stacklevel does not reflect them so we need not pop
2421 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002422 com_addbyte(c, END_FINALLY);
2423 com_backpatch(c, else_anchor);
2424 if (i < NCH(n))
2425 com_node(c, CHILD(n, i+2));
2426 com_backpatch(c, end_anchor);
2427}
2428
2429static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002430com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002431{
2432 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002433 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002434
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002435 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2436 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002437 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002438 com_addbyte(c, POP_BLOCK);
2439 block_pop(c, SETUP_FINALLY);
2440 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002441 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002442 /* While the generated code pushes only one item,
2443 the try-finally handling can enter here with
2444 up to three items. OK, here are the details:
2445 3 for an exception, 2 for RETURN, 1 for BREAK. */
2446 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002447 com_backpatch(c, finally_anchor);
2448 ch = CHILD(n, NCH(n)-1);
2449 com_addoparg(c, SET_LINENO, ch->n_lineno);
2450 com_node(c, ch);
2451 com_addbyte(c, END_FINALLY);
2452 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002453 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002454}
2455
2456static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002457com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002458{
2459 REQ(n, try_stmt);
2460 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2461 | 'try' ':' suite 'finally' ':' suite */
2462 if (TYPE(CHILD(n, 3)) != except_clause)
2463 com_try_finally(c, n);
2464 else
2465 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002466}
2467
Guido van Rossum8b993a91997-01-17 21:04:03 +00002468static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002469get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002470{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002471 int i;
2472
Guido van Rossum8b993a91997-01-17 21:04:03 +00002473 /* Label to avoid tail recursion */
2474 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002475 switch (TYPE(n)) {
2476
2477 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002478 if (NCH(n) == 1) {
2479 n = CHILD(n, 0);
2480 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002481 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002482 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002483 case file_input:
2484 for (i = 0; i < NCH(n); i++) {
2485 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002486 if (TYPE(ch) == stmt) {
2487 n = ch;
2488 goto next;
2489 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002490 }
2491 break;
2492
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002493 case stmt:
2494 case simple_stmt:
2495 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002496 n = CHILD(n, 0);
2497 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002498
2499 case expr_stmt:
2500 case testlist:
2501 case test:
2502 case and_test:
2503 case not_test:
2504 case comparison:
2505 case expr:
2506 case xor_expr:
2507 case and_expr:
2508 case shift_expr:
2509 case arith_expr:
2510 case term:
2511 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002512 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002513 if (NCH(n) == 1) {
2514 n = CHILD(n, 0);
2515 goto next;
2516 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002517 break;
2518
2519 case atom:
2520 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002521 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002522 break;
2523
2524 }
2525 return NULL;
2526}
2527
Guido van Rossum79f25d91997-04-29 20:08:16 +00002528static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002529get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002530{
Guido van Rossum541563e1999-01-28 15:08:09 +00002531 /* Don't generate doc-strings if run with -OO */
2532 if (Py_OptimizeFlag > 1)
2533 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002534 n = get_rawdocstring(n);
2535 if (n == NULL)
2536 return NULL;
2537 return parsestrplus(n);
2538}
2539
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002540static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002541com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002542{
2543 REQ(n, suite);
2544 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2545 if (NCH(n) == 1) {
2546 com_node(c, CHILD(n, 0));
2547 }
2548 else {
2549 int i;
2550 for (i = 0; i < NCH(n); i++) {
2551 node *ch = CHILD(n, i);
2552 if (TYPE(ch) == stmt)
2553 com_node(c, ch);
2554 }
2555 }
2556}
2557
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002558/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002559static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002560com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002561{
2562 int i = c->c_nblocks;
2563 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2564 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2565 }
2566 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002567 com_error(c, PyExc_SyntaxError,
2568 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002569 }
2570 /* XXX Could allow it inside a 'finally' clause
2571 XXX if we could pop the exception still on the stack */
2572}
2573
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002574static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002575com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002576{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002577 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002578 if (TYPE(n) == lambdef) {
2579 /* lambdef: 'lambda' [varargslist] ':' test */
2580 n = CHILD(n, 1);
2581 }
2582 else {
2583 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2584 n = CHILD(n, 2);
2585 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2586 n = CHILD(n, 1);
2587 }
2588 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002589 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002590 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002591 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002592 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2593 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002594 nargs = 0;
2595 ndefs = 0;
2596 for (i = 0; i < nch; i++) {
2597 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002598 if (TYPE(CHILD(n, i)) == STAR ||
2599 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002600 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002601 nargs++;
2602 i++;
2603 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002604 t = RPAR; /* Anything except EQUAL or COMMA */
2605 else
2606 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002607 if (t == EQUAL) {
2608 i++;
2609 ndefs++;
2610 com_node(c, CHILD(n, i));
2611 i++;
2612 if (i >= nch)
2613 break;
2614 t = TYPE(CHILD(n, i));
2615 }
2616 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00002617 /* Treat "(a=1, b)" as an error */
2618 if (ndefs)
2619 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00002620 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002621 }
2622 if (t != COMMA)
2623 break;
2624 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002625 return ndefs;
2626}
2627
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002628static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002629com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002630{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002631 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002632 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002633 v = (PyObject *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002634 if (v == NULL)
2635 c->c_errors++;
2636 else {
2637 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002638 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002639 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002640 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002641 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002642 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002643 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002644 com_pop(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002645 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002646 }
2647}
2648
2649static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002650com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002651{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002652 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002653 REQ(n, testlist);
2654 /* testlist: test (',' test)* [','] */
2655 for (i = 0; i < NCH(n); i += 2)
2656 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002657 i = (NCH(n)+1) / 2;
2658 com_addoparg(c, BUILD_TUPLE, i);
2659 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00002660}
2661
2662static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002663com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002664{
Guido van Rossum25831651993-05-19 14:50:45 +00002665 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002666 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002667 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002668 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00002669 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00002670 c->c_errors++;
2671 return;
2672 }
2673 /* Push the class name on the stack */
2674 i = com_addconst(c, v);
2675 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002676 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002677 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00002678 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002679 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00002680 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002681 com_push(c, 1);
2682 }
Guido van Rossum25831651993-05-19 14:50:45 +00002683 else
2684 com_bases(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002685 v = (PyObject *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002686 if (v == NULL)
2687 c->c_errors++;
2688 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002689 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002690 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002691 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002692 com_addoparg(c, MAKE_FUNCTION, 0);
2693 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002694 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002695 com_pop(c, 2);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002696 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002697 Py_DECREF(v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002698 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002699}
2700
2701static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002702com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002703{
2704 switch (TYPE(n)) {
2705
2706 /* Definition nodes */
2707
2708 case funcdef:
2709 com_funcdef(c, n);
2710 break;
2711 case classdef:
2712 com_classdef(c, n);
2713 break;
2714
2715 /* Trivial parse tree nodes */
2716
2717 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002718 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002719 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002720 com_node(c, CHILD(n, 0));
2721 break;
2722
2723 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002724 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2725 com_addoparg(c, SET_LINENO, n->n_lineno);
2726 {
2727 int i;
2728 for (i = 0; i < NCH(n)-1; i += 2)
2729 com_node(c, CHILD(n, i));
2730 }
2731 break;
2732
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002733 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002734 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002735 com_node(c, CHILD(n, 0));
2736 break;
2737
2738 /* Statement nodes */
2739
2740 case expr_stmt:
2741 com_expr_stmt(c, n);
2742 break;
2743 case print_stmt:
2744 com_print_stmt(c, n);
2745 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002746 case del_stmt: /* 'del' exprlist */
Guido van Rossum8861b741996-07-30 16:49:37 +00002747 com_assign(c, CHILD(n, 1), OP_DELETE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002748 break;
2749 case pass_stmt:
2750 break;
2751 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002752 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002753 com_error(c, PyExc_SyntaxError,
2754 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002755 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002756 com_addbyte(c, BREAK_LOOP);
2757 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002758 case continue_stmt:
2759 com_continue_stmt(c, n);
2760 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002761 case return_stmt:
2762 com_return_stmt(c, n);
2763 break;
2764 case raise_stmt:
2765 com_raise_stmt(c, n);
2766 break;
2767 case import_stmt:
2768 com_import_stmt(c, n);
2769 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002770 case global_stmt:
2771 com_global_stmt(c, n);
2772 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002773 case exec_stmt:
2774 com_exec_stmt(c, n);
2775 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002776 case assert_stmt:
2777 com_assert_stmt(c, n);
2778 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002779 case if_stmt:
2780 com_if_stmt(c, n);
2781 break;
2782 case while_stmt:
2783 com_while_stmt(c, n);
2784 break;
2785 case for_stmt:
2786 com_for_stmt(c, n);
2787 break;
2788 case try_stmt:
2789 com_try_stmt(c, n);
2790 break;
2791 case suite:
2792 com_suite(c, n);
2793 break;
2794
2795 /* Expression nodes */
2796
2797 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002798 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002799 break;
2800 case test:
2801 com_test(c, n);
2802 break;
2803 case and_test:
2804 com_and_test(c, n);
2805 break;
2806 case not_test:
2807 com_not_test(c, n);
2808 break;
2809 case comparison:
2810 com_comparison(c, n);
2811 break;
2812 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002813 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002814 break;
2815 case expr:
2816 com_expr(c, n);
2817 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002818 case xor_expr:
2819 com_xor_expr(c, n);
2820 break;
2821 case and_expr:
2822 com_and_expr(c, n);
2823 break;
2824 case shift_expr:
2825 com_shift_expr(c, n);
2826 break;
2827 case arith_expr:
2828 com_arith_expr(c, n);
2829 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002830 case term:
2831 com_term(c, n);
2832 break;
2833 case factor:
2834 com_factor(c, n);
2835 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00002836 case power:
2837 com_power(c, n);
2838 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002839 case atom:
2840 com_atom(c, n);
2841 break;
2842
2843 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002844 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002845 com_error(c, PyExc_SystemError,
2846 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002847 }
2848}
2849
Tim Petersdbd9ba62000-07-09 03:09:57 +00002850static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002851
2852static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002853com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002854{
2855 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
2856 if (TYPE(CHILD(n, 0)) == LPAR)
2857 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002858 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002859 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002860 com_pop(c, 1);
2861 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002862}
2863
2864static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002865com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002866{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00002867 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002868 if (NCH(n) == 1) {
2869 com_fpdef(c, CHILD(n, 0));
2870 }
2871 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002872 int i = (NCH(n)+1)/2;
2873 com_addoparg(c, UNPACK_TUPLE, i);
2874 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002875 for (i = 0; i < NCH(n); i += 2)
2876 com_fpdef(c, CHILD(n, i));
2877 }
2878}
2879
2880static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002881com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002882{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002883 int nch, i;
2884 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00002885 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002886 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00002887 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002888 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002889 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002890 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002891 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002892 node *ch = CHILD(n, i);
2893 node *fp;
2894 char *name;
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00002895 PyObject *nameval;
Guido van Rossum50564e81996-01-12 01:13:16 +00002896 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002897 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002898 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
2899 fp = CHILD(ch, 0);
2900 if (TYPE(fp) == NAME)
2901 name = STR(fp);
2902 else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00002903 name = nbuf;
2904 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00002905 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002906 }
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00002907 nameval = PyString_InternFromString(name);
2908 if (nameval == NULL) {
2909 c->c_errors++;
2910 }
Peter Schneider-Kamp9a5086c2000-07-13 06:24:29 +00002911 if (PyDict_GetItem(c->c_locals, nameval)) {
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00002912 com_error(c, PyExc_SyntaxError,"duplicate argument in function definition");
2913 }
2914 com_newlocal_o(c, nameval);
2915 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002916 c->c_argcount++;
2917 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002918 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002919 ch = CHILD(n, i);
2920 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002921 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002922 else
2923 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002924 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002925 /* Handle *arguments */
2926 if (i < nch) {
2927 node *ch;
2928 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00002929 if (TYPE(ch) != DOUBLESTAR) {
2930 REQ(ch, STAR);
2931 ch = CHILD(n, i+1);
2932 if (TYPE(ch) == NAME) {
2933 c->c_flags |= CO_VARARGS;
2934 i += 3;
2935 com_newlocal(c, STR(ch));
2936 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002937 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002938 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002939 /* Handle **keywords */
2940 if (i < nch) {
2941 node *ch;
2942 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00002943 if (TYPE(ch) != DOUBLESTAR) {
2944 REQ(ch, STAR);
2945 ch = CHILD(n, i+1);
2946 REQ(ch, STAR);
2947 ch = CHILD(n, i+2);
2948 }
2949 else
2950 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002951 REQ(ch, NAME);
2952 c->c_flags |= CO_VARKEYWORDS;
2953 com_newlocal(c, STR(ch));
2954 }
2955 if (complex) {
2956 /* Generate code for complex arguments only after
2957 having counted the simple arguments */
2958 int ilocal = 0;
2959 for (i = 0; i < nch; i++) {
2960 node *ch = CHILD(n, i);
2961 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00002962 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002963 break;
2964 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
2965 fp = CHILD(ch, 0);
2966 if (TYPE(fp) != NAME) {
2967 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002968 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002969 com_fpdef(c, ch);
2970 }
2971 ilocal++;
2972 if (++i >= nch)
2973 break;
2974 ch = CHILD(n, i);
2975 if (TYPE(ch) == EQUAL)
2976 i += 2;
2977 else
2978 REQ(ch, COMMA);
2979 }
2980 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002981}
2982
2983static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002984com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002985{
2986 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002987 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002988 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002989 doc = get_docstring(n);
2990 if (doc != NULL) {
2991 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002992 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002993 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002994 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002995 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00002996 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002997 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002998 for (i = 0; i < NCH(n); i++) {
2999 node *ch = CHILD(n, i);
3000 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3001 com_node(c, ch);
3002 }
3003}
3004
3005/* Top-level compile-node interface */
3006
3007static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003008compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003009{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003010 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003011 node *ch;
3012 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003013 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003014 doc = get_docstring(CHILD(n, 4));
3015 if (doc != NULL) {
3016 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003017 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003018 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003019 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003020 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003021 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3022 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003023 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003024 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003025 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003026 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003027 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003028 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003029 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003030 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003031 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003032}
3033
3034static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003035compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003036{
Guido van Rossum590baa41993-11-30 13:40:46 +00003037 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003038 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003039 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003040
3041 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003042 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003043 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003044 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003045 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003046 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003047 else
3048 ch = CHILD(n, 2);
3049 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003050 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003051 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003052}
3053
3054static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003055compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003056{
3057 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003058 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003059 REQ(n, classdef);
3060 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3061 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003062#ifdef PRIVATE_NAME_MANGLING
3063 c->c_private = c->c_name;
3064#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003065 ch = CHILD(n, NCH(n)-1); /* The suite */
3066 doc = get_docstring(ch);
3067 if (doc != NULL) {
3068 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003069 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003070 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003071 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003072 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003073 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003074 }
3075 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003076 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003077 com_node(c, ch);
3078 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003079 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003080 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003081 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003082}
3083
3084static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003085compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003086{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003087 com_addoparg(c, SET_LINENO, n->n_lineno);
3088
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003089 switch (TYPE(n)) {
3090
Guido van Rossum4c417781991-01-21 16:09:22 +00003091 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003092 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003093 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003094 n = CHILD(n, 0);
3095 if (TYPE(n) != NEWLINE)
3096 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003097 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003098 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003099 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003100 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003101 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003102 break;
3103
Guido van Rossum4c417781991-01-21 16:09:22 +00003104 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003105 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003106 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003107 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003108 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003109 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003110 break;
3111
Guido van Rossum590baa41993-11-30 13:40:46 +00003112 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003113 com_node(c, CHILD(n, 0));
3114 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003115 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003116 break;
3117
Guido van Rossum590baa41993-11-30 13:40:46 +00003118 case lambdef: /* anonymous function definition */
3119 compile_lambdef(c, n);
3120 break;
3121
Guido van Rossum4c417781991-01-21 16:09:22 +00003122 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003123 compile_funcdef(c, n);
3124 break;
3125
Guido van Rossum4c417781991-01-21 16:09:22 +00003126 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003127 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003128 break;
3129
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003130 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003131 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003132 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003133 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003134 }
3135}
3136
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003137/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00003138
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003139 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
3140 instructions that refer to local variables with LOAD_FAST etc.
3141 The latter instructions are much faster because they don't need to
3142 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003143
Guido van Rossum681d79a1995-07-18 14:51:37 +00003144 To find all local variables, we check all STORE_NAME, IMPORT_FROM
3145 and DELETE_NAME instructions. This yields all local variables,
3146 function definitions, class definitions and import statements.
3147 Argument names have already been entered into the list by the
3148 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003149
3150 All remaining LOAD_NAME instructions must refer to non-local (global
3151 or builtin) variables, so are replaced by LOAD_GLOBAL.
3152
3153 There are two problems: 'from foo import *' and 'exec' may introduce
3154 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00003155 case, we can still optimize bona fide locals (since those
3156 statements will be surrounded by fast_2_locals() and
3157 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003158
Guido van Rossum681d79a1995-07-18 14:51:37 +00003159 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00003160
3161static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003162optimize(struct compiling *c)
Guido van Rossum282914b1991-04-04 10:42:56 +00003163{
Guido van Rossum0a697f61991-04-16 08:39:12 +00003164 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00003165 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00003166 int oparg = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003167 PyObject *name;
3168 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003169
Guido van Rossum282914b1991-04-04 10:42:56 +00003170#define NEXTOP() (*next_instr++)
3171#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossum79f25d91997-04-29 20:08:16 +00003172#define GETITEM(v, i) (PyList_GetItem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003173#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
3174
Guido van Rossum79f25d91997-04-29 20:08:16 +00003175 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003176
3177 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00003178
Guido van Rossum79f25d91997-04-29 20:08:16 +00003179 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003180 for (;;) {
3181 opcode = NEXTOP();
3182 if (opcode == STOP_CODE)
3183 break;
3184 if (HAS_ARG(opcode))
3185 oparg = NEXTARG();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003186 switch (opcode) {
3187 case STORE_NAME:
3188 case DELETE_NAME:
3189 case IMPORT_FROM:
3190 com_addlocal_o(c, GETNAMEOBJ(oparg));
3191 break;
3192 case EXEC_STMT:
3193 c->c_flags &= ~CO_OPTIMIZED;
3194 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00003195 }
3196 }
3197
Guido van Rossum79f25d91997-04-29 20:08:16 +00003198 if (PyDict_GetItemString(c->c_locals, "*") != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003199 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003200
Guido van Rossum79f25d91997-04-29 20:08:16 +00003201 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003202 for (;;) {
3203 cur_instr = next_instr;
3204 opcode = NEXTOP();
3205 if (opcode == STOP_CODE)
3206 break;
3207 if (HAS_ARG(opcode))
3208 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003209 if (opcode == LOAD_NAME ||
3210 opcode == STORE_NAME ||
3211 opcode == DELETE_NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003212 PyObject *v;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003213 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00003214 name = GETNAMEOBJ(oparg);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003215 v = PyDict_GetItem(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003216 if (v == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003217 if (opcode == LOAD_NAME &&
3218 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003219 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003220 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00003221 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003222 i = PyInt_AsLong(v);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003223 switch (opcode) {
3224 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
3225 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
3226 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
3227 }
3228 cur_instr[1] = i & 0xff;
3229 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00003230 }
3231 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003232
Guido van Rossum681d79a1995-07-18 14:51:37 +00003233 if (c->c_errors == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00003234 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00003235}
3236
Guido van Rossum79f25d91997-04-29 20:08:16 +00003237PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003238PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003239{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003240 return jcompile(n, filename, NULL);
3241}
3242
Guido van Rossum79f25d91997-04-29 20:08:16 +00003243static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003244icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003245{
3246 return jcompile(n, base->c_filename, base);
3247}
3248
Guido van Rossum79f25d91997-04-29 20:08:16 +00003249static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003250jcompile(node *n, char *filename, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003251{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003252 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003253 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003254 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003255 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003256#ifdef PRIVATE_NAME_MANGLING
3257 if (base)
3258 sc.c_private = base->c_private;
3259 else
3260 sc.c_private = NULL;
3261#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003262 compile_node(&sc, n);
3263 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003264 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003265 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003266 sc.c_flags |= CO_NEWLOCALS;
3267 }
3268 else if (TYPE(n) == classdef)
3269 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00003270 co = NULL;
3271 if (sc.c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003272 PyObject *consts, *names, *varnames, *filename, *name;
3273 consts = PyList_AsTuple(sc.c_consts);
3274 names = PyList_AsTuple(sc.c_names);
3275 varnames = PyList_AsTuple(sc.c_varnames);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003276 filename = PyString_InternFromString(sc.c_filename);
3277 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003278 if (!PyErr_Occurred())
3279 co = PyCode_New(sc.c_argcount,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003280 sc.c_nlocals,
Guido van Rossum8b993a91997-01-17 21:04:03 +00003281 sc.c_maxstacklevel,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003282 sc.c_flags,
3283 sc.c_code,
3284 consts,
3285 names,
3286 varnames,
3287 filename,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003288 name,
3289 sc.c_firstlineno,
3290 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003291 Py_XDECREF(consts);
3292 Py_XDECREF(names);
3293 Py_XDECREF(varnames);
3294 Py_XDECREF(filename);
3295 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003296 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003297 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003298 return co;
3299}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003300
3301int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003302PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003303{
3304 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003305 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003306 int line = co->co_firstlineno;
3307 int addr = 0;
3308 while (--size >= 0) {
3309 addr += *p++;
3310 if (addr > addrq)
3311 break;
3312 line += *p++;
3313 }
3314 return line;
3315}