blob: b7ce7702ff879ac15345b60d197ebe9d18451939 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009******************************************************************/
10
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011/* Compile an expression node to intermediate code */
12
Guido van Rossum3f5da241990-12-20 15:06:42 +000013/* XXX TO DO:
Guido van Rossum8b993a91997-01-17 21:04:03 +000014 XXX add __doc__ attribute == co_doc to code object attributes?
15 XXX (it's currently the first item of the co_const tuple)
Guido van Rossum3f5da241990-12-20 15:06:42 +000016 XXX Generate simple jump for break/return outside 'try...finally'
Guido van Rossum8b993a91997-01-17 21:04:03 +000017 XXX Allow 'continue' inside try-finally
Guido van Rossum8b993a91997-01-17 21:04:03 +000018 XXX New opcode for loading the initial index for a for loop
Guido van Rossum681d79a1995-07-18 14:51:37 +000019 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000020*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000021
Guido van Rossum8ff077b1996-08-24 06:21:31 +000022#ifndef NO_PRIVATE_NAME_MANGLING
23#define PRIVATE_NAME_MANGLING
24#endif
25
Guido van Rossum79f25d91997-04-29 20:08:16 +000026#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000027
Guido van Rossum10dc2e81990-11-18 17:27:39 +000028#include "node.h"
29#include "token.h"
30#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000031#include "compile.h"
32#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000033#include "structmember.h"
34
35#include <ctype.h>
Jack Jansen41aa8e52000-07-03 21:39:47 +000036#ifdef HAVE_LIMITS_H
37#include <limits.h>
38#endif
Guido van Rossum282914b1991-04-04 10:42:56 +000039
Guido van Rossumb05a5c71997-05-07 17:46:13 +000040/* Three symbols from graminit.h are also defined in Python.h, with
41 Py_ prefixes to their names. Python.h can't include graminit.h
42 (which defines too many confusing symbols), but we can check here
43 that they haven't changed (which is very unlikely, but possible). */
44#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000045 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000046#endif
47#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000048 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000049#endif
50#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000051 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000052#endif
53
Guido van Rossum8e793d91997-03-03 19:13:14 +000054int Py_OptimizeFlag = 0;
55
Guido van Rossum8861b741996-07-30 16:49:37 +000056#define OP_DELETE 0
57#define OP_ASSIGN 1
58#define OP_APPLY 2
59
Guido van Rossum79f25d91997-04-29 20:08:16 +000060#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000061
62static struct memberlist code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000063 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
64 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000065 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000066 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000067 {"co_code", T_OBJECT, OFF(co_code), READONLY},
68 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
69 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000070 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000071 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000072 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000073 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
74 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000075 {NULL} /* Sentinel */
76};
77
Guido van Rossum79f25d91997-04-29 20:08:16 +000078static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000079code_getattr(PyCodeObject *co, char *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +000080{
Guido van Rossum79f25d91997-04-29 20:08:16 +000081 return PyMember_Get((char *)co, code_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +000082}
Guido van Rossum10dc2e81990-11-18 17:27:39 +000083
84static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000085code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +000086{
Guido van Rossum79f25d91997-04-29 20:08:16 +000087 Py_XDECREF(co->co_code);
88 Py_XDECREF(co->co_consts);
89 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +000090 Py_XDECREF(co->co_varnames);
Guido van Rossum79f25d91997-04-29 20:08:16 +000091 Py_XDECREF(co->co_filename);
92 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +000093 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +000094 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +000095}
96
Guido van Rossum79f25d91997-04-29 20:08:16 +000097static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000098code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +000099{
100 char buf[500];
101 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000102 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000103 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000104
Guido van Rossuma396a882000-04-07 01:21:36 +0000105 if (co->co_firstlineno != 0)
106 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000107 if (co->co_filename && PyString_Check(co->co_filename))
108 filename = PyString_AsString(co->co_filename);
109 if (co->co_name && PyString_Check(co->co_name))
110 name = PyString_AsString(co->co_name);
Fred Drake615ae552000-06-30 16:20:13 +0000111 sprintf(buf, "<code object %.100s at %p, file \"%.300s\", line %d>",
112 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000113 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000114}
115
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000116static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000117code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000118{
119 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000120 cmp = PyObject_Compare(co->co_name, cp->co_name);
121 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000122 cmp = co->co_argcount - cp->co_argcount;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000123 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000124 cmp = co->co_nlocals - cp->co_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000125 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000126 cmp = co->co_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000127 if (cmp) return cmp;
Guido van Rossumd076c731998-10-07 19:42:25 +0000128 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000129 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000130 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000131 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000132 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000133 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000134 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000135 return cmp;
136}
137
138static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000139code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000140{
Guido van Rossum44679592000-04-10 16:20:31 +0000141 long h, h0, h1, h2, h3, h4;
142 h0 = PyObject_Hash(co->co_name);
143 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000144 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000145 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000146 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000147 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000148 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000149 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000150 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000151 if (h4 == -1) return -1;
Guido van Rossum44679592000-04-10 16:20:31 +0000152 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000153 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000154 if (h == -1) h = -2;
155 return h;
156}
157
Guido van Rossum79f25d91997-04-29 20:08:16 +0000158PyTypeObject PyCode_Type = {
159 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000160 0,
161 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000162 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000163 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000164 (destructor)code_dealloc, /*tp_dealloc*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000165 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000166 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000167 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000168 (cmpfunc)code_compare, /*tp_compare*/
169 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000170 0, /*tp_as_number*/
171 0, /*tp_as_sequence*/
172 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000173 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000174};
175
Guido van Rossum644a12b1997-04-09 19:24:53 +0000176#define NAME_CHARS \
177 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
178
Guido van Rossum79f25d91997-04-29 20:08:16 +0000179PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000180PyCode_New(int argcount, int nlocals, int stacksize, int flags,
181 PyObject *code, PyObject *consts, PyObject *names,
182 PyObject *varnames, PyObject *filename, PyObject *name,
183 int firstlineno, PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000184{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000185 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000186 int i;
Guido van Rossumd076c731998-10-07 19:42:25 +0000187 PyBufferProcs *pb;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000188 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000189 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000190 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000191 consts == NULL || !PyTuple_Check(consts) ||
192 names == NULL || !PyTuple_Check(names) ||
193 varnames == NULL || !PyTuple_Check(varnames) ||
194 name == NULL || !PyString_Check(name) ||
195 filename == NULL || !PyString_Check(filename) ||
196 lnotab == NULL || !PyString_Check(lnotab)) {
197 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000198 return NULL;
199 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000200 pb = code->ob_type->tp_as_buffer;
201 if (pb == NULL ||
202 pb->bf_getreadbuffer == NULL ||
203 pb->bf_getsegcount == NULL ||
204 (*pb->bf_getsegcount)(code, NULL) != 1)
205 {
206 PyErr_BadInternalCall();
207 return NULL;
208 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000209 /* Make sure names and varnames are all strings, & intern them */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000210 for (i = PyTuple_Size(names); --i >= 0; ) {
211 PyObject *v = PyTuple_GetItem(names, i);
212 if (v == NULL || !PyString_Check(v)) {
213 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000214 return NULL;
215 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000216 PyString_InternInPlace(&PyTuple_GET_ITEM(names, i));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000217 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000218 for (i = PyTuple_Size(varnames); --i >= 0; ) {
219 PyObject *v = PyTuple_GetItem(varnames, i);
220 if (v == NULL || !PyString_Check(v)) {
221 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000222 return NULL;
223 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000224 PyString_InternInPlace(&PyTuple_GET_ITEM(varnames, i));
225 }
226 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000227 for (i = PyTuple_Size(consts); --i >= 0; ) {
228 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000229 char *p;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000230 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000231 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000232 p = PyString_AsString(v);
Guido van Rossum582acec2000-06-28 22:07:35 +0000233 if (strspn(p, NAME_CHARS)
234 != (size_t)PyString_Size(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000235 continue;
236 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000237 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000238 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000239 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000240 co->co_argcount = argcount;
241 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000242 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000243 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000245 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000246 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000247 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000248 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000249 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000250 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000251 co->co_varnames = varnames;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000252 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000253 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000254 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000255 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000256 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000257 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000258 co->co_lnotab = lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000259 }
260 return co;
261}
262
263
264/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000265
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000266struct compiling {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000267 PyObject *c_code; /* string */
268 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000269 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000270 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000271 PyObject *c_name_dict; /* inverse of c_names */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000272 PyObject *c_globals; /* dictionary (value=None) */
273 PyObject *c_locals; /* dictionary (value=localID) */
274 PyObject *c_varnames; /* list (inverse of c_locals) */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000275 int c_nlocals; /* index of next local */
276 int c_argcount; /* number of top-level arguments */
277 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000278 int c_nexti; /* index into c_code */
279 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000280 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000281 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000282 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000283 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000284 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000285 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000286 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000287 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000288 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000289 int c_stacklevel; /* Current stack level */
290 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000291 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000292 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000293 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000294#ifdef PRIVATE_NAME_MANGLING
295 char *c_private; /* for private name mangling */
296#endif
Skip Montanaro803d6e52000-08-12 18:09:51 +0000297 int c_tmpname; /* temporary local name counter */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000298};
299
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000300
Guido van Rossum452a9831996-09-17 14:32:04 +0000301/* Error message including line number */
302
303static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000304com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000305{
Fred Drakedcf08e02000-08-15 15:49:44 +0000306 PyObject *v, *tb, *tmp;
Guido van Rossum635abd21997-01-06 22:56:52 +0000307 c->c_errors++;
Guido van Rossum452a9831996-09-17 14:32:04 +0000308 if (c->c_lineno <= 1) {
309 /* Unknown line number or single interactive command */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000310 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000311 return;
312 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000313 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000314 if (v == NULL)
315 return; /* MemoryError, too bad */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000316 PyErr_SetObject(exc, v);
317 Py_DECREF(v);
Fred Drakedcf08e02000-08-15 15:49:44 +0000318
319 /* add attributes for the line number and filename for the error */
320 PyErr_Fetch(&exc, &v, &tb);
321 PyErr_NormalizeException(&exc, &v, &tb);
322 tmp = PyInt_FromLong(c->c_lineno);
323 if (tmp == NULL)
324 PyErr_Clear();
325 else {
326 if (PyObject_SetAttrString(v, "lineno", tmp))
327 PyErr_Clear();
328 Py_DECREF(tmp);
329 }
330 if (c->c_filename != NULL) {
331 tmp = PyString_FromString(c->c_filename);
332 if (tmp == NULL)
333 PyErr_Clear();
334 else {
335 if (PyObject_SetAttrString(v, "filename", tmp))
336 PyErr_Clear();
337 Py_DECREF(tmp);
338 }
339 }
340 PyErr_Restore(exc, v, tb);
Guido van Rossum452a9831996-09-17 14:32:04 +0000341}
342
343
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000344/* Interface to the block stack */
345
346static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000347block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000348{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000349 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000350 com_error(c, PyExc_SystemError,
351 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000352 }
353 else {
354 c->c_block[c->c_nblocks++] = type;
355 }
356}
357
358static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000359block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000360{
361 if (c->c_nblocks > 0)
362 c->c_nblocks--;
363 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000364 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000365 }
366}
367
368
Guido van Rossum681d79a1995-07-18 14:51:37 +0000369/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000370
Tim Petersdbd9ba62000-07-09 03:09:57 +0000371static int com_init(struct compiling *, char *);
372static void com_free(struct compiling *);
373static void com_push(struct compiling *, int);
374static void com_pop(struct compiling *, int);
375static void com_done(struct compiling *);
376static void com_node(struct compiling *, struct _node *);
377static void com_factor(struct compiling *, struct _node *);
378static void com_addbyte(struct compiling *, int);
379static void com_addint(struct compiling *, int);
380static void com_addoparg(struct compiling *, int, int);
381static void com_addfwref(struct compiling *, int, int *);
382static void com_backpatch(struct compiling *, int);
383static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
384static int com_addconst(struct compiling *, PyObject *);
385static int com_addname(struct compiling *, PyObject *);
386static void com_addopname(struct compiling *, int, node *);
387static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000388static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000389static int com_argdefs(struct compiling *, node *);
390static int com_newlocal(struct compiling *, char *);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000391static void com_assign(struct compiling *, node *, int);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000392static PyCodeObject *icompile(struct _node *, struct compiling *);
393static PyCodeObject *jcompile(struct _node *, char *,
394 struct compiling *);
395static PyObject *parsestrplus(node *);
396static PyObject *parsestr(char *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000397
398static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000399com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000400{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000401 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000402 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
403 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000404 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000405 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000406 goto fail;
407 if ((c->c_const_dict = PyDict_New()) == NULL)
408 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000409 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000410 goto fail;
411 if ((c->c_name_dict = PyDict_New()) == NULL)
412 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000413 if ((c->c_globals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000414 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000415 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000416 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000417 if ((c->c_varnames = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000418 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000419 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
420 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000421 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000422 c->c_nlocals = 0;
423 c->c_argcount = 0;
424 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000425 c->c_nexti = 0;
426 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000427 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000428 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000429 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000430 c->c_begin = 0;
431 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000432 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000433 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000434 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000435 c->c_stacklevel = 0;
436 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000437 c->c_firstlineno = 0;
438 c->c_last_addr = 0;
439 c->c_last_line = 0;
440 c-> c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000441 c->c_tmpname = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000442 return 1;
443
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000444 fail:
445 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000446 return 0;
447}
448
449static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000450com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000451{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000452 Py_XDECREF(c->c_code);
453 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000454 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000455 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000456 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000457 Py_XDECREF(c->c_globals);
458 Py_XDECREF(c->c_locals);
459 Py_XDECREF(c->c_varnames);
460 Py_XDECREF(c->c_lnotab);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000461}
462
463static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000464com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000465{
466 c->c_stacklevel += n;
467 if (c->c_stacklevel > c->c_maxstacklevel)
468 c->c_maxstacklevel = c->c_stacklevel;
469}
470
471static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000472com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000473{
474 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000475 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000476 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
477 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000478 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000479 c->c_stacklevel = 0;
480 }
481 else
482 c->c_stacklevel -= n;
483}
484
485static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000486com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000487{
488 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000489 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000490 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000491 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000492}
493
494static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000495com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000496{
497 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000498 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000499 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000500 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000501 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000502 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000503 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000504 com_error(c, PyExc_SystemError,
505 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000506 }
507 if (c->c_code == NULL)
508 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000509 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000510 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000511 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000512 c->c_errors++;
513 return;
514 }
515 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000516 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000517}
518
519static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000520com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000521{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000522 com_addbyte(c, x & 0xff);
523 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000524}
525
526static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000527com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000528{
529 int size;
530 char *p;
531 if (c->c_lnotab == NULL)
532 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000533 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000534 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000535 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000536 c->c_errors++;
537 return;
538 }
539 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000540 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000541 *p++ = addr;
542 *p++ = line;
543 c->c_lnotab_next += 2;
544}
545
546static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000547com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000548{
549 c->c_lineno = lineno;
550 if (c->c_firstlineno == 0) {
551 c->c_firstlineno = c->c_last_line = lineno;
552 }
553 else {
554 int incr_addr = c->c_nexti - c->c_last_addr;
555 int incr_line = lineno - c->c_last_line;
556 while (incr_addr > 0 || incr_line > 0) {
557 int trunc_addr = incr_addr;
558 int trunc_line = incr_line;
559 if (trunc_addr > 255)
560 trunc_addr = 255;
561 if (trunc_line > 255)
562 trunc_line = 255;
563 com_add_lnotab(c, trunc_addr, trunc_line);
564 incr_addr -= trunc_addr;
565 incr_line -= trunc_line;
566 }
567 c->c_last_addr = c->c_nexti;
568 c->c_last_line = lineno;
569 }
570}
571
572static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000573com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000574{
Guido van Rossum8e793d91997-03-03 19:13:14 +0000575 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000576 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000577 if (Py_OptimizeFlag)
578 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000579 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000580 com_addbyte(c, op);
581 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000582}
583
584static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000585com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000586{
587 /* Compile a forward reference for backpatching */
588 int here;
589 int anchor;
590 com_addbyte(c, op);
591 here = c->c_nexti;
592 anchor = *p_anchor;
593 *p_anchor = here;
594 com_addint(c, anchor == 0 ? 0 : here - anchor);
595}
596
597static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000598com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000599{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000600 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000601 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000602 int dist;
603 int prev;
604 for (;;) {
605 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000606 prev = code[anchor] + (code[anchor+1] << 8);
607 dist = target - (anchor+2);
608 code[anchor] = dist & 0xff;
609 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000610 if (!prev)
611 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000612 anchor -= prev;
613 }
614}
615
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000616/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000617
618static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000619com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000620{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000621 PyObject *w, *t, *np=NULL;
622 long n;
623
624 t = Py_BuildValue("(OO)", v, v->ob_type);
625 if (t == NULL)
626 goto fail;
627 w = PyDict_GetItem(dict, t);
628 if (w != NULL) {
629 n = PyInt_AsLong(w);
630 } else {
631 n = PyList_Size(list);
632 np = PyInt_FromLong(n);
633 if (np == NULL)
634 goto fail;
635 if (PyList_Append(list, v) != 0)
636 goto fail;
637 if (PyDict_SetItem(dict, t, np) != 0)
638 goto fail;
639 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000640 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000641 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000642 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000643 fail:
644 Py_XDECREF(np);
645 Py_XDECREF(t);
646 c->c_errors++;
647 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000648}
649
650static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000651com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000652{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000653 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000654}
655
656static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000657com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000658{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000659 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000660}
661
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000662#ifdef PRIVATE_NAME_MANGLING
663static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000664com_mangle(struct compiling *c, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000665{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000666 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000667 This is independent from how the name is used. */
668 char *p;
Guido van Rossum582acec2000-06-28 22:07:35 +0000669 size_t nlen, plen;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000670 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000671 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000672 return 0; /* Don't mangle __extremely_long_names */
673 if (name[nlen-1] == '_' && name[nlen-2] == '_')
674 return 0; /* Don't mangle __whatever__ */
675 p = c->c_private;
676 /* Strip leading underscores from class name */
677 while (*p == '_')
678 p++;
679 if (*p == '\0')
680 return 0; /* Don't mangle if class is just underscores */
681 plen = strlen(p);
682 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000683 plen = maxlen-nlen-2; /* Truncate class name if too long */
684 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000685 buffer[0] = '_';
686 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000687 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000688 /* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
689 return 1;
690}
691#endif
692
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000693static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000694com_addopnamestr(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000695{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000696 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000697 int i;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000698#ifdef PRIVATE_NAME_MANGLING
699 char buffer[256];
700 if (name != NULL && name[0] == '_' && name[1] == '_' &&
701 c->c_private != NULL &&
Guido van Rossum582acec2000-06-28 22:07:35 +0000702 com_mangle(c, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000703 name = buffer;
704#endif
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000705 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000706 c->c_errors++;
707 i = 255;
708 }
709 else {
710 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000711 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000712 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000713 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
714 switch (op) {
715 case LOAD_NAME:
716 case STORE_NAME:
717 case DELETE_NAME:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000718 if (PyDict_GetItemString(c->c_globals, name) != NULL) {
Guido van Rossumc5e96291991-12-10 13:53:51 +0000719 switch (op) {
720 case LOAD_NAME: op = LOAD_GLOBAL; break;
721 case STORE_NAME: op = STORE_GLOBAL; break;
722 case DELETE_NAME: op = DELETE_GLOBAL; break;
723 }
724 }
725 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000726 com_addoparg(c, op, i);
727}
728
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000729static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000730com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000731{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000732 char *name;
733 char buffer[1000];
734 /* XXX it is possible to write this code without the 1000
735 chars on the total length of dotted names, I just can't be
736 bothered right now */
737 if (TYPE(n) == STAR)
738 name = "*";
739 else if (TYPE(n) == dotted_name) {
740 char *p = buffer;
741 int i;
742 name = buffer;
743 for (i = 0; i < NCH(n); i += 2) {
744 char *s = STR(CHILD(n, i));
745 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000746 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000747 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +0000748 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000749 break;
750 }
751 if (p != buffer)
752 *p++ = '.';
753 strcpy(p, s);
754 p = strchr(p, '\0');
755 }
756 }
757 else {
758 REQ(n, NAME);
759 name = STR(n);
760 }
761 com_addopnamestr(c, op, name);
762}
763
Guido van Rossum79f25d91997-04-29 20:08:16 +0000764static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000765parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000766{
Tim Petersdbd9ba62000-07-09 03:09:57 +0000767 extern double atof(const char *);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000768 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000769 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000770 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +0000771#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +0000772 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +0000773 int imflag;
774#endif
775
Guido van Rossum282914b1991-04-04 10:42:56 +0000776 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000777 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +0000778#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +0000779 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +0000780#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000781 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000782 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000783 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000784 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000785 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000786 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000787 if (*end == '\0') {
788 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000789 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000790 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000791 return NULL;
792 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000793 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000794 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000795 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +0000796#ifndef WITHOUT_COMPLEX
797 if (imflag) {
798 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000799 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +0000800 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000801 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000802 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +0000803 }
Guido van Rossumac1fc951997-10-08 15:23:55 +0000804 else
Guido van Rossum50564e81996-01-12 01:13:16 +0000805#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +0000806 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000807 PyFPE_START_PROTECT("atof", return 0)
808 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000809 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000810 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000811 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000812}
813
Guido van Rossum79f25d91997-04-29 20:08:16 +0000814static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000815parsestr(char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000816{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000817 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +0000818 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000819 char *buf;
820 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000821 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000822 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +0000823 int first = *s;
824 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000825 int rawmode = 0;
826 int unicode = 0;
827 if (isalpha(quote) || quote == '_') {
828 if (quote == 'u' || quote == 'U') {
829 quote = *++s;
830 unicode = 1;
831 }
832 if (quote == 'r' || quote == 'R') {
833 quote = *++s;
834 rawmode = 1;
835 }
836 }
Guido van Rossum8054fad1993-10-26 15:19:44 +0000837 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000838 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000839 return NULL;
840 }
841 s++;
842 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +0000843 if (len > INT_MAX) {
844 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
845 return NULL;
846 }
Guido van Rossum8054fad1993-10-26 15:19:44 +0000847 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000848 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000849 return NULL;
850 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000851 if (len >= 4 && s[0] == quote && s[1] == quote) {
852 s += 2;
853 len -= 2;
854 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000855 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000856 return NULL;
857 }
858 }
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +0000859 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000860 if (rawmode)
861 return PyUnicode_DecodeRawUnicodeEscape(
862 s, len, NULL);
863 else
864 return PyUnicode_DecodeUnicodeEscape(
865 s, len, NULL);
866 }
867 else if (rawmode || strchr(s, '\\') == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000868 return PyString_FromStringAndSize(s, len);
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000869 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000870 v = PyString_FromStringAndSize((char *)NULL, len);
871 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000872 end = s + len;
873 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000874 if (*s != '\\') {
875 *p++ = *s++;
876 continue;
877 }
878 s++;
879 switch (*s++) {
880 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000881 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000882 case '\\': *p++ = '\\'; break;
883 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000884 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000885 case 'b': *p++ = '\b'; break;
886 case 'f': *p++ = '\014'; break; /* FF */
887 case 't': *p++ = '\t'; break;
888 case 'n': *p++ = '\n'; break;
889 case 'r': *p++ = '\r'; break;
890 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000891 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
892 case '0': case '1': case '2': case '3':
893 case '4': case '5': case '6': case '7':
894 c = s[-1] - '0';
895 if ('0' <= *s && *s <= '7') {
896 c = (c<<3) + *s++ - '0';
897 if ('0' <= *s && *s <= '7')
898 c = (c<<3) + *s++ - '0';
899 }
900 *p++ = c;
901 break;
902 case 'x':
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000903 if (isxdigit(Py_CHARMASK(*s))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000904 unsigned int x = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000905 do {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000906 c = Py_CHARMASK(*s);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000907 s++;
Guido van Rossumed1100f1997-10-20 23:24:07 +0000908 x = (x<<4) & ~0xF;
909 if (isdigit(c))
910 x += c - '0';
911 else if (islower(c))
912 x += 10 + c - 'a';
913 else
914 x += 10 + c - 'A';
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000915 } while (isxdigit(Py_CHARMASK(*s)));
Guido van Rossumed1100f1997-10-20 23:24:07 +0000916 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000917 break;
918 }
919 /* FALLTHROUGH */
920 default: *p++ = '\\'; *p++ = s[-1]; break;
921 }
922 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000923 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000924 return v;
925}
926
Guido van Rossum79f25d91997-04-29 20:08:16 +0000927static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000928parsestrplus(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000929{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000930 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000931 int i;
932 REQ(CHILD(n, 0), STRING);
933 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
934 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +0000935 for (i = 1; i < NCH(n); i++) {
936 PyObject *s;
937 s = parsestr(STR(CHILD(n, i)));
938 if (s == NULL)
939 goto onError;
940 if (PyString_Check(v) && PyString_Check(s)) {
941 PyString_ConcatAndDel(&v, s);
942 if (v == NULL)
943 goto onError;
944 }
945 else {
946 PyObject *temp;
947 temp = PyUnicode_Concat(v, s);
948 Py_DECREF(s);
949 if (temp == NULL)
950 goto onError;
951 Py_DECREF(v);
952 v = temp;
953 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000954 }
955 }
956 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +0000957
958 onError:
959 Py_XDECREF(v);
960 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000961}
962
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000963static void
Skip Montanaro803d6e52000-08-12 18:09:51 +0000964com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000965{
Skip Montanaro803d6e52000-08-12 18:09:51 +0000966 PyObject *v;
967 int anchor = 0;
968 int save_begin = c->c_begin;
969
970 /* list_iter: for v in expr [list_iter] */
971 com_node(c, CHILD(n, 3)); /* expr */
972 v = PyInt_FromLong(0L);
973 if (v == NULL)
974 c->c_errors++;
975 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
976 com_push(c, 1);
977 Py_XDECREF(v);
978 c->c_begin = c->c_nexti;
979 com_addoparg(c, SET_LINENO, n->n_lineno);
980 com_addfwref(c, FOR_LOOP, &anchor);
981 com_push(c, 1);
982 com_assign(c, CHILD(n, 1), OP_ASSIGN);
983 c->c_loops++;
984 com_list_iter(c, n, e, t);
985 c->c_loops--;
986 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
987 c->c_begin = save_begin;
988 com_backpatch(c, anchor);
989 com_pop(c, 2); /* FOR_LOOP has popped these */
990}
991
992static void
993com_list_if(struct compiling *c, node *n, node *e, char *t)
994{
995 int anchor = 0;
996 int a = 0;
997 /* list_iter: 'if' test [list_iter] */
998 com_addoparg(c, SET_LINENO, n->n_lineno);
999 com_node(c, CHILD(n, 1));
1000 com_addfwref(c, JUMP_IF_FALSE, &a);
1001 com_addbyte(c, POP_TOP);
1002 com_pop(c, 1);
1003 com_list_iter(c, n, e, t);
1004 com_addfwref(c, JUMP_FORWARD, &anchor);
1005 com_backpatch(c, a);
1006 /* We jump here with an extra entry which we now pop */
1007 com_addbyte(c, POP_TOP);
1008 com_backpatch(c, anchor);
1009}
1010
1011static void
1012com_list_iter(struct compiling *c,
1013 node *p, /* parent of list_iter node */
1014 node *e, /* element expression node */
1015 char *t /* name of result list temp local */)
1016{
1017 /* list_iter is the last child in a listmaker, list_for, or list_if */
1018 node *n = CHILD(p, NCH(p)-1);
1019 if (TYPE(n) == list_iter) {
1020 n = CHILD(n, 0);
1021 switch (TYPE(n)) {
1022 case list_for:
1023 com_list_for(c, n, e, t);
1024 break;
1025 case list_if:
1026 com_list_if(c, n, e, t);
1027 break;
1028 default:
1029 com_error(c, PyExc_SystemError,
1030 "invalid list_iter node type");
1031 }
1032 }
1033 else {
1034 com_addopnamestr(c, LOAD_NAME, t);
1035 com_push(c, 1);
1036 com_node(c, e);
1037 com_addoparg(c, CALL_FUNCTION, 1);
1038 com_addbyte(c, POP_TOP);
1039 com_pop(c, 2);
1040 }
1041}
1042
1043static void
1044com_list_comprehension(struct compiling *c, node *n)
1045{
1046 /* listmaker: test list_iter */
1047 char tmpname[12];
1048 sprintf(tmpname, "__%d__", ++c->c_tmpname);
1049 com_addoparg(c, BUILD_LIST, 0);
1050 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1051 com_push(c, 2);
1052 com_addopnamestr(c, LOAD_ATTR, "append");
1053 com_addopnamestr(c, STORE_NAME, tmpname);
1054 com_pop(c, 1);
1055 com_list_iter(c, n, CHILD(n, 0), tmpname);
1056 com_addopnamestr(c, DELETE_NAME, tmpname);
1057 --c->c_tmpname;
1058}
1059
1060static void
1061com_listmaker(struct compiling *c, node *n)
1062{
1063 /* listmaker: test ( list_iter | (',' test)* [','] ) */
Thomas Wouters87df80d2000-08-13 17:05:17 +00001064 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_iter)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001065 com_list_comprehension(c, n);
1066 else {
1067 int len = 0;
1068 int i;
1069 for (i = 0; i < NCH(n); i += 2, len++)
1070 com_node(c, CHILD(n, i));
1071 com_addoparg(c, BUILD_LIST, len);
1072 com_pop(c, len-1);
1073 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001074}
1075
1076static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001077com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001078{
1079 int i;
1080 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1081 for (i = 0; i+2 < NCH(n); i += 4) {
1082 /* We must arrange things just right for STORE_SUBSCR.
1083 It wants the stack to look like (value) (dict) (key) */
1084 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001085 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001086 com_node(c, CHILD(n, i+2)); /* value */
1087 com_addbyte(c, ROT_TWO);
1088 com_node(c, CHILD(n, i)); /* key */
1089 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001090 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001091 }
1092}
1093
1094static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001095com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001096{
1097 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001098 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001099 int i;
1100 REQ(n, atom);
1101 ch = CHILD(n, 0);
1102 switch (TYPE(ch)) {
1103 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001104 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001105 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001106 com_push(c, 1);
1107 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001108 else
1109 com_node(c, CHILD(n, 1));
1110 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001111 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001112 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001113 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001114 com_push(c, 1);
1115 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001116 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001117 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001118 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001119 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001120 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001121 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001122 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001123 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001124 break;
1125 case BACKQUOTE:
1126 com_node(c, CHILD(n, 1));
1127 com_addbyte(c, UNARY_CONVERT);
1128 break;
1129 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001130 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001131 i = 255;
1132 }
1133 else {
1134 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001135 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001136 }
1137 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001138 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001139 break;
1140 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001141 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001142 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001143 c->c_errors++;
1144 i = 255;
1145 }
1146 else {
1147 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001148 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001149 }
1150 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001151 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001152 break;
1153 case NAME:
1154 com_addopname(c, LOAD_NAME, ch);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001155 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001156 break;
1157 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001158 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001159 com_error(c, PyExc_SystemError,
1160 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001161 }
1162}
1163
1164static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001165com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001166{
1167 if (NCH(n) == 1) {
1168 com_addbyte(c, op);
1169 }
1170 else if (NCH(n) == 2) {
1171 if (TYPE(CHILD(n, 0)) != COLON) {
1172 com_node(c, CHILD(n, 0));
1173 com_addbyte(c, op+1);
1174 }
1175 else {
1176 com_node(c, CHILD(n, 1));
1177 com_addbyte(c, op+2);
1178 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001179 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001180 }
1181 else {
1182 com_node(c, CHILD(n, 0));
1183 com_node(c, CHILD(n, 2));
1184 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001185 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001186 }
1187}
1188
Guido van Rossum635abd21997-01-06 22:56:52 +00001189static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001190com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001191{
1192 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001193 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001194 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001195 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001196 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001197 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001198 }
1199 else {
1200 com_node(c, CHILD(n, 0));
1201 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001202 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001203 }
1204 m = n;
1205 do {
1206 m = CHILD(m, 0);
1207 } while (NCH(m) == 1);
1208 if (TYPE(m) != NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001209 com_error(c, PyExc_SyntaxError,
1210 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001211 }
1212 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001213 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001214 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001215 *pkeywords = PyDict_New();
Guido van Rossum635abd21997-01-06 22:56:52 +00001216 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001217 c->c_errors++;
1218 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001219 if (PyDict_GetItem(*pkeywords, v) != NULL)
1220 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001221 "duplicate keyword argument");
1222 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001223 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001224 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001225 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001226 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001227 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001228 }
1229 }
1230 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001231}
1232
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001233static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001234com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001235{
1236 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001237 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001238 }
1239 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001240 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001241 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001242 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001243 int star_flag = 0;
1244 int starstar_flag = 0;
1245 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001246 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001247 na = 0;
1248 nk = 0;
1249 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001250 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001251 if (TYPE(ch) == STAR ||
1252 TYPE(ch) == DOUBLESTAR)
1253 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001254 if (ch->n_lineno != lineno) {
1255 lineno = ch->n_lineno;
1256 com_addoparg(c, SET_LINENO, lineno);
1257 }
1258 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001259 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001260 na++;
1261 else
1262 nk++;
1263 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001264 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001265 while (i < NCH(n)) {
1266 node *tok = CHILD(n, i);
1267 node *ch = CHILD(n, i+1);
1268 i += 3;
1269 switch (TYPE(tok)) {
1270 case STAR: star_flag = 1; break;
1271 case DOUBLESTAR: starstar_flag = 1; break;
1272 }
1273 com_node(c, ch);
1274 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001275 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001276 com_error(c, PyExc_SyntaxError,
1277 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001278 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001279 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001280 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001281 star_flag + (starstar_flag << 1);
1282 else
1283 opcode = CALL_FUNCTION;
1284 com_addoparg(c, opcode, na | (nk << 8));
1285 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001286 }
1287}
1288
1289static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001290com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001291{
1292 com_addopname(c, LOAD_ATTR, n);
1293}
1294
1295static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001296com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001297{
1298 int i=0;
1299 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001300 node *ch;
1301
1302 /* first argument */
1303 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001304 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001305 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001306 i++;
1307 }
1308 else {
1309 com_node(c, CHILD(n,i));
1310 i++;
1311 REQ(CHILD(n,i),COLON);
1312 i++;
1313 }
1314 /* second argument */
1315 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1316 com_node(c, CHILD(n,i));
1317 i++;
1318 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001319 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001320 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001321 com_push(c, 1);
1322 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001323 /* remaining arguments */
1324 for (; i < NCH(n); i++) {
1325 ns++;
1326 ch=CHILD(n,i);
1327 REQ(ch, sliceop);
1328 if (NCH(ch) == 1) {
1329 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001330 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001331 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001332 }
1333 else
1334 com_node(c, CHILD(ch,1));
1335 }
1336 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001337 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001338}
1339
1340static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001341com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001342{
1343 node *ch;
1344 REQ(n, subscript);
1345 ch = CHILD(n,0);
1346 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001347 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001348 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001349 com_push(c, 1);
1350 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001351 else {
1352 /* check for slice */
1353 if ((TYPE(ch) == COLON || NCH(n) > 1))
1354 com_sliceobj(c, n);
1355 else {
1356 REQ(ch, test);
1357 com_node(c, ch);
1358 }
1359 }
1360}
1361
1362static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001363com_subscriptlist(struct compiling *c, node *n, int assigning)
Guido van Rossum8861b741996-07-30 16:49:37 +00001364{
1365 int i, op;
1366 REQ(n, subscriptlist);
1367 /* Check to make backward compatible slice behavior for '[i:j]' */
1368 if (NCH(n) == 1) {
1369 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001370 /* 'Basic' slice, should have exactly one colon. */
1371 if ((TYPE(CHILD(sub, 0)) == COLON
1372 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1373 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1374 {
Guido van Rossum8861b741996-07-30 16:49:37 +00001375 if (assigning == OP_APPLY)
1376 op = SLICE;
1377 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001378 op = ((assigning == OP_ASSIGN) ?
1379 STORE_SLICE : DELETE_SLICE);
Guido van Rossum8861b741996-07-30 16:49:37 +00001380 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001381 if (op == STORE_SLICE)
1382 com_pop(c, 2);
1383 else if (op == DELETE_SLICE)
1384 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001385 return;
1386 }
1387 }
1388 /* Else normal subscriptlist. Compile each subscript. */
1389 for (i = 0; i < NCH(n); i += 2)
1390 com_subscript(c, CHILD(n, i));
1391 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001392 if (NCH(n) > 1) {
1393 i = (NCH(n)+1) / 2;
1394 com_addoparg(c, BUILD_TUPLE, i);
1395 com_pop(c, i-1);
1396 }
1397 if (assigning == OP_APPLY) {
Guido van Rossum8861b741996-07-30 16:49:37 +00001398 op = BINARY_SUBSCR;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001399 i = 1;
1400 }
1401 else if (assigning == OP_ASSIGN) {
1402 op = STORE_SUBSCR;
1403 i = 3;
1404 }
1405 else {
1406 op = DELETE_SUBSCR;
1407 i = 2;
1408 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001409 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001410 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001411}
1412
1413static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001414com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001415{
1416 REQ(n, trailer);
1417 switch (TYPE(CHILD(n, 0))) {
1418 case LPAR:
1419 com_call_function(c, CHILD(n, 1));
1420 break;
1421 case DOT:
1422 com_select_member(c, CHILD(n, 1));
1423 break;
1424 case LSQB:
Guido van Rossum8861b741996-07-30 16:49:37 +00001425 com_subscriptlist(c, CHILD(n, 1), OP_APPLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001426 break;
1427 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001428 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001429 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001430 }
1431}
1432
1433static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001434com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001435{
1436 int i;
1437 REQ(n, power);
1438 com_atom(c, CHILD(n, 0));
1439 for (i = 1; i < NCH(n); i++) {
1440 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1441 com_factor(c, CHILD(n, i+1));
1442 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001443 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001444 break;
1445 }
1446 else
1447 com_apply_trailer(c, CHILD(n, i));
1448 }
1449}
1450
1451static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001452com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001453{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001454 REQ(n, factor);
1455 if (TYPE(CHILD(n, 0)) == PLUS) {
1456 com_factor(c, CHILD(n, 1));
1457 com_addbyte(c, UNARY_POSITIVE);
1458 }
1459 else if (TYPE(CHILD(n, 0)) == MINUS) {
1460 com_factor(c, CHILD(n, 1));
1461 com_addbyte(c, UNARY_NEGATIVE);
1462 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001463 else if (TYPE(CHILD(n, 0)) == TILDE) {
1464 com_factor(c, CHILD(n, 1));
1465 com_addbyte(c, UNARY_INVERT);
1466 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001467 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001468 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001469 }
1470}
1471
1472static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001473com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001474{
1475 int i;
1476 int op;
1477 REQ(n, term);
1478 com_factor(c, CHILD(n, 0));
1479 for (i = 2; i < NCH(n); i += 2) {
1480 com_factor(c, CHILD(n, i));
1481 switch (TYPE(CHILD(n, i-1))) {
1482 case STAR:
1483 op = BINARY_MULTIPLY;
1484 break;
1485 case SLASH:
1486 op = BINARY_DIVIDE;
1487 break;
1488 case PERCENT:
1489 op = BINARY_MODULO;
1490 break;
1491 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001492 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001493 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001494 op = 255;
1495 }
1496 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001497 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001498 }
1499}
1500
1501static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001502com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001503{
1504 int i;
1505 int op;
1506 REQ(n, arith_expr);
1507 com_term(c, CHILD(n, 0));
1508 for (i = 2; i < NCH(n); i += 2) {
1509 com_term(c, CHILD(n, i));
1510 switch (TYPE(CHILD(n, i-1))) {
1511 case PLUS:
1512 op = BINARY_ADD;
1513 break;
1514 case MINUS:
1515 op = BINARY_SUBTRACT;
1516 break;
1517 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001518 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001519 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001520 op = 255;
1521 }
1522 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001523 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001524 }
1525}
1526
1527static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001528com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001529{
1530 int i;
1531 int op;
1532 REQ(n, shift_expr);
1533 com_arith_expr(c, CHILD(n, 0));
1534 for (i = 2; i < NCH(n); i += 2) {
1535 com_arith_expr(c, CHILD(n, i));
1536 switch (TYPE(CHILD(n, i-1))) {
1537 case LEFTSHIFT:
1538 op = BINARY_LSHIFT;
1539 break;
1540 case RIGHTSHIFT:
1541 op = BINARY_RSHIFT;
1542 break;
1543 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001544 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001545 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001546 op = 255;
1547 }
1548 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001549 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001550 }
1551}
1552
1553static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001554com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001555{
1556 int i;
1557 int op;
1558 REQ(n, and_expr);
1559 com_shift_expr(c, CHILD(n, 0));
1560 for (i = 2; i < NCH(n); i += 2) {
1561 com_shift_expr(c, CHILD(n, i));
1562 if (TYPE(CHILD(n, i-1)) == AMPER) {
1563 op = BINARY_AND;
1564 }
1565 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001566 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001567 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001568 op = 255;
1569 }
1570 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001571 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001572 }
1573}
1574
1575static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001576com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001577{
1578 int i;
1579 int op;
1580 REQ(n, xor_expr);
1581 com_and_expr(c, CHILD(n, 0));
1582 for (i = 2; i < NCH(n); i += 2) {
1583 com_and_expr(c, CHILD(n, i));
1584 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1585 op = BINARY_XOR;
1586 }
1587 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001588 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001589 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001590 op = 255;
1591 }
1592 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001593 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001594 }
1595}
1596
1597static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001598com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001599{
1600 int i;
1601 int op;
1602 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001603 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001604 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001605 com_xor_expr(c, CHILD(n, i));
1606 if (TYPE(CHILD(n, i-1)) == VBAR) {
1607 op = BINARY_OR;
1608 }
1609 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001610 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001611 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001612 op = 255;
1613 }
1614 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001615 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001616 }
1617}
1618
1619static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001620cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001621{
1622 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001623 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001624 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1625 if (NCH(n) == 1) {
1626 n = CHILD(n, 0);
1627 switch (TYPE(n)) {
1628 case LESS: return LT;
1629 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001630 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001631 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001632 case LESSEQUAL: return LE;
1633 case GREATEREQUAL: return GE;
1634 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001635 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1636 if (strcmp(STR(n), "is") == 0) return IS;
1637 }
1638 }
1639 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001640 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001641 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1642 return NOT_IN;
1643 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1644 return IS_NOT;
1645 }
1646 }
1647 return BAD;
1648}
1649
1650static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001651com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001652{
1653 int i;
1654 enum cmp_op op;
1655 int anchor;
1656 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1657 com_expr(c, CHILD(n, 0));
1658 if (NCH(n) == 1)
1659 return;
1660
1661 /****************************************************************
1662 The following code is generated for all but the last
1663 comparison in a chain:
1664
1665 label: on stack: opcode: jump to:
1666
1667 a <code to load b>
1668 a, b DUP_TOP
1669 a, b, b ROT_THREE
1670 b, a, b COMPARE_OP
1671 b, 0-or-1 JUMP_IF_FALSE L1
1672 b, 1 POP_TOP
1673 b
1674
1675 We are now ready to repeat this sequence for the next
1676 comparison in the chain.
1677
1678 For the last we generate:
1679
1680 b <code to load c>
1681 b, c COMPARE_OP
1682 0-or-1
1683
1684 If there were any jumps to L1 (i.e., there was more than one
1685 comparison), we generate:
1686
1687 0-or-1 JUMP_FORWARD L2
1688 L1: b, 0 ROT_TWO
1689 0, b POP_TOP
1690 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00001691 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001692 ****************************************************************/
1693
1694 anchor = 0;
1695
1696 for (i = 2; i < NCH(n); i += 2) {
1697 com_expr(c, CHILD(n, i));
1698 if (i+2 < NCH(n)) {
1699 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001700 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001701 com_addbyte(c, ROT_THREE);
1702 }
1703 op = cmp_type(CHILD(n, i-1));
1704 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001705 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001706 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001707 }
1708 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001709 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001710 if (i+2 < NCH(n)) {
1711 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1712 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001713 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001714 }
1715 }
1716
1717 if (anchor) {
1718 int anchor2 = 0;
1719 com_addfwref(c, JUMP_FORWARD, &anchor2);
1720 com_backpatch(c, anchor);
1721 com_addbyte(c, ROT_TWO);
1722 com_addbyte(c, POP_TOP);
1723 com_backpatch(c, anchor2);
1724 }
1725}
1726
1727static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001728com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001729{
1730 REQ(n, not_test); /* 'not' not_test | comparison */
1731 if (NCH(n) == 1) {
1732 com_comparison(c, CHILD(n, 0));
1733 }
1734 else {
1735 com_not_test(c, CHILD(n, 1));
1736 com_addbyte(c, UNARY_NOT);
1737 }
1738}
1739
1740static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001741com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001742{
1743 int i;
1744 int anchor;
1745 REQ(n, and_test); /* not_test ('and' not_test)* */
1746 anchor = 0;
1747 i = 0;
1748 for (;;) {
1749 com_not_test(c, CHILD(n, i));
1750 if ((i += 2) >= NCH(n))
1751 break;
1752 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1753 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001754 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001755 }
1756 if (anchor)
1757 com_backpatch(c, anchor);
1758}
1759
1760static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001761com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001762{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001763 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00001764 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001765 PyObject *v;
Guido van Rossum57531fe1993-11-30 14:57:42 +00001766 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001767 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001768 v = (PyObject *) icompile(CHILD(n, 0), c);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001769 if (v == NULL) {
1770 c->c_errors++;
1771 i = 255;
1772 }
1773 else {
1774 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001775 Py_DECREF(v);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001776 }
1777 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001778 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001779 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001780 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001781 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001782 else {
1783 int anchor = 0;
1784 int i = 0;
1785 for (;;) {
1786 com_and_test(c, CHILD(n, i));
1787 if ((i += 2) >= NCH(n))
1788 break;
1789 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1790 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001791 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001792 }
1793 if (anchor)
1794 com_backpatch(c, anchor);
1795 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001796}
1797
1798static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001799com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001800{
1801 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001802 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001803 com_node(c, CHILD(n, 0));
1804 }
1805 else {
1806 int i;
1807 int len;
1808 len = (NCH(n) + 1) / 2;
1809 for (i = 0; i < NCH(n); i += 2)
1810 com_node(c, CHILD(n, i));
1811 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001812 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001813 }
1814}
1815
1816
1817/* Begin of assignment compilation */
1818
Tim Petersdbd9ba62000-07-09 03:09:57 +00001819static void com_assign_name(struct compiling *, node *, int);
1820static void com_assign(struct compiling *, node *, int);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001821
1822static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001823com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001824{
1825 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001826 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001827}
1828
1829static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001830com_assign_trailer(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001831{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001832 REQ(n, trailer);
1833 switch (TYPE(CHILD(n, 0))) {
1834 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001835 com_error(c, PyExc_SyntaxError,
1836 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001837 break;
1838 case DOT: /* '.' NAME */
1839 com_assign_attr(c, CHILD(n, 1), assigning);
1840 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001841 case LSQB: /* '[' subscriptlist ']' */
1842 com_subscriptlist(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001843 break;
1844 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001845 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001846 }
1847}
1848
1849static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001850com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001851{
1852 int i;
1853 if (TYPE(n) != testlist)
1854 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001855 if (assigning) {
1856 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001857 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001858 com_push(c, i-1);
1859 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001860 for (i = 0; i < NCH(n); i += 2)
1861 com_assign(c, CHILD(n, i), assigning);
1862}
1863
1864static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001865com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001866{
1867 REQ(n, NAME);
1868 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001869 if (assigning)
1870 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001871}
1872
1873static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001874com_assign(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001875{
1876 /* Loop to avoid trivial recursion */
1877 for (;;) {
1878 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001879
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001880 case exprlist:
1881 case testlist:
1882 if (NCH(n) > 1) {
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001883 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001884 return;
1885 }
1886 n = CHILD(n, 0);
1887 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001888
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001889 case test:
1890 case and_test:
1891 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001892 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001893 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001894 case xor_expr:
1895 case and_expr:
1896 case shift_expr:
1897 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001898 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00001899 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001900 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001901 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001902 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001903 return;
1904 }
1905 n = CHILD(n, 0);
1906 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001907
Guido van Rossum50564e81996-01-12 01:13:16 +00001908 case power: /* atom trailer* ('**' power)* */
1909/* ('+'|'-'|'~') factor | atom trailer* */
1910 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001911 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001912 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001913 return;
1914 }
Guido van Rossum50564e81996-01-12 01:13:16 +00001915 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001916 int i;
1917 com_node(c, CHILD(n, 0));
1918 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00001919 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001920 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001921 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00001922 return;
1923 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001924 com_apply_trailer(c, CHILD(n, i));
1925 } /* NB i is still alive */
1926 com_assign_trailer(c,
1927 CHILD(n, i), assigning);
1928 return;
1929 }
1930 n = CHILD(n, 0);
1931 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001932
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001933 case atom:
1934 switch (TYPE(CHILD(n, 0))) {
1935 case LPAR:
1936 n = CHILD(n, 1);
1937 if (TYPE(n) == RPAR) {
1938 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001939 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001940 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001941 return;
1942 }
1943 break;
1944 case LSQB:
1945 n = CHILD(n, 1);
1946 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001947 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001948 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001949 return;
1950 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001951 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001952 return;
1953 case NAME:
1954 com_assign_name(c, CHILD(n, 0), assigning);
1955 return;
1956 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001957 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001958 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001959 return;
1960 }
1961 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001962
1963 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001964 com_error(c, PyExc_SyntaxError,
1965 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001966 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001967
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001968 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001969 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001970 com_error(c, PyExc_SystemError,
1971 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001972 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001973
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001974 }
1975 }
1976}
Guido van Rossum7c531111997-03-11 18:42:21 +00001977
Tim Petersdbd9ba62000-07-09 03:09:57 +00001978/* Forward */ static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001979
1980static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001981com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001982{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001983 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001984 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001985 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001986 return;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001987 com_node(c, CHILD(n, NCH(n)-1));
1988 if (NCH(n) == 1) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001989 if (c->c_interactive)
1990 com_addbyte(c, PRINT_EXPR);
1991 else
1992 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001993 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001994 }
1995 else {
1996 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001997 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001998 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001999 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002000 com_push(c, 1);
2001 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002002 com_assign(c, CHILD(n, i), OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002003 }
2004 }
2005}
2006
2007static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002008com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002009{
2010 int a = 0, b = 0;
2011 int i;
2012 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2013 /* Generate code like for
2014
2015 if __debug__:
2016 if not <test>:
2017 raise AssertionError [, <message>]
2018
2019 where <message> is the second test, if present.
2020 */
2021 if (Py_OptimizeFlag)
2022 return;
2023 com_addopnamestr(c, LOAD_GLOBAL, "__debug__");
2024 com_push(c, 1);
2025 com_addfwref(c, JUMP_IF_FALSE, &a);
2026 com_addbyte(c, POP_TOP);
2027 com_pop(c, 1);
2028 com_node(c, CHILD(n, 1));
2029 com_addfwref(c, JUMP_IF_TRUE, &b);
2030 com_addbyte(c, POP_TOP);
2031 com_pop(c, 1);
2032 /* Raise that exception! */
2033 com_addopnamestr(c, LOAD_GLOBAL, "AssertionError");
2034 com_push(c, 1);
2035 i = NCH(n)/2; /* Either 2 or 4 */
2036 if (i > 1)
2037 com_node(c, CHILD(n, 3));
2038 com_addoparg(c, RAISE_VARARGS, i);
2039 com_pop(c, i);
2040 /* The interpreter does not fall through */
2041 /* All jumps converge here */
2042 com_backpatch(c, a);
2043 com_backpatch(c, b);
2044 com_addbyte(c, POP_TOP);
2045}
2046
2047static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002048com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002049{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002050 int i = 1;
2051 node* stream = NULL;
2052
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002053 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002054
2055 /* are we using the extended print form? */
2056 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2057 stream = CHILD(n, 2);
2058 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2059 i = 4;
2060 else
2061 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002062 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002063 for (; i < NCH(n); i += 2) {
2064 if (stream != NULL) {
2065 /* stack: [...] => [... obj stream] */
2066 com_node(c, CHILD(n, i));
2067 com_node(c, stream);
2068 com_addbyte(c, PRINT_ITEM_TO);
2069 com_pop(c, 2);
2070 }
2071 else {
2072 /* stack: [...] => [... obj] */
2073 com_node(c, CHILD(n, i));
2074 com_addbyte(c, PRINT_ITEM);
2075 com_pop(c, 1);
2076 }
2077 }
2078 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
2079 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA) {
2080 if (stream != NULL) {
2081 com_node(c, stream);
2082 com_addbyte(c, PRINT_NEWLINE_TO);
2083 com_pop(c, 1);
2084 }
2085 else
2086 com_addbyte(c, PRINT_NEWLINE);
2087 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002088}
2089
2090static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002091com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002092{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002093 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002094 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002095 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002096 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002097 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002098 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002099 com_push(c, 1);
2100 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002101 else
2102 com_node(c, CHILD(n, 1));
2103 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002104 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002105}
2106
2107static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002108com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002109{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002110 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002111 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2112 if (NCH(n) > 1) {
2113 com_node(c, CHILD(n, 1));
2114 if (NCH(n) > 3) {
2115 com_node(c, CHILD(n, 3));
2116 if (NCH(n) > 5)
2117 com_node(c, CHILD(n, 5));
2118 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002119 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002120 i = NCH(n)/2;
2121 com_addoparg(c, RAISE_VARARGS, i);
2122 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002123}
2124
2125static void
Thomas Wouters52152252000-08-17 22:55:00 +00002126com_from_import(struct compiling *c, node *n)
2127{
2128 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2129 com_push(c, 1);
2130 if (NCH(n) > 1) {
2131 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2132 com_error(c, PyExc_SyntaxError, "invalid syntax");
2133 return;
2134 }
2135 com_addopname(c, STORE_NAME, CHILD(n, 2));
2136 } else
2137 com_addopname(c, STORE_NAME, CHILD(n, 0));
2138 com_pop(c, 1);
2139}
2140
2141static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002142com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002143{
2144 int i;
2145 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002146 /* 'import' dotted_name (',' dotted_name)* |
2147 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002148 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002149 /* 'from' dotted_name 'import' ... */
2150 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002151 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002152 com_push(c, 1);
Thomas Wouters52152252000-08-17 22:55:00 +00002153 if (TYPE(CHILD(n, 3)) == STAR)
2154 com_addbyte(c, IMPORT_STAR);
2155 else {
2156 for (i = 3; i < NCH(n); i += 2)
2157 com_from_import(c, CHILD(n, i));
2158 com_addbyte(c, POP_TOP);
2159 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002160 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002161 }
2162 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002163 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002164 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002165 node *subn = CHILD(n, i);
2166 REQ(subn, dotted_as_name);
2167 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002168 com_push(c, 1);
Thomas Wouters52152252000-08-17 22:55:00 +00002169 if (NCH(subn) > 1) {
Thomas Wouters8bad6122000-08-19 20:55:02 +00002170 if (strcmp(STR(CHILD(subn, 1)), "as") != 0 ||
2171 NCH(CHILD(subn, 0)) > 1) {
Thomas Wouters52152252000-08-17 22:55:00 +00002172 com_error(c, PyExc_SyntaxError,
2173 "invalid syntax");
2174 return;
2175 }
2176 com_addopname(c, STORE_NAME, CHILD(subn, 2));
2177 } else
2178 com_addopname(c, STORE_NAME,
2179 CHILD(CHILD(subn, 0),0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002180 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002181 }
2182 }
2183}
2184
2185static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002186com_global_stmt(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002187{
2188 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002189 REQ(n, global_stmt);
2190 /* 'global' NAME (',' NAME)* */
2191 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002192 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002193#ifdef PRIVATE_NAME_MANGLING
2194 char buffer[256];
2195 if (s != NULL && s[0] == '_' && s[1] == '_' &&
2196 c->c_private != NULL &&
Guido van Rossum582acec2000-06-28 22:07:35 +00002197 com_mangle(c, s, buffer, sizeof(buffer)))
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002198 s = buffer;
2199#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +00002200 if (PyDict_GetItemString(c->c_locals, s) != NULL) {
2201 com_error(c, PyExc_SyntaxError,
2202 "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002203 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002204 else if (PyDict_SetItemString(c->c_globals, s, Py_None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002205 c->c_errors++;
2206 }
2207}
2208
Guido van Rossum681d79a1995-07-18 14:51:37 +00002209static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002210com_newlocal_o(struct compiling *c, PyObject *nameval)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002211{
2212 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002213 PyObject *ival;
2214 if (PyList_Size(c->c_varnames) != c->c_nlocals) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002215 /* This is usually caused by an error on a previous call */
2216 if (c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002217 com_error(c, PyExc_SystemError,
2218 "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002219 }
2220 return 0;
2221 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002222 ival = PyInt_FromLong(i = c->c_nlocals++);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002223 if (ival == NULL)
2224 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002225 else if (PyDict_SetItem(c->c_locals, nameval, ival) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002226 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002227 else if (PyList_Append(c->c_varnames, nameval) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002228 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002229 Py_XDECREF(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002230 return i;
2231}
2232
2233static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002234com_addlocal_o(struct compiling *c, PyObject *nameval)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002235{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002236 PyObject *ival = PyDict_GetItem(c->c_locals, nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002237 if (ival != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002238 return PyInt_AsLong(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002239 return com_newlocal_o(c, nameval);
2240}
2241
2242static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002243com_newlocal(struct compiling *c, char *name)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002244{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002245 PyObject *nameval = PyString_InternFromString(name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002246 int i;
2247 if (nameval == NULL) {
2248 c->c_errors++;
2249 return 0;
2250 }
2251 i = com_newlocal_o(c, nameval);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002252 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002253 return i;
2254}
2255
Guido van Rossumc5e96291991-12-10 13:53:51 +00002256static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002257com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002258{
2259 REQ(n, exec_stmt);
2260 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2261 com_node(c, CHILD(n, 1));
2262 if (NCH(n) >= 4)
2263 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002264 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002265 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002266 com_push(c, 1);
2267 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002268 if (NCH(n) >= 6)
2269 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002270 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002271 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002272 com_push(c, 1);
2273 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002274 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002275 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002276}
2277
Guido van Rossum7c531111997-03-11 18:42:21 +00002278static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002279is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002280{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002281 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002282 int i;
2283
2284 /* Label to avoid tail recursion */
2285 next:
2286 switch (TYPE(n)) {
2287
2288 case suite:
2289 if (NCH(n) == 1) {
2290 n = CHILD(n, 0);
2291 goto next;
2292 }
2293 /* Fall through */
2294 case file_input:
2295 for (i = 0; i < NCH(n); i++) {
2296 node *ch = CHILD(n, i);
2297 if (TYPE(ch) == stmt) {
2298 n = ch;
2299 goto next;
2300 }
2301 }
2302 break;
2303
2304 case stmt:
2305 case simple_stmt:
2306 case small_stmt:
2307 n = CHILD(n, 0);
2308 goto next;
2309
2310 case expr_stmt:
2311 case testlist:
2312 case test:
2313 case and_test:
2314 case not_test:
2315 case comparison:
2316 case expr:
2317 case xor_expr:
2318 case and_expr:
2319 case shift_expr:
2320 case arith_expr:
2321 case term:
2322 case factor:
2323 case power:
2324 case atom:
2325 if (NCH(n) == 1) {
2326 n = CHILD(n, 0);
2327 goto next;
2328 }
2329 break;
2330
2331 case NAME:
2332 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2333 return 1;
2334 break;
2335
2336 case NUMBER:
2337 v = parsenumber(c, STR(n));
2338 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002339 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002340 break;
2341 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002342 i = PyObject_IsTrue(v);
2343 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002344 return i == 0;
2345
2346 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002347 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002348 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002349 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002350 break;
2351 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002352 i = PyObject_IsTrue(v);
2353 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002354 return i == 0;
2355
2356 }
2357 return 0;
2358}
2359
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002360static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002361com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002362{
2363 int i;
2364 int anchor = 0;
2365 REQ(n, if_stmt);
2366 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2367 for (i = 0; i+3 < NCH(n); i+=4) {
2368 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002369 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002370 if (is_constant_false(c, ch))
2371 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002372 if (i > 0)
2373 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002374 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002375 com_addfwref(c, JUMP_IF_FALSE, &a);
2376 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002377 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002378 com_node(c, CHILD(n, i+3));
2379 com_addfwref(c, JUMP_FORWARD, &anchor);
2380 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002381 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002382 com_addbyte(c, POP_TOP);
2383 }
2384 if (i+2 < NCH(n))
2385 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002386 if (anchor)
2387 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002388}
2389
2390static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002391com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002392{
2393 int break_anchor = 0;
2394 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002395 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002396 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2397 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002398 block_push(c, SETUP_LOOP);
2399 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002400 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002401 com_node(c, CHILD(n, 1));
2402 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2403 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002404 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002405 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002406 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002407 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002408 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2409 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002410 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002411 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002412 com_addbyte(c, POP_TOP);
2413 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002414 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002415 if (NCH(n) > 4)
2416 com_node(c, CHILD(n, 6));
2417 com_backpatch(c, break_anchor);
2418}
2419
2420static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002421com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002422{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002423 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002424 int break_anchor = 0;
2425 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002426 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002427 REQ(n, for_stmt);
2428 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2429 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002430 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002431 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002432 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002433 if (v == NULL)
2434 c->c_errors++;
2435 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002436 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002437 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002438 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002439 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002440 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002441 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002442 com_assign(c, CHILD(n, 1), OP_ASSIGN);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002443 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002444 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002445 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002446 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2447 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002448 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002449 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002450 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002451 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002452 if (NCH(n) > 8)
2453 com_node(c, CHILD(n, 8));
2454 com_backpatch(c, break_anchor);
2455}
2456
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002457/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002458
2459 SETUP_FINALLY L
2460 <code for S>
2461 POP_BLOCK
2462 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002463 L: <code for Sf>
2464 END_FINALLY
2465
2466 The special instructions use the block stack. Each block
2467 stack entry contains the instruction that created it (here
2468 SETUP_FINALLY), the level of the value stack at the time the
2469 block stack entry was created, and a label (here L).
2470
2471 SETUP_FINALLY:
2472 Pushes the current value stack level and the label
2473 onto the block stack.
2474 POP_BLOCK:
2475 Pops en entry from the block stack, and pops the value
2476 stack until its level is the same as indicated on the
2477 block stack. (The label is ignored.)
2478 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002479 Pops a variable number of entries from the *value* stack
2480 and re-raises the exception they specify. The number of
2481 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002482
2483 The block stack is unwound when an exception is raised:
2484 when a SETUP_FINALLY entry is found, the exception is pushed
2485 onto the value stack (and the exception condition is cleared),
2486 and the interpreter jumps to the label gotten from the block
2487 stack.
2488
2489 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002490 (The contents of the value stack is shown in [], with the top
2491 at the right; 'tb' is trace-back info, 'val' the exception's
2492 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002493
2494 Value stack Label Instruction Argument
2495 [] SETUP_EXCEPT L1
2496 [] <code for S>
2497 [] POP_BLOCK
2498 [] JUMP_FORWARD L0
2499
Guido van Rossum3f5da241990-12-20 15:06:42 +00002500 [tb, val, exc] L1: DUP )
2501 [tb, val, exc, exc] <evaluate E1> )
2502 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2503 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2504 [tb, val, exc, 1] POP )
2505 [tb, val, exc] POP
2506 [tb, val] <assign to V1> (or POP if no V1)
2507 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002508 [] <code for S1>
2509 JUMP_FORWARD L0
2510
Guido van Rossum3f5da241990-12-20 15:06:42 +00002511 [tb, val, exc, 0] L2: POP
2512 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002513 .............................etc.......................
2514
Guido van Rossum3f5da241990-12-20 15:06:42 +00002515 [tb, val, exc, 0] Ln+1: POP
2516 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002517
2518 [] L0: <next statement>
2519
2520 Of course, parts are not generated if Vi or Ei is not present.
2521*/
2522
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002523static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002524com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002525{
2526 int except_anchor = 0;
2527 int end_anchor = 0;
2528 int else_anchor = 0;
2529 int i;
2530 node *ch;
2531
2532 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2533 block_push(c, SETUP_EXCEPT);
2534 com_node(c, CHILD(n, 2));
2535 com_addbyte(c, POP_BLOCK);
2536 block_pop(c, SETUP_EXCEPT);
2537 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2538 com_backpatch(c, except_anchor);
2539 for (i = 3;
2540 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2541 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002542 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002543 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002544 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002545 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002546 break;
2547 }
2548 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002549 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002550 com_addoparg(c, SET_LINENO, ch->n_lineno);
2551 if (NCH(ch) > 1) {
2552 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002553 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002554 com_node(c, CHILD(ch, 1));
2555 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002556 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002557 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2558 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002559 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002560 }
2561 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002562 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002563 if (NCH(ch) > 3)
Guido van Rossum8861b741996-07-30 16:49:37 +00002564 com_assign(c, CHILD(ch, 3), OP_ASSIGN);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002565 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002566 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002567 com_pop(c, 1);
2568 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002569 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002570 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002571 com_node(c, CHILD(n, i+2));
2572 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2573 if (except_anchor) {
2574 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002575 /* We come in with [tb, val, exc, 0] on the
2576 stack; one pop and it's the same as
2577 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002578 com_addbyte(c, POP_TOP);
2579 }
2580 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002581 /* We actually come in here with [tb, val, exc] but the
2582 END_FINALLY will zap those and jump around.
2583 The c_stacklevel does not reflect them so we need not pop
2584 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002585 com_addbyte(c, END_FINALLY);
2586 com_backpatch(c, else_anchor);
2587 if (i < NCH(n))
2588 com_node(c, CHILD(n, i+2));
2589 com_backpatch(c, end_anchor);
2590}
2591
2592static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002593com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002594{
2595 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002596 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002597
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002598 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2599 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002600 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002601 com_addbyte(c, POP_BLOCK);
2602 block_pop(c, SETUP_FINALLY);
2603 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002604 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002605 /* While the generated code pushes only one item,
2606 the try-finally handling can enter here with
2607 up to three items. OK, here are the details:
2608 3 for an exception, 2 for RETURN, 1 for BREAK. */
2609 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002610 com_backpatch(c, finally_anchor);
2611 ch = CHILD(n, NCH(n)-1);
2612 com_addoparg(c, SET_LINENO, ch->n_lineno);
2613 com_node(c, ch);
2614 com_addbyte(c, END_FINALLY);
2615 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002616 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002617}
2618
2619static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002620com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002621{
2622 REQ(n, try_stmt);
2623 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2624 | 'try' ':' suite 'finally' ':' suite */
2625 if (TYPE(CHILD(n, 3)) != except_clause)
2626 com_try_finally(c, n);
2627 else
2628 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002629}
2630
Guido van Rossum8b993a91997-01-17 21:04:03 +00002631static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002632get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002633{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002634 int i;
2635
Guido van Rossum8b993a91997-01-17 21:04:03 +00002636 /* Label to avoid tail recursion */
2637 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002638 switch (TYPE(n)) {
2639
2640 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002641 if (NCH(n) == 1) {
2642 n = CHILD(n, 0);
2643 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002644 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002645 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002646 case file_input:
2647 for (i = 0; i < NCH(n); i++) {
2648 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002649 if (TYPE(ch) == stmt) {
2650 n = ch;
2651 goto next;
2652 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002653 }
2654 break;
2655
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002656 case stmt:
2657 case simple_stmt:
2658 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002659 n = CHILD(n, 0);
2660 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002661
2662 case expr_stmt:
2663 case testlist:
2664 case test:
2665 case and_test:
2666 case not_test:
2667 case comparison:
2668 case expr:
2669 case xor_expr:
2670 case and_expr:
2671 case shift_expr:
2672 case arith_expr:
2673 case term:
2674 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002675 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002676 if (NCH(n) == 1) {
2677 n = CHILD(n, 0);
2678 goto next;
2679 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002680 break;
2681
2682 case atom:
2683 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002684 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002685 break;
2686
2687 }
2688 return NULL;
2689}
2690
Guido van Rossum79f25d91997-04-29 20:08:16 +00002691static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002692get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002693{
Guido van Rossum541563e1999-01-28 15:08:09 +00002694 /* Don't generate doc-strings if run with -OO */
2695 if (Py_OptimizeFlag > 1)
2696 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002697 n = get_rawdocstring(n);
2698 if (n == NULL)
2699 return NULL;
2700 return parsestrplus(n);
2701}
2702
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002703static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002704com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002705{
2706 REQ(n, suite);
2707 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2708 if (NCH(n) == 1) {
2709 com_node(c, CHILD(n, 0));
2710 }
2711 else {
2712 int i;
2713 for (i = 0; i < NCH(n); i++) {
2714 node *ch = CHILD(n, i);
2715 if (TYPE(ch) == stmt)
2716 com_node(c, ch);
2717 }
2718 }
2719}
2720
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002721/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002722static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002723com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002724{
2725 int i = c->c_nblocks;
2726 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2727 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2728 }
2729 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002730 com_error(c, PyExc_SyntaxError,
2731 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002732 }
2733 /* XXX Could allow it inside a 'finally' clause
2734 XXX if we could pop the exception still on the stack */
2735}
2736
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002737static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002738com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002739{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002740 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002741 if (TYPE(n) == lambdef) {
2742 /* lambdef: 'lambda' [varargslist] ':' test */
2743 n = CHILD(n, 1);
2744 }
2745 else {
2746 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2747 n = CHILD(n, 2);
2748 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2749 n = CHILD(n, 1);
2750 }
2751 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002752 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002753 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002754 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002755 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2756 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002757 nargs = 0;
2758 ndefs = 0;
2759 for (i = 0; i < nch; i++) {
2760 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002761 if (TYPE(CHILD(n, i)) == STAR ||
2762 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002763 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002764 nargs++;
2765 i++;
2766 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002767 t = RPAR; /* Anything except EQUAL or COMMA */
2768 else
2769 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002770 if (t == EQUAL) {
2771 i++;
2772 ndefs++;
2773 com_node(c, CHILD(n, i));
2774 i++;
2775 if (i >= nch)
2776 break;
2777 t = TYPE(CHILD(n, i));
2778 }
2779 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00002780 /* Treat "(a=1, b)" as an error */
2781 if (ndefs)
2782 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00002783 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002784 }
2785 if (t != COMMA)
2786 break;
2787 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002788 return ndefs;
2789}
2790
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002791static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002792com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002793{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002794 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002795 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002796 v = (PyObject *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002797 if (v == NULL)
2798 c->c_errors++;
2799 else {
2800 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002801 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002802 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002803 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002804 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002805 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002806 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002807 com_pop(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002808 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002809 }
2810}
2811
2812static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002813com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002814{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002815 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002816 REQ(n, testlist);
2817 /* testlist: test (',' test)* [','] */
2818 for (i = 0; i < NCH(n); i += 2)
2819 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002820 i = (NCH(n)+1) / 2;
2821 com_addoparg(c, BUILD_TUPLE, i);
2822 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00002823}
2824
2825static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002826com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002827{
Guido van Rossum25831651993-05-19 14:50:45 +00002828 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002829 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002830 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002831 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00002832 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00002833 c->c_errors++;
2834 return;
2835 }
2836 /* Push the class name on the stack */
2837 i = com_addconst(c, v);
2838 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002839 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002840 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00002841 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002842 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00002843 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002844 com_push(c, 1);
2845 }
Guido van Rossum25831651993-05-19 14:50:45 +00002846 else
2847 com_bases(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002848 v = (PyObject *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002849 if (v == NULL)
2850 c->c_errors++;
2851 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002852 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002853 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002854 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002855 com_addoparg(c, MAKE_FUNCTION, 0);
2856 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002857 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002858 com_pop(c, 2);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002859 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002860 Py_DECREF(v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002861 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002862}
2863
2864static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002865com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002866{
2867 switch (TYPE(n)) {
2868
2869 /* Definition nodes */
2870
2871 case funcdef:
2872 com_funcdef(c, n);
2873 break;
2874 case classdef:
2875 com_classdef(c, n);
2876 break;
2877
2878 /* Trivial parse tree nodes */
2879
2880 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002881 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002882 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002883 com_node(c, CHILD(n, 0));
2884 break;
2885
2886 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002887 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2888 com_addoparg(c, SET_LINENO, n->n_lineno);
2889 {
2890 int i;
2891 for (i = 0; i < NCH(n)-1; i += 2)
2892 com_node(c, CHILD(n, i));
2893 }
2894 break;
2895
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002896 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002897 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002898 com_node(c, CHILD(n, 0));
2899 break;
2900
2901 /* Statement nodes */
2902
2903 case expr_stmt:
2904 com_expr_stmt(c, n);
2905 break;
2906 case print_stmt:
2907 com_print_stmt(c, n);
2908 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002909 case del_stmt: /* 'del' exprlist */
Guido van Rossum8861b741996-07-30 16:49:37 +00002910 com_assign(c, CHILD(n, 1), OP_DELETE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002911 break;
2912 case pass_stmt:
2913 break;
2914 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002915 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002916 com_error(c, PyExc_SyntaxError,
2917 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002918 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002919 com_addbyte(c, BREAK_LOOP);
2920 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002921 case continue_stmt:
2922 com_continue_stmt(c, n);
2923 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002924 case return_stmt:
2925 com_return_stmt(c, n);
2926 break;
2927 case raise_stmt:
2928 com_raise_stmt(c, n);
2929 break;
2930 case import_stmt:
2931 com_import_stmt(c, n);
2932 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002933 case global_stmt:
2934 com_global_stmt(c, n);
2935 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002936 case exec_stmt:
2937 com_exec_stmt(c, n);
2938 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002939 case assert_stmt:
2940 com_assert_stmt(c, n);
2941 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002942 case if_stmt:
2943 com_if_stmt(c, n);
2944 break;
2945 case while_stmt:
2946 com_while_stmt(c, n);
2947 break;
2948 case for_stmt:
2949 com_for_stmt(c, n);
2950 break;
2951 case try_stmt:
2952 com_try_stmt(c, n);
2953 break;
2954 case suite:
2955 com_suite(c, n);
2956 break;
2957
2958 /* Expression nodes */
2959
2960 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002961 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002962 break;
2963 case test:
2964 com_test(c, n);
2965 break;
2966 case and_test:
2967 com_and_test(c, n);
2968 break;
2969 case not_test:
2970 com_not_test(c, n);
2971 break;
2972 case comparison:
2973 com_comparison(c, n);
2974 break;
2975 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002976 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002977 break;
2978 case expr:
2979 com_expr(c, n);
2980 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002981 case xor_expr:
2982 com_xor_expr(c, n);
2983 break;
2984 case and_expr:
2985 com_and_expr(c, n);
2986 break;
2987 case shift_expr:
2988 com_shift_expr(c, n);
2989 break;
2990 case arith_expr:
2991 com_arith_expr(c, n);
2992 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002993 case term:
2994 com_term(c, n);
2995 break;
2996 case factor:
2997 com_factor(c, n);
2998 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00002999 case power:
3000 com_power(c, n);
3001 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003002 case atom:
3003 com_atom(c, n);
3004 break;
3005
3006 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003007 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003008 com_error(c, PyExc_SystemError,
3009 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003010 }
3011}
3012
Tim Petersdbd9ba62000-07-09 03:09:57 +00003013static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003014
3015static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003016com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003017{
3018 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3019 if (TYPE(CHILD(n, 0)) == LPAR)
3020 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003021 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003022 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003023 com_pop(c, 1);
3024 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003025}
3026
3027static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003028com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003029{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003030 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003031 if (NCH(n) == 1) {
3032 com_fpdef(c, CHILD(n, 0));
3033 }
3034 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003035 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003036 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003037 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003038 for (i = 0; i < NCH(n); i += 2)
3039 com_fpdef(c, CHILD(n, i));
3040 }
3041}
3042
3043static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003044com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003045{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003046 int nch, i;
3047 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003048 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003049 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003050 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003051 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003052 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003053 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003054 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003055 node *ch = CHILD(n, i);
3056 node *fp;
3057 char *name;
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003058 PyObject *nameval;
Guido van Rossum50564e81996-01-12 01:13:16 +00003059 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003060 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003061 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3062 fp = CHILD(ch, 0);
3063 if (TYPE(fp) == NAME)
3064 name = STR(fp);
3065 else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003066 name = nbuf;
3067 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003068 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003069 }
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003070 nameval = PyString_InternFromString(name);
3071 if (nameval == NULL) {
3072 c->c_errors++;
3073 }
Peter Schneider-Kamp9a5086c2000-07-13 06:24:29 +00003074 if (PyDict_GetItem(c->c_locals, nameval)) {
Fred Drakedcf08e02000-08-15 15:49:44 +00003075 com_error(c, PyExc_SyntaxError,
3076 "duplicate argument in function definition");
Peter Schneider-Kamp11384c62000-07-13 06:15:04 +00003077 }
3078 com_newlocal_o(c, nameval);
3079 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003080 c->c_argcount++;
3081 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003082 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003083 ch = CHILD(n, i);
3084 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003085 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003086 else
3087 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003088 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003089 /* Handle *arguments */
3090 if (i < nch) {
3091 node *ch;
3092 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003093 if (TYPE(ch) != DOUBLESTAR) {
3094 REQ(ch, STAR);
3095 ch = CHILD(n, i+1);
3096 if (TYPE(ch) == NAME) {
3097 c->c_flags |= CO_VARARGS;
3098 i += 3;
3099 com_newlocal(c, STR(ch));
3100 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003101 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003102 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003103 /* Handle **keywords */
3104 if (i < nch) {
3105 node *ch;
3106 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003107 if (TYPE(ch) != DOUBLESTAR) {
3108 REQ(ch, STAR);
3109 ch = CHILD(n, i+1);
3110 REQ(ch, STAR);
3111 ch = CHILD(n, i+2);
3112 }
3113 else
3114 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003115 REQ(ch, NAME);
3116 c->c_flags |= CO_VARKEYWORDS;
3117 com_newlocal(c, STR(ch));
3118 }
3119 if (complex) {
3120 /* Generate code for complex arguments only after
3121 having counted the simple arguments */
3122 int ilocal = 0;
3123 for (i = 0; i < nch; i++) {
3124 node *ch = CHILD(n, i);
3125 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003126 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003127 break;
3128 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3129 fp = CHILD(ch, 0);
3130 if (TYPE(fp) != NAME) {
3131 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003132 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003133 com_fpdef(c, ch);
3134 }
3135 ilocal++;
3136 if (++i >= nch)
3137 break;
3138 ch = CHILD(n, i);
3139 if (TYPE(ch) == EQUAL)
3140 i += 2;
3141 else
3142 REQ(ch, COMMA);
3143 }
3144 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003145}
3146
3147static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003148com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003149{
3150 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003151 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003152 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003153 doc = get_docstring(n);
3154 if (doc != NULL) {
3155 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003156 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003157 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003158 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003159 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003160 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003161 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003162 for (i = 0; i < NCH(n); i++) {
3163 node *ch = CHILD(n, i);
3164 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3165 com_node(c, ch);
3166 }
3167}
3168
3169/* Top-level compile-node interface */
3170
3171static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003172compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003173{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003174 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003175 node *ch;
3176 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003177 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003178 doc = get_docstring(CHILD(n, 4));
3179 if (doc != NULL) {
3180 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003181 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003182 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003183 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003184 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003185 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3186 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003187 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003188 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003189 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003190 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003191 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003192 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003193 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003194 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003195 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003196}
3197
3198static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003199compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003200{
Guido van Rossum590baa41993-11-30 13:40:46 +00003201 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003202 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003203 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003204
3205 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003206 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003207 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003208 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003209 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003210 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003211 else
3212 ch = CHILD(n, 2);
3213 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003214 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003215 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003216}
3217
3218static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003219compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003220{
3221 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003222 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003223 REQ(n, classdef);
3224 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3225 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003226#ifdef PRIVATE_NAME_MANGLING
3227 c->c_private = c->c_name;
3228#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003229 ch = CHILD(n, NCH(n)-1); /* The suite */
3230 doc = get_docstring(ch);
3231 if (doc != NULL) {
3232 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003233 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003234 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003235 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003236 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003237 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003238 }
3239 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003240 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003241 com_node(c, ch);
3242 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003243 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003244 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003245 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003246}
3247
3248static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003249compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003250{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003251 com_addoparg(c, SET_LINENO, n->n_lineno);
3252
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003253 switch (TYPE(n)) {
3254
Guido van Rossum4c417781991-01-21 16:09:22 +00003255 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003256 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003257 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003258 n = CHILD(n, 0);
3259 if (TYPE(n) != NEWLINE)
3260 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003261 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003262 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003263 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003264 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003265 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003266 break;
3267
Guido van Rossum4c417781991-01-21 16:09:22 +00003268 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003269 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003270 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003271 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003272 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003273 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003274 break;
3275
Guido van Rossum590baa41993-11-30 13:40:46 +00003276 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003277 com_node(c, CHILD(n, 0));
3278 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003279 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003280 break;
3281
Guido van Rossum590baa41993-11-30 13:40:46 +00003282 case lambdef: /* anonymous function definition */
3283 compile_lambdef(c, n);
3284 break;
3285
Guido van Rossum4c417781991-01-21 16:09:22 +00003286 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003287 compile_funcdef(c, n);
3288 break;
3289
Guido van Rossum4c417781991-01-21 16:09:22 +00003290 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003291 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003292 break;
3293
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003294 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003295 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003296 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003297 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003298 }
3299}
3300
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003301/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00003302
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003303 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
3304 instructions that refer to local variables with LOAD_FAST etc.
3305 The latter instructions are much faster because they don't need to
3306 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003307
Guido van Rossum681d79a1995-07-18 14:51:37 +00003308 To find all local variables, we check all STORE_NAME, IMPORT_FROM
3309 and DELETE_NAME instructions. This yields all local variables,
3310 function definitions, class definitions and import statements.
3311 Argument names have already been entered into the list by the
3312 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003313
3314 All remaining LOAD_NAME instructions must refer to non-local (global
3315 or builtin) variables, so are replaced by LOAD_GLOBAL.
3316
3317 There are two problems: 'from foo import *' and 'exec' may introduce
3318 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00003319 case, we can still optimize bona fide locals (since those
3320 statements will be surrounded by fast_2_locals() and
3321 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003322
Guido van Rossum681d79a1995-07-18 14:51:37 +00003323 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00003324
3325static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003326optimize(struct compiling *c)
Guido van Rossum282914b1991-04-04 10:42:56 +00003327{
Guido van Rossum0a697f61991-04-16 08:39:12 +00003328 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00003329 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00003330 int oparg = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003331 PyObject *name;
3332 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003333
Guido van Rossum282914b1991-04-04 10:42:56 +00003334#define NEXTOP() (*next_instr++)
3335#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossum79f25d91997-04-29 20:08:16 +00003336#define GETITEM(v, i) (PyList_GetItem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003337#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
3338
Guido van Rossum79f25d91997-04-29 20:08:16 +00003339 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003340
3341 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00003342
Guido van Rossum79f25d91997-04-29 20:08:16 +00003343 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003344 for (;;) {
3345 opcode = NEXTOP();
3346 if (opcode == STOP_CODE)
3347 break;
3348 if (HAS_ARG(opcode))
3349 oparg = NEXTARG();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003350 switch (opcode) {
3351 case STORE_NAME:
3352 case DELETE_NAME:
3353 case IMPORT_FROM:
3354 com_addlocal_o(c, GETNAMEOBJ(oparg));
3355 break;
Thomas Wouters52152252000-08-17 22:55:00 +00003356 case IMPORT_STAR:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003357 case EXEC_STMT:
3358 c->c_flags &= ~CO_OPTIMIZED;
3359 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00003360 }
3361 }
3362
Thomas Wouters52152252000-08-17 22:55:00 +00003363 /* TBD: Is this still necessary ? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003364 if (PyDict_GetItemString(c->c_locals, "*") != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003365 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003366
Guido van Rossum79f25d91997-04-29 20:08:16 +00003367 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003368 for (;;) {
3369 cur_instr = next_instr;
3370 opcode = NEXTOP();
3371 if (opcode == STOP_CODE)
3372 break;
3373 if (HAS_ARG(opcode))
3374 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003375 if (opcode == LOAD_NAME ||
3376 opcode == STORE_NAME ||
3377 opcode == DELETE_NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003378 PyObject *v;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003379 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00003380 name = GETNAMEOBJ(oparg);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003381 v = PyDict_GetItem(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003382 if (v == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003383 if (opcode == LOAD_NAME &&
3384 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003385 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003386 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00003387 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003388 i = PyInt_AsLong(v);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003389 switch (opcode) {
3390 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
3391 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
3392 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
3393 }
3394 cur_instr[1] = i & 0xff;
3395 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00003396 }
3397 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003398
Guido van Rossum681d79a1995-07-18 14:51:37 +00003399 if (c->c_errors == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00003400 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00003401}
3402
Guido van Rossum79f25d91997-04-29 20:08:16 +00003403PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003404PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003405{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003406 return jcompile(n, filename, NULL);
3407}
3408
Guido van Rossum79f25d91997-04-29 20:08:16 +00003409static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003410icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003411{
3412 return jcompile(n, base->c_filename, base);
3413}
3414
Guido van Rossum79f25d91997-04-29 20:08:16 +00003415static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003416jcompile(node *n, char *filename, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003417{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003418 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003419 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003420 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003421 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003422#ifdef PRIVATE_NAME_MANGLING
3423 if (base)
3424 sc.c_private = base->c_private;
3425 else
3426 sc.c_private = NULL;
3427#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003428 compile_node(&sc, n);
3429 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003430 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003431 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003432 sc.c_flags |= CO_NEWLOCALS;
3433 }
3434 else if (TYPE(n) == classdef)
3435 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00003436 co = NULL;
3437 if (sc.c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003438 PyObject *consts, *names, *varnames, *filename, *name;
3439 consts = PyList_AsTuple(sc.c_consts);
3440 names = PyList_AsTuple(sc.c_names);
3441 varnames = PyList_AsTuple(sc.c_varnames);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003442 filename = PyString_InternFromString(sc.c_filename);
3443 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003444 if (!PyErr_Occurred())
3445 co = PyCode_New(sc.c_argcount,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003446 sc.c_nlocals,
Guido van Rossum8b993a91997-01-17 21:04:03 +00003447 sc.c_maxstacklevel,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003448 sc.c_flags,
3449 sc.c_code,
3450 consts,
3451 names,
3452 varnames,
3453 filename,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003454 name,
3455 sc.c_firstlineno,
3456 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003457 Py_XDECREF(consts);
3458 Py_XDECREF(names);
3459 Py_XDECREF(varnames);
3460 Py_XDECREF(filename);
3461 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003462 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003463 else if (!PyErr_Occurred()) {
3464 /* This could happen if someone called PyErr_Clear() after an
3465 error was reported above. That's not supposed to happen,
3466 but I just plugged one case and I'm not sure there can't be
3467 others. In that case, raise SystemError so that at least
3468 it gets reported instead dumping core. */
3469 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3470 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003471 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003472 return co;
3473}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003474
3475int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003476PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003477{
3478 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003479 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003480 int line = co->co_firstlineno;
3481 int addr = 0;
3482 while (--size >= 0) {
3483 addr += *p++;
3484 if (addr > addrq)
3485 break;
3486 line += *p++;
3487 }
3488 return line;
3489}