blob: d713c7e250a99ec3a3a4f7e006d29af135adccf2 [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>
Guido van Rossum282914b1991-04-04 10:42:56 +000036
Guido van Rossumb05a5c71997-05-07 17:46:13 +000037/* Three symbols from graminit.h are also defined in Python.h, with
38 Py_ prefixes to their names. Python.h can't include graminit.h
39 (which defines too many confusing symbols), but we can check here
40 that they haven't changed (which is very unlikely, but possible). */
41#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000042 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000043#endif
44#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000045 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000046#endif
47#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000048 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000049#endif
50
Guido van Rossum8e793d91997-03-03 19:13:14 +000051int Py_OptimizeFlag = 0;
52
Guido van Rossum8861b741996-07-30 16:49:37 +000053#define OP_DELETE 0
54#define OP_ASSIGN 1
55#define OP_APPLY 2
56
Guido van Rossum79f25d91997-04-29 20:08:16 +000057#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000058
59static struct memberlist code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000060 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
61 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000062 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000063 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000064 {"co_code", T_OBJECT, OFF(co_code), READONLY},
65 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
66 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000067 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000068 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000069 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000070 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
71 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000072 {NULL} /* Sentinel */
73};
74
Guido van Rossum79f25d91997-04-29 20:08:16 +000075static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +000076code_getattr(co, name)
Guido van Rossum79f25d91997-04-29 20:08:16 +000077 PyCodeObject *co;
Guido van Rossum3f5da241990-12-20 15:06:42 +000078 char *name;
79{
Guido van Rossum79f25d91997-04-29 20:08:16 +000080 return PyMember_Get((char *)co, code_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +000081}
Guido van Rossum10dc2e81990-11-18 17:27:39 +000082
83static void
Guido van Rossum3f5da241990-12-20 15:06:42 +000084code_dealloc(co)
Guido van Rossum79f25d91997-04-29 20:08:16 +000085 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 *
Guido van Rossum2dff9911992-09-03 20:50:59 +000098code_repr(co)
Guido van Rossum79f25d91997-04-29 20:08:16 +000099 PyCodeObject *co;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000100{
101 char buf[500];
102 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000103 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000104 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000105
Guido van Rossuma396a882000-04-07 01:21:36 +0000106 if (co->co_firstlineno != 0)
107 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000108 if (co->co_filename && PyString_Check(co->co_filename))
109 filename = PyString_AsString(co->co_filename);
110 if (co->co_name && PyString_Check(co->co_name))
111 name = PyString_AsString(co->co_name);
Fred Drake615ae552000-06-30 16:20:13 +0000112 sprintf(buf, "<code object %.100s at %p, file \"%.300s\", line %d>",
113 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000114 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000115}
116
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000117static int
118code_compare(co, cp)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000119 PyCodeObject *co, *cp;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000120{
121 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000122 cmp = PyObject_Compare(co->co_name, cp->co_name);
123 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000124 cmp = co->co_argcount - cp->co_argcount;
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_nlocals - cp->co_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000127 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000128 cmp = co->co_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000129 if (cmp) return cmp;
Guido van Rossumd076c731998-10-07 19:42:25 +0000130 cmp = PyObject_Compare(co->co_code, cp->co_code);
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_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000133 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000134 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000135 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000136 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000137 return cmp;
138}
139
140static long
141code_hash(co)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000142 PyCodeObject *co;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000143{
Guido van Rossum44679592000-04-10 16:20:31 +0000144 long h, h0, h1, h2, h3, h4;
145 h0 = PyObject_Hash(co->co_name);
146 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000147 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000148 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000149 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000150 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000151 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000152 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000153 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000154 if (h4 == -1) return -1;
Guido van Rossum44679592000-04-10 16:20:31 +0000155 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000156 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000157 if (h == -1) h = -2;
158 return h;
159}
160
Guido van Rossum79f25d91997-04-29 20:08:16 +0000161PyTypeObject PyCode_Type = {
162 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000163 0,
164 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000165 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000166 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000167 (destructor)code_dealloc, /*tp_dealloc*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000168 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000169 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000170 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000171 (cmpfunc)code_compare, /*tp_compare*/
172 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000173 0, /*tp_as_number*/
174 0, /*tp_as_sequence*/
175 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000176 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000177};
178
Guido van Rossum644a12b1997-04-09 19:24:53 +0000179#define NAME_CHARS \
180 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
181
Guido van Rossum79f25d91997-04-29 20:08:16 +0000182PyCodeObject *
183PyCode_New(argcount, nlocals, stacksize, flags,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000184 code, consts, names, varnames, filename, name,
185 firstlineno, lnotab)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000186 int argcount;
187 int nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000188 int stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000189 int flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000190 PyObject *code;
191 PyObject *consts;
192 PyObject *names;
193 PyObject *varnames;
194 PyObject *filename;
195 PyObject *name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000196 int firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000197 PyObject *lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000198{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000199 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000200 int i;
Guido van Rossumd076c731998-10-07 19:42:25 +0000201 PyBufferProcs *pb;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000202 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000203 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000204 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000205 consts == NULL || !PyTuple_Check(consts) ||
206 names == NULL || !PyTuple_Check(names) ||
207 varnames == NULL || !PyTuple_Check(varnames) ||
208 name == NULL || !PyString_Check(name) ||
209 filename == NULL || !PyString_Check(filename) ||
210 lnotab == NULL || !PyString_Check(lnotab)) {
211 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000212 return NULL;
213 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000214 pb = code->ob_type->tp_as_buffer;
215 if (pb == NULL ||
216 pb->bf_getreadbuffer == NULL ||
217 pb->bf_getsegcount == NULL ||
218 (*pb->bf_getsegcount)(code, NULL) != 1)
219 {
220 PyErr_BadInternalCall();
221 return NULL;
222 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000223 /* Make sure names and varnames are all strings, & intern them */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000224 for (i = PyTuple_Size(names); --i >= 0; ) {
225 PyObject *v = PyTuple_GetItem(names, i);
226 if (v == NULL || !PyString_Check(v)) {
227 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000228 return NULL;
229 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000230 PyString_InternInPlace(&PyTuple_GET_ITEM(names, i));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000231 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000232 for (i = PyTuple_Size(varnames); --i >= 0; ) {
233 PyObject *v = PyTuple_GetItem(varnames, i);
234 if (v == NULL || !PyString_Check(v)) {
235 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000236 return NULL;
237 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000238 PyString_InternInPlace(&PyTuple_GET_ITEM(varnames, i));
239 }
240 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000241 for (i = PyTuple_Size(consts); --i >= 0; ) {
242 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000243 char *p;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000245 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000246 p = PyString_AsString(v);
Guido van Rossum582acec2000-06-28 22:07:35 +0000247 if (strspn(p, NAME_CHARS)
248 != (size_t)PyString_Size(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000249 continue;
250 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000251 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000252 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000253 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000254 co->co_argcount = argcount;
255 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000256 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000257 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000258 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000259 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000260 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000261 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000262 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000263 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000264 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000265 co->co_varnames = varnames;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000266 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000267 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000268 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000269 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000270 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000271 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000272 co->co_lnotab = lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000273 }
274 return co;
275}
276
277
278/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000279
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000280struct compiling {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000281 PyObject *c_code; /* string */
282 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000283 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000284 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000285 PyObject *c_name_dict; /* inverse of c_names */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000286 PyObject *c_globals; /* dictionary (value=None) */
287 PyObject *c_locals; /* dictionary (value=localID) */
288 PyObject *c_varnames; /* list (inverse of c_locals) */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000289 int c_nlocals; /* index of next local */
290 int c_argcount; /* number of top-level arguments */
291 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000292 int c_nexti; /* index into c_code */
293 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000294 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000295 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000296 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000297 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000298 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000299 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000300 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000301 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000302 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000303 int c_stacklevel; /* Current stack level */
304 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000305 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000306 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000307 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000308#ifdef PRIVATE_NAME_MANGLING
309 char *c_private; /* for private name mangling */
310#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000311};
312
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000313
Guido van Rossum452a9831996-09-17 14:32:04 +0000314/* Error message including line number */
315
316static void
317com_error(c, exc, msg)
318 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000319 PyObject *exc;
Guido van Rossum452a9831996-09-17 14:32:04 +0000320 char *msg;
321{
Guido van Rossum582acec2000-06-28 22:07:35 +0000322 size_t n = strlen(msg);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000323 PyObject *v;
Guido van Rossum452a9831996-09-17 14:32:04 +0000324 char buffer[30];
325 char *s;
Guido van Rossum635abd21997-01-06 22:56:52 +0000326 c->c_errors++;
Guido van Rossum452a9831996-09-17 14:32:04 +0000327 if (c->c_lineno <= 1) {
328 /* Unknown line number or single interactive command */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000329 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000330 return;
331 }
332 sprintf(buffer, " (line %d)", c->c_lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000333 v = PyString_FromStringAndSize((char *)NULL, n + strlen(buffer));
Guido van Rossum452a9831996-09-17 14:32:04 +0000334 if (v == NULL)
335 return; /* MemoryError, too bad */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000336 s = PyString_AS_STRING((PyStringObject *)v);
Guido van Rossum452a9831996-09-17 14:32:04 +0000337 strcpy(s, msg);
338 strcat(s, buffer);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000339 PyErr_SetObject(exc, v);
340 Py_DECREF(v);
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
347block_push(c, type)
348 struct compiling *c;
349 int type;
350{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000351 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000352 com_error(c, PyExc_SystemError,
353 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000354 }
355 else {
356 c->c_block[c->c_nblocks++] = type;
357 }
358}
359
360static void
361block_pop(c, type)
362 struct compiling *c;
363 int type;
364{
365 if (c->c_nblocks > 0)
366 c->c_nblocks--;
367 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000368 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000369 }
370}
371
372
Guido van Rossum681d79a1995-07-18 14:51:37 +0000373/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000374
Guido van Rossum79f25d91997-04-29 20:08:16 +0000375static int com_init Py_PROTO((struct compiling *, char *));
376static void com_free Py_PROTO((struct compiling *));
377static void com_push Py_PROTO((struct compiling *, int));
378static void com_pop Py_PROTO((struct compiling *, int));
379static void com_done Py_PROTO((struct compiling *));
380static void com_node Py_PROTO((struct compiling *, struct _node *));
381static void com_factor Py_PROTO((struct compiling *, struct _node *));
382static void com_addbyte Py_PROTO((struct compiling *, int));
383static void com_addint Py_PROTO((struct compiling *, int));
384static void com_addoparg Py_PROTO((struct compiling *, int, int));
385static void com_addfwref Py_PROTO((struct compiling *, int, int *));
386static void com_backpatch Py_PROTO((struct compiling *, int));
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000387static int com_add Py_PROTO((struct compiling *, PyObject *, PyObject *, PyObject *));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000388static int com_addconst Py_PROTO((struct compiling *, PyObject *));
389static int com_addname Py_PROTO((struct compiling *, PyObject *));
390static void com_addopname Py_PROTO((struct compiling *, int, node *));
391static void com_list Py_PROTO((struct compiling *, node *, int));
392static int com_argdefs Py_PROTO((struct compiling *, node *));
393static int com_newlocal Py_PROTO((struct compiling *, char *));
394static PyCodeObject *icompile Py_PROTO((struct _node *, struct compiling *));
395static PyCodeObject *jcompile Py_PROTO((struct _node *, char *,
396 struct compiling *));
397static PyObject *parsestrplus Py_PROTO((node *));
398static PyObject *parsestr Py_PROTO((char *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000399
400static int
Guido van Rossum590baa41993-11-30 13:40:46 +0000401com_init(c, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000402 struct compiling *c;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000403 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000404{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000405 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000406 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
407 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000408 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000409 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000410 goto fail;
411 if ((c->c_const_dict = PyDict_New()) == NULL)
412 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000413 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000414 goto fail;
415 if ((c->c_name_dict = PyDict_New()) == NULL)
416 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000417 if ((c->c_globals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000418 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000419 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000420 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000421 if ((c->c_varnames = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000422 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000423 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
424 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000425 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000426 c->c_nlocals = 0;
427 c->c_argcount = 0;
428 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000429 c->c_nexti = 0;
430 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000431 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000432 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000433 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000434 c->c_begin = 0;
435 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000436 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000437 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000438 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000439 c->c_stacklevel = 0;
440 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000441 c->c_firstlineno = 0;
442 c->c_last_addr = 0;
443 c->c_last_line = 0;
444 c-> c_lnotab_next = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000445 return 1;
446
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000447 fail:
448 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000449 return 0;
450}
451
452static void
453com_free(c)
454 struct compiling *c;
455{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000456 Py_XDECREF(c->c_code);
457 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000458 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000459 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000460 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000461 Py_XDECREF(c->c_globals);
462 Py_XDECREF(c->c_locals);
463 Py_XDECREF(c->c_varnames);
464 Py_XDECREF(c->c_lnotab);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000465}
466
467static void
Guido van Rossum8b993a91997-01-17 21:04:03 +0000468com_push(c, n)
469 struct compiling *c;
470 int n;
471{
472 c->c_stacklevel += n;
473 if (c->c_stacklevel > c->c_maxstacklevel)
474 c->c_maxstacklevel = c->c_stacklevel;
475}
476
477static void
478com_pop(c, n)
479 struct compiling *c;
480 int n;
481{
482 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000483 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000484 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
485 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000486 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000487 c->c_stacklevel = 0;
488 }
489 else
490 c->c_stacklevel -= n;
491}
492
493static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000494com_done(c)
495 struct compiling *c;
496{
497 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000498 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000499 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000500 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000501}
502
503static void
504com_addbyte(c, byte)
505 struct compiling *c;
506 int byte;
507{
508 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000509 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000510 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000511 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000512 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000513 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000514 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000515 com_error(c, PyExc_SystemError,
516 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000517 }
518 if (c->c_code == NULL)
519 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000520 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000521 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000522 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000523 c->c_errors++;
524 return;
525 }
526 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000527 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000528}
529
530static void
531com_addint(c, x)
532 struct compiling *c;
533 int x;
534{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000535 com_addbyte(c, x & 0xff);
536 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000537}
538
539static void
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000540com_add_lnotab(c, addr, line)
541 struct compiling *c;
542 int addr;
543 int line;
544{
545 int size;
546 char *p;
547 if (c->c_lnotab == NULL)
548 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000549 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000550 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000551 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000552 c->c_errors++;
553 return;
554 }
555 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000556 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000557 *p++ = addr;
558 *p++ = line;
559 c->c_lnotab_next += 2;
560}
561
562static void
563com_set_lineno(c, lineno)
564 struct compiling *c;
565 int lineno;
566{
567 c->c_lineno = lineno;
568 if (c->c_firstlineno == 0) {
569 c->c_firstlineno = c->c_last_line = lineno;
570 }
571 else {
572 int incr_addr = c->c_nexti - c->c_last_addr;
573 int incr_line = lineno - c->c_last_line;
574 while (incr_addr > 0 || incr_line > 0) {
575 int trunc_addr = incr_addr;
576 int trunc_line = incr_line;
577 if (trunc_addr > 255)
578 trunc_addr = 255;
579 if (trunc_line > 255)
580 trunc_line = 255;
581 com_add_lnotab(c, trunc_addr, trunc_line);
582 incr_addr -= trunc_addr;
583 incr_line -= trunc_line;
584 }
585 c->c_last_addr = c->c_nexti;
586 c->c_last_line = lineno;
587 }
588}
589
590static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000591com_addoparg(c, op, arg)
592 struct compiling *c;
593 int op;
594 int arg;
595{
Guido van Rossum8e793d91997-03-03 19:13:14 +0000596 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000597 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000598 if (Py_OptimizeFlag)
599 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000600 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000601 com_addbyte(c, op);
602 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000603}
604
605static void
606com_addfwref(c, op, p_anchor)
607 struct compiling *c;
608 int op;
609 int *p_anchor;
610{
611 /* Compile a forward reference for backpatching */
612 int here;
613 int anchor;
614 com_addbyte(c, op);
615 here = c->c_nexti;
616 anchor = *p_anchor;
617 *p_anchor = here;
618 com_addint(c, anchor == 0 ? 0 : here - anchor);
619}
620
621static void
622com_backpatch(c, anchor)
623 struct compiling *c;
624 int anchor; /* Must be nonzero */
625{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000626 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000627 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000628 int dist;
629 int prev;
630 for (;;) {
631 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000632 prev = code[anchor] + (code[anchor+1] << 8);
633 dist = target - (anchor+2);
634 code[anchor] = dist & 0xff;
635 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000636 if (!prev)
637 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000638 anchor -= prev;
639 }
640}
641
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000642/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000643
644static int
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000645com_add(c, list, dict, v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000646 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000647 PyObject *list;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000648 PyObject *dict;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000649 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000650{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000651 PyObject *w, *t, *np=NULL;
652 long n;
653
654 t = Py_BuildValue("(OO)", v, v->ob_type);
655 if (t == NULL)
656 goto fail;
657 w = PyDict_GetItem(dict, t);
658 if (w != NULL) {
659 n = PyInt_AsLong(w);
660 } else {
661 n = PyList_Size(list);
662 np = PyInt_FromLong(n);
663 if (np == NULL)
664 goto fail;
665 if (PyList_Append(list, v) != 0)
666 goto fail;
667 if (PyDict_SetItem(dict, t, np) != 0)
668 goto fail;
669 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000670 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000671 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000672 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000673 fail:
674 Py_XDECREF(np);
675 Py_XDECREF(t);
676 c->c_errors++;
677 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000678}
679
680static int
681com_addconst(c, v)
682 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000683 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000684{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000685 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000686}
687
688static int
689com_addname(c, v)
690 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000691 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000692{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000693 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000694}
695
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000696#ifdef PRIVATE_NAME_MANGLING
697static int
698com_mangle(c, name, buffer, maxlen)
699 struct compiling *c;
700 char *name;
701 char *buffer;
Guido van Rossum582acec2000-06-28 22:07:35 +0000702 size_t maxlen;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000703{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000704 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000705 This is independent from how the name is used. */
706 char *p;
Guido van Rossum582acec2000-06-28 22:07:35 +0000707 size_t nlen, plen;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000708 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000709 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000710 return 0; /* Don't mangle __extremely_long_names */
711 if (name[nlen-1] == '_' && name[nlen-2] == '_')
712 return 0; /* Don't mangle __whatever__ */
713 p = c->c_private;
714 /* Strip leading underscores from class name */
715 while (*p == '_')
716 p++;
717 if (*p == '\0')
718 return 0; /* Don't mangle if class is just underscores */
719 plen = strlen(p);
720 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000721 plen = maxlen-nlen-2; /* Truncate class name if too long */
722 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000723 buffer[0] = '_';
724 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000725 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000726 /* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
727 return 1;
728}
729#endif
730
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000731static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000732com_addopnamestr(c, op, name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000733 struct compiling *c;
734 int op;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000735 char *name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000736{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000737 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000738 int i;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000739#ifdef PRIVATE_NAME_MANGLING
740 char buffer[256];
741 if (name != NULL && name[0] == '_' && name[1] == '_' &&
742 c->c_private != NULL &&
Guido van Rossum582acec2000-06-28 22:07:35 +0000743 com_mangle(c, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000744 name = buffer;
745#endif
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000746 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000747 c->c_errors++;
748 i = 255;
749 }
750 else {
751 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000752 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000753 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000754 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
755 switch (op) {
756 case LOAD_NAME:
757 case STORE_NAME:
758 case DELETE_NAME:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000759 if (PyDict_GetItemString(c->c_globals, name) != NULL) {
Guido van Rossumc5e96291991-12-10 13:53:51 +0000760 switch (op) {
761 case LOAD_NAME: op = LOAD_GLOBAL; break;
762 case STORE_NAME: op = STORE_GLOBAL; break;
763 case DELETE_NAME: op = DELETE_GLOBAL; break;
764 }
765 }
766 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000767 com_addoparg(c, op, i);
768}
769
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000770static void
771com_addopname(c, op, n)
772 struct compiling *c;
773 int op;
774 node *n;
775{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000776 char *name;
777 char buffer[1000];
778 /* XXX it is possible to write this code without the 1000
779 chars on the total length of dotted names, I just can't be
780 bothered right now */
781 if (TYPE(n) == STAR)
782 name = "*";
783 else if (TYPE(n) == dotted_name) {
784 char *p = buffer;
785 int i;
786 name = buffer;
787 for (i = 0; i < NCH(n); i += 2) {
788 char *s = STR(CHILD(n, i));
789 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000790 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000791 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +0000792 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000793 break;
794 }
795 if (p != buffer)
796 *p++ = '.';
797 strcpy(p, s);
798 p = strchr(p, '\0');
799 }
800 }
801 else {
802 REQ(n, NAME);
803 name = STR(n);
804 }
805 com_addopnamestr(c, op, name);
806}
807
Guido van Rossum79f25d91997-04-29 20:08:16 +0000808static PyObject *
Guido van Rossum452a9831996-09-17 14:32:04 +0000809parsenumber(co, s)
810 struct compiling *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000811 char *s;
812{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000813 extern double atof Py_PROTO((const char *));
Guido van Rossumc5e96291991-12-10 13:53:51 +0000814 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000815 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000816 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +0000817#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +0000818 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +0000819 int imflag;
820#endif
821
Guido van Rossum282914b1991-04-04 10:42:56 +0000822 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000823 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +0000824#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +0000825 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +0000826#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000827 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000828 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000829 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +0000830 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000831 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000832 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000833 if (*end == '\0') {
834 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000835 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000836 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000837 return NULL;
838 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000839 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000840 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000841 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +0000842#ifndef WITHOUT_COMPLEX
843 if (imflag) {
844 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000845 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +0000846 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000847 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000848 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +0000849 }
Guido van Rossumac1fc951997-10-08 15:23:55 +0000850 else
Guido van Rossum50564e81996-01-12 01:13:16 +0000851#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +0000852 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000853 PyFPE_START_PROTECT("atof", return 0)
854 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000855 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000856 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000857 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000858}
859
Guido van Rossum79f25d91997-04-29 20:08:16 +0000860static PyObject *
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000861parsestr(s)
862 char *s;
863{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000864 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +0000865 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000866 char *buf;
867 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000868 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000869 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +0000870 int first = *s;
871 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000872 int rawmode = 0;
873 int unicode = 0;
874 if (isalpha(quote) || quote == '_') {
875 if (quote == 'u' || quote == 'U') {
876 quote = *++s;
877 unicode = 1;
878 }
879 if (quote == 'r' || quote == 'R') {
880 quote = *++s;
881 rawmode = 1;
882 }
883 }
Guido van Rossum8054fad1993-10-26 15:19:44 +0000884 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000885 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000886 return NULL;
887 }
888 s++;
889 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +0000890 if (len > INT_MAX) {
891 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
892 return NULL;
893 }
Guido van Rossum8054fad1993-10-26 15:19:44 +0000894 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000895 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000896 return NULL;
897 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000898 if (len >= 4 && s[0] == quote && s[1] == quote) {
899 s += 2;
900 len -= 2;
901 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000902 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000903 return NULL;
904 }
905 }
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +0000906 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000907 if (rawmode)
908 return PyUnicode_DecodeRawUnicodeEscape(
909 s, len, NULL);
910 else
911 return PyUnicode_DecodeUnicodeEscape(
912 s, len, NULL);
913 }
914 else if (rawmode || strchr(s, '\\') == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000915 return PyString_FromStringAndSize(s, len);
Guido van Rossum5aa88f02000-03-10 23:01:36 +0000916 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000917 v = PyString_FromStringAndSize((char *)NULL, len);
918 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000919 end = s + len;
920 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000921 if (*s != '\\') {
922 *p++ = *s++;
923 continue;
924 }
925 s++;
926 switch (*s++) {
927 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000928 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000929 case '\\': *p++ = '\\'; break;
930 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000931 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000932 case 'b': *p++ = '\b'; break;
933 case 'f': *p++ = '\014'; break; /* FF */
934 case 't': *p++ = '\t'; break;
935 case 'n': *p++ = '\n'; break;
936 case 'r': *p++ = '\r'; break;
937 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000938 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
939 case '0': case '1': case '2': case '3':
940 case '4': case '5': case '6': case '7':
941 c = s[-1] - '0';
942 if ('0' <= *s && *s <= '7') {
943 c = (c<<3) + *s++ - '0';
944 if ('0' <= *s && *s <= '7')
945 c = (c<<3) + *s++ - '0';
946 }
947 *p++ = c;
948 break;
949 case 'x':
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000950 if (isxdigit(Py_CHARMASK(*s))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000951 unsigned int x = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000952 do {
Guido van Rossumed1100f1997-10-20 23:24:07 +0000953 c = Py_CHARMASK(*s);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000954 s++;
Guido van Rossumed1100f1997-10-20 23:24:07 +0000955 x = (x<<4) & ~0xF;
956 if (isdigit(c))
957 x += c - '0';
958 else if (islower(c))
959 x += 10 + c - 'a';
960 else
961 x += 10 + c - 'A';
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000962 } while (isxdigit(Py_CHARMASK(*s)));
Guido van Rossumed1100f1997-10-20 23:24:07 +0000963 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000964 break;
965 }
966 /* FALLTHROUGH */
967 default: *p++ = '\\'; *p++ = s[-1]; break;
968 }
969 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000970 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000971 return v;
972}
973
Guido van Rossum79f25d91997-04-29 20:08:16 +0000974static PyObject *
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000975parsestrplus(n)
976 node *n;
977{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000978 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000979 int i;
980 REQ(CHILD(n, 0), STRING);
981 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
982 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +0000983 for (i = 1; i < NCH(n); i++) {
984 PyObject *s;
985 s = parsestr(STR(CHILD(n, i)));
986 if (s == NULL)
987 goto onError;
988 if (PyString_Check(v) && PyString_Check(s)) {
989 PyString_ConcatAndDel(&v, s);
990 if (v == NULL)
991 goto onError;
992 }
993 else {
994 PyObject *temp;
995 temp = PyUnicode_Concat(v, s);
996 Py_DECREF(s);
997 if (temp == NULL)
998 goto onError;
999 Py_DECREF(v);
1000 v = temp;
1001 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001002 }
1003 }
1004 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001005
1006 onError:
1007 Py_XDECREF(v);
1008 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001009}
1010
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001011static void
1012com_list_constructor(c, n)
1013 struct compiling *c;
1014 node *n;
1015{
1016 int len;
1017 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001018 if (TYPE(n) != testlist)
1019 REQ(n, exprlist);
1020 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
1021 len = (NCH(n) + 1) / 2;
1022 for (i = 0; i < NCH(n); i += 2)
1023 com_node(c, CHILD(n, i));
1024 com_addoparg(c, BUILD_LIST, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001025 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001026}
1027
1028static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001029com_dictmaker(c, n)
1030 struct compiling *c;
1031 node *n;
1032{
1033 int i;
1034 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1035 for (i = 0; i+2 < NCH(n); i += 4) {
1036 /* We must arrange things just right for STORE_SUBSCR.
1037 It wants the stack to look like (value) (dict) (key) */
1038 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001039 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001040 com_node(c, CHILD(n, i+2)); /* value */
1041 com_addbyte(c, ROT_TWO);
1042 com_node(c, CHILD(n, i)); /* key */
1043 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001044 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001045 }
1046}
1047
1048static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001049com_atom(c, n)
1050 struct compiling *c;
1051 node *n;
1052{
1053 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001054 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001055 int i;
1056 REQ(n, atom);
1057 ch = CHILD(n, 0);
1058 switch (TYPE(ch)) {
1059 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001060 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001061 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001062 com_push(c, 1);
1063 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001064 else
1065 com_node(c, CHILD(n, 1));
1066 break;
1067 case LSQB:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001068 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001069 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001070 com_push(c, 1);
1071 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001072 else
1073 com_list_constructor(c, CHILD(n, 1));
1074 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001075 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001076 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001077 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001078 if (TYPE(CHILD(n, 1)) != RBRACE)
1079 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001080 break;
1081 case BACKQUOTE:
1082 com_node(c, CHILD(n, 1));
1083 com_addbyte(c, UNARY_CONVERT);
1084 break;
1085 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001086 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001087 i = 255;
1088 }
1089 else {
1090 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001091 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001092 }
1093 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001094 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001095 break;
1096 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001097 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001098 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001099 c->c_errors++;
1100 i = 255;
1101 }
1102 else {
1103 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001104 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001105 }
1106 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001107 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001108 break;
1109 case NAME:
1110 com_addopname(c, LOAD_NAME, ch);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001111 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001112 break;
1113 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001114 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001115 com_error(c, PyExc_SystemError,
1116 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001117 }
1118}
1119
1120static void
1121com_slice(c, n, op)
1122 struct compiling *c;
1123 node *n;
1124 int op;
1125{
1126 if (NCH(n) == 1) {
1127 com_addbyte(c, op);
1128 }
1129 else if (NCH(n) == 2) {
1130 if (TYPE(CHILD(n, 0)) != COLON) {
1131 com_node(c, CHILD(n, 0));
1132 com_addbyte(c, op+1);
1133 }
1134 else {
1135 com_node(c, CHILD(n, 1));
1136 com_addbyte(c, op+2);
1137 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001138 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001139 }
1140 else {
1141 com_node(c, CHILD(n, 0));
1142 com_node(c, CHILD(n, 2));
1143 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001144 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001145 }
1146}
1147
Guido van Rossum635abd21997-01-06 22:56:52 +00001148static void
1149com_argument(c, n, pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001150 struct compiling *c;
1151 node *n; /* argument */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001152 PyObject **pkeywords;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001153{
1154 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001155 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001156 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001157 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001158 com_error(c, PyExc_SyntaxError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001159 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001160 }
1161 else {
1162 com_node(c, CHILD(n, 0));
1163 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001164 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001165 }
1166 m = n;
1167 do {
1168 m = CHILD(m, 0);
1169 } while (NCH(m) == 1);
1170 if (TYPE(m) != NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001171 com_error(c, PyExc_SyntaxError,
1172 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001173 }
1174 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001175 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001176 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001177 *pkeywords = PyDict_New();
Guido van Rossum635abd21997-01-06 22:56:52 +00001178 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001179 c->c_errors++;
1180 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001181 if (PyDict_GetItem(*pkeywords, v) != NULL)
1182 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001183 "duplicate keyword argument");
1184 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001185 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001186 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001187 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001188 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001189 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001190 }
1191 }
1192 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001193}
1194
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001195static void
1196com_call_function(c, n)
1197 struct compiling *c;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001198 node *n; /* EITHER arglist OR ')' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001199{
1200 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001201 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001202 }
1203 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001204 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001205 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001206 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001207 int star_flag = 0;
1208 int starstar_flag = 0;
1209 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001210 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001211 na = 0;
1212 nk = 0;
1213 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001214 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001215 if (TYPE(ch) == STAR ||
1216 TYPE(ch) == DOUBLESTAR)
1217 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001218 if (ch->n_lineno != lineno) {
1219 lineno = ch->n_lineno;
1220 com_addoparg(c, SET_LINENO, lineno);
1221 }
1222 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001223 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001224 na++;
1225 else
1226 nk++;
1227 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001228 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001229 while (i < NCH(n)) {
1230 node *tok = CHILD(n, i);
1231 node *ch = CHILD(n, i+1);
1232 i += 3;
1233 switch (TYPE(tok)) {
1234 case STAR: star_flag = 1; break;
1235 case DOUBLESTAR: starstar_flag = 1; break;
1236 }
1237 com_node(c, ch);
1238 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001239 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001240 com_error(c, PyExc_SyntaxError,
1241 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001242 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001243 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001244 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001245 star_flag + (starstar_flag << 1);
1246 else
1247 opcode = CALL_FUNCTION;
1248 com_addoparg(c, opcode, na | (nk << 8));
1249 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001250 }
1251}
1252
1253static void
1254com_select_member(c, n)
1255 struct compiling *c;
1256 node *n;
1257{
1258 com_addopname(c, LOAD_ATTR, n);
1259}
1260
1261static void
Guido van Rossum8861b741996-07-30 16:49:37 +00001262com_sliceobj(c, n)
1263 struct compiling *c;
1264 node *n;
1265{
1266 int i=0;
1267 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001268 node *ch;
1269
1270 /* first argument */
1271 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001272 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001273 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001274 i++;
1275 }
1276 else {
1277 com_node(c, CHILD(n,i));
1278 i++;
1279 REQ(CHILD(n,i),COLON);
1280 i++;
1281 }
1282 /* second argument */
1283 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1284 com_node(c, CHILD(n,i));
1285 i++;
1286 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001287 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001288 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001289 com_push(c, 1);
1290 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001291 /* remaining arguments */
1292 for (; i < NCH(n); i++) {
1293 ns++;
1294 ch=CHILD(n,i);
1295 REQ(ch, sliceop);
1296 if (NCH(ch) == 1) {
1297 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001298 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001299 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001300 }
1301 else
1302 com_node(c, CHILD(ch,1));
1303 }
1304 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001305 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001306}
1307
1308static void
1309com_subscript(c, n)
1310 struct compiling *c;
1311 node *n;
1312{
1313 node *ch;
1314 REQ(n, subscript);
1315 ch = CHILD(n,0);
1316 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001317 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001318 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001319 com_push(c, 1);
1320 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001321 else {
1322 /* check for slice */
1323 if ((TYPE(ch) == COLON || NCH(n) > 1))
1324 com_sliceobj(c, n);
1325 else {
1326 REQ(ch, test);
1327 com_node(c, ch);
1328 }
1329 }
1330}
1331
1332static void
1333com_subscriptlist(c, n, assigning)
1334 struct compiling *c;
1335 node *n;
1336 int assigning;
1337{
1338 int i, op;
1339 REQ(n, subscriptlist);
1340 /* Check to make backward compatible slice behavior for '[i:j]' */
1341 if (NCH(n) == 1) {
1342 node *sub = CHILD(n, 0); /* subscript */
1343 /* Make it is a simple slice.
Guido van Rossum8b993a91997-01-17 21:04:03 +00001344 Should have exactly one colon. */
Guido van Rossum8861b741996-07-30 16:49:37 +00001345 if ((TYPE(CHILD(sub, 0)) == COLON
1346 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
Guido van Rossum8b993a91997-01-17 21:04:03 +00001347 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1348 {
Guido van Rossum8861b741996-07-30 16:49:37 +00001349 if (assigning == OP_APPLY)
1350 op = SLICE;
1351 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001352 op = ((assigning == OP_ASSIGN) ?
1353 STORE_SLICE : DELETE_SLICE);
Guido van Rossum8861b741996-07-30 16:49:37 +00001354 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001355 if (op == STORE_SLICE)
1356 com_pop(c, 2);
1357 else if (op == DELETE_SLICE)
1358 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001359 return;
1360 }
1361 }
1362 /* Else normal subscriptlist. Compile each subscript. */
1363 for (i = 0; i < NCH(n); i += 2)
1364 com_subscript(c, CHILD(n, i));
1365 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001366 if (NCH(n) > 1) {
1367 i = (NCH(n)+1) / 2;
1368 com_addoparg(c, BUILD_TUPLE, i);
1369 com_pop(c, i-1);
1370 }
1371 if (assigning == OP_APPLY) {
Guido van Rossum8861b741996-07-30 16:49:37 +00001372 op = BINARY_SUBSCR;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001373 i = 1;
1374 }
1375 else if (assigning == OP_ASSIGN) {
1376 op = STORE_SUBSCR;
1377 i = 3;
1378 }
1379 else {
1380 op = DELETE_SUBSCR;
1381 i = 2;
1382 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001383 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001384 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001385}
1386
1387static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001388com_apply_trailer(c, n)
1389 struct compiling *c;
1390 node *n;
1391{
1392 REQ(n, trailer);
1393 switch (TYPE(CHILD(n, 0))) {
1394 case LPAR:
1395 com_call_function(c, CHILD(n, 1));
1396 break;
1397 case DOT:
1398 com_select_member(c, CHILD(n, 1));
1399 break;
1400 case LSQB:
Guido van Rossum8861b741996-07-30 16:49:37 +00001401 com_subscriptlist(c, CHILD(n, 1), OP_APPLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001402 break;
1403 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001404 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001405 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001406 }
1407}
1408
1409static void
Guido van Rossum50564e81996-01-12 01:13:16 +00001410com_power(c, n)
1411 struct compiling *c;
1412 node *n;
1413{
1414 int i;
1415 REQ(n, power);
1416 com_atom(c, CHILD(n, 0));
1417 for (i = 1; i < NCH(n); i++) {
1418 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1419 com_factor(c, CHILD(n, i+1));
1420 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001421 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001422 break;
1423 }
1424 else
1425 com_apply_trailer(c, CHILD(n, i));
1426 }
1427}
1428
1429static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001430com_factor(c, n)
1431 struct compiling *c;
1432 node *n;
1433{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001434 REQ(n, factor);
1435 if (TYPE(CHILD(n, 0)) == PLUS) {
1436 com_factor(c, CHILD(n, 1));
1437 com_addbyte(c, UNARY_POSITIVE);
1438 }
1439 else if (TYPE(CHILD(n, 0)) == MINUS) {
1440 com_factor(c, CHILD(n, 1));
1441 com_addbyte(c, UNARY_NEGATIVE);
1442 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001443 else if (TYPE(CHILD(n, 0)) == TILDE) {
1444 com_factor(c, CHILD(n, 1));
1445 com_addbyte(c, UNARY_INVERT);
1446 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001447 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001448 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001449 }
1450}
1451
1452static void
1453com_term(c, n)
1454 struct compiling *c;
1455 node *n;
1456{
1457 int i;
1458 int op;
1459 REQ(n, term);
1460 com_factor(c, CHILD(n, 0));
1461 for (i = 2; i < NCH(n); i += 2) {
1462 com_factor(c, CHILD(n, i));
1463 switch (TYPE(CHILD(n, i-1))) {
1464 case STAR:
1465 op = BINARY_MULTIPLY;
1466 break;
1467 case SLASH:
1468 op = BINARY_DIVIDE;
1469 break;
1470 case PERCENT:
1471 op = BINARY_MODULO;
1472 break;
1473 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001474 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001475 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001476 op = 255;
1477 }
1478 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001479 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001480 }
1481}
1482
1483static void
1484com_arith_expr(c, n)
1485 struct compiling *c;
1486 node *n;
1487{
1488 int i;
1489 int op;
1490 REQ(n, arith_expr);
1491 com_term(c, CHILD(n, 0));
1492 for (i = 2; i < NCH(n); i += 2) {
1493 com_term(c, CHILD(n, i));
1494 switch (TYPE(CHILD(n, i-1))) {
1495 case PLUS:
1496 op = BINARY_ADD;
1497 break;
1498 case MINUS:
1499 op = BINARY_SUBTRACT;
1500 break;
1501 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001502 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001503 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001504 op = 255;
1505 }
1506 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001507 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001508 }
1509}
1510
1511static void
1512com_shift_expr(c, n)
1513 struct compiling *c;
1514 node *n;
1515{
1516 int i;
1517 int op;
1518 REQ(n, shift_expr);
1519 com_arith_expr(c, CHILD(n, 0));
1520 for (i = 2; i < NCH(n); i += 2) {
1521 com_arith_expr(c, CHILD(n, i));
1522 switch (TYPE(CHILD(n, i-1))) {
1523 case LEFTSHIFT:
1524 op = BINARY_LSHIFT;
1525 break;
1526 case RIGHTSHIFT:
1527 op = BINARY_RSHIFT;
1528 break;
1529 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001530 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001531 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001532 op = 255;
1533 }
1534 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001535 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001536 }
1537}
1538
1539static void
1540com_and_expr(c, n)
1541 struct compiling *c;
1542 node *n;
1543{
1544 int i;
1545 int op;
1546 REQ(n, and_expr);
1547 com_shift_expr(c, CHILD(n, 0));
1548 for (i = 2; i < NCH(n); i += 2) {
1549 com_shift_expr(c, CHILD(n, i));
1550 if (TYPE(CHILD(n, i-1)) == AMPER) {
1551 op = BINARY_AND;
1552 }
1553 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001554 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001555 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001556 op = 255;
1557 }
1558 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001559 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001560 }
1561}
1562
1563static void
1564com_xor_expr(c, n)
1565 struct compiling *c;
1566 node *n;
1567{
1568 int i;
1569 int op;
1570 REQ(n, xor_expr);
1571 com_and_expr(c, CHILD(n, 0));
1572 for (i = 2; i < NCH(n); i += 2) {
1573 com_and_expr(c, CHILD(n, i));
1574 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1575 op = BINARY_XOR;
1576 }
1577 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001578 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001579 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001580 op = 255;
1581 }
1582 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001583 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001584 }
1585}
1586
1587static void
1588com_expr(c, n)
1589 struct compiling *c;
1590 node *n;
1591{
1592 int i;
1593 int op;
1594 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001595 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001596 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001597 com_xor_expr(c, CHILD(n, i));
1598 if (TYPE(CHILD(n, i-1)) == VBAR) {
1599 op = BINARY_OR;
1600 }
1601 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001602 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001603 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001604 op = 255;
1605 }
1606 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001607 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001608 }
1609}
1610
1611static enum cmp_op
1612cmp_type(n)
1613 node *n;
1614{
1615 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001616 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001617 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1618 if (NCH(n) == 1) {
1619 n = CHILD(n, 0);
1620 switch (TYPE(n)) {
1621 case LESS: return LT;
1622 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001623 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001624 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001625 case LESSEQUAL: return LE;
1626 case GREATEREQUAL: return GE;
1627 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001628 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1629 if (strcmp(STR(n), "is") == 0) return IS;
1630 }
1631 }
1632 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001633 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001634 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1635 return NOT_IN;
1636 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1637 return IS_NOT;
1638 }
1639 }
1640 return BAD;
1641}
1642
1643static void
1644com_comparison(c, n)
1645 struct compiling *c;
1646 node *n;
1647{
1648 int i;
1649 enum cmp_op op;
1650 int anchor;
1651 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1652 com_expr(c, CHILD(n, 0));
1653 if (NCH(n) == 1)
1654 return;
1655
1656 /****************************************************************
1657 The following code is generated for all but the last
1658 comparison in a chain:
1659
1660 label: on stack: opcode: jump to:
1661
1662 a <code to load b>
1663 a, b DUP_TOP
1664 a, b, b ROT_THREE
1665 b, a, b COMPARE_OP
1666 b, 0-or-1 JUMP_IF_FALSE L1
1667 b, 1 POP_TOP
1668 b
1669
1670 We are now ready to repeat this sequence for the next
1671 comparison in the chain.
1672
1673 For the last we generate:
1674
1675 b <code to load c>
1676 b, c COMPARE_OP
1677 0-or-1
1678
1679 If there were any jumps to L1 (i.e., there was more than one
1680 comparison), we generate:
1681
1682 0-or-1 JUMP_FORWARD L2
1683 L1: b, 0 ROT_TWO
1684 0, b POP_TOP
1685 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00001686 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001687 ****************************************************************/
1688
1689 anchor = 0;
1690
1691 for (i = 2; i < NCH(n); i += 2) {
1692 com_expr(c, CHILD(n, i));
1693 if (i+2 < NCH(n)) {
1694 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001695 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001696 com_addbyte(c, ROT_THREE);
1697 }
1698 op = cmp_type(CHILD(n, i-1));
1699 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001700 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001701 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001702 }
1703 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001704 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001705 if (i+2 < NCH(n)) {
1706 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1707 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001708 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001709 }
1710 }
1711
1712 if (anchor) {
1713 int anchor2 = 0;
1714 com_addfwref(c, JUMP_FORWARD, &anchor2);
1715 com_backpatch(c, anchor);
1716 com_addbyte(c, ROT_TWO);
1717 com_addbyte(c, POP_TOP);
1718 com_backpatch(c, anchor2);
1719 }
1720}
1721
1722static void
1723com_not_test(c, n)
1724 struct compiling *c;
1725 node *n;
1726{
1727 REQ(n, not_test); /* 'not' not_test | comparison */
1728 if (NCH(n) == 1) {
1729 com_comparison(c, CHILD(n, 0));
1730 }
1731 else {
1732 com_not_test(c, CHILD(n, 1));
1733 com_addbyte(c, UNARY_NOT);
1734 }
1735}
1736
1737static void
1738com_and_test(c, n)
1739 struct compiling *c;
1740 node *n;
1741{
1742 int i;
1743 int anchor;
1744 REQ(n, and_test); /* not_test ('and' not_test)* */
1745 anchor = 0;
1746 i = 0;
1747 for (;;) {
1748 com_not_test(c, CHILD(n, i));
1749 if ((i += 2) >= NCH(n))
1750 break;
1751 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1752 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001753 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001754 }
1755 if (anchor)
1756 com_backpatch(c, anchor);
1757}
1758
1759static void
1760com_test(c, n)
1761 struct compiling *c;
1762 node *n;
1763{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001764 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00001765 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001766 PyObject *v;
Guido van Rossum57531fe1993-11-30 14:57:42 +00001767 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001768 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001769 v = (PyObject *) icompile(CHILD(n, 0), c);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001770 if (v == NULL) {
1771 c->c_errors++;
1772 i = 255;
1773 }
1774 else {
1775 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001776 Py_DECREF(v);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001777 }
1778 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001779 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001780 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001781 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001782 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001783 else {
1784 int anchor = 0;
1785 int i = 0;
1786 for (;;) {
1787 com_and_test(c, CHILD(n, i));
1788 if ((i += 2) >= NCH(n))
1789 break;
1790 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1791 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001792 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001793 }
1794 if (anchor)
1795 com_backpatch(c, anchor);
1796 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001797}
1798
1799static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001800com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001801 struct compiling *c;
1802 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001803 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001804{
1805 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001806 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001807 com_node(c, CHILD(n, 0));
1808 }
1809 else {
1810 int i;
1811 int len;
1812 len = (NCH(n) + 1) / 2;
1813 for (i = 0; i < NCH(n); i += 2)
1814 com_node(c, CHILD(n, i));
1815 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001816 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001817 }
1818}
1819
1820
1821/* Begin of assignment compilation */
1822
Guido van Rossum79f25d91997-04-29 20:08:16 +00001823static void com_assign_name Py_PROTO((struct compiling *, node *, int));
1824static void com_assign Py_PROTO((struct compiling *, node *, int));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001825
1826static void
1827com_assign_attr(c, n, assigning)
1828 struct compiling *c;
1829 node *n;
1830 int assigning;
1831{
1832 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001833 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001834}
1835
1836static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001837com_assign_trailer(c, n, assigning)
1838 struct compiling *c;
1839 node *n;
1840 int assigning;
1841{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001842 REQ(n, trailer);
1843 switch (TYPE(CHILD(n, 0))) {
1844 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001845 com_error(c, PyExc_SyntaxError,
1846 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001847 break;
1848 case DOT: /* '.' NAME */
1849 com_assign_attr(c, CHILD(n, 1), assigning);
1850 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001851 case LSQB: /* '[' subscriptlist ']' */
1852 com_subscriptlist(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001853 break;
1854 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001855 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001856 }
1857}
1858
1859static void
1860com_assign_tuple(c, n, assigning)
1861 struct compiling *c;
1862 node *n;
1863 int assigning;
1864{
1865 int i;
1866 if (TYPE(n) != testlist)
1867 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001868 if (assigning) {
1869 i = (NCH(n)+1)/2;
1870 com_addoparg(c, UNPACK_TUPLE, i);
1871 com_push(c, i-1);
1872 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001873 for (i = 0; i < NCH(n); i += 2)
1874 com_assign(c, CHILD(n, i), assigning);
1875}
1876
1877static void
1878com_assign_list(c, n, assigning)
1879 struct compiling *c;
1880 node *n;
1881 int assigning;
1882{
1883 int i;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001884 if (assigning) {
1885 i = (NCH(n)+1)/2;
1886 com_addoparg(c, UNPACK_LIST, i);
1887 com_push(c, i-1);
1888 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001889 for (i = 0; i < NCH(n); i += 2)
1890 com_assign(c, CHILD(n, i), assigning);
1891}
1892
1893static void
1894com_assign_name(c, n, assigning)
1895 struct compiling *c;
1896 node *n;
1897 int assigning;
1898{
1899 REQ(n, NAME);
1900 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001901 if (assigning)
1902 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001903}
1904
1905static void
1906com_assign(c, n, assigning)
1907 struct compiling *c;
1908 node *n;
1909 int assigning;
1910{
1911 /* Loop to avoid trivial recursion */
1912 for (;;) {
1913 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001914
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001915 case exprlist:
1916 case testlist:
1917 if (NCH(n) > 1) {
1918 com_assign_tuple(c, n, assigning);
1919 return;
1920 }
1921 n = CHILD(n, 0);
1922 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001923
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001924 case test:
1925 case and_test:
1926 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001927 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001928 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001929 case xor_expr:
1930 case and_expr:
1931 case shift_expr:
1932 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001933 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00001934 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001935 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001936 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001937 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001938 return;
1939 }
1940 n = CHILD(n, 0);
1941 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001942
Guido van Rossum50564e81996-01-12 01:13:16 +00001943 case power: /* atom trailer* ('**' power)* */
1944/* ('+'|'-'|'~') factor | atom trailer* */
1945 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001946 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001947 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001948 return;
1949 }
Guido van Rossum50564e81996-01-12 01:13:16 +00001950 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001951 int i;
1952 com_node(c, CHILD(n, 0));
1953 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00001954 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001955 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001956 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00001957 return;
1958 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001959 com_apply_trailer(c, CHILD(n, i));
1960 } /* NB i is still alive */
1961 com_assign_trailer(c,
1962 CHILD(n, i), assigning);
1963 return;
1964 }
1965 n = CHILD(n, 0);
1966 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001967
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001968 case atom:
1969 switch (TYPE(CHILD(n, 0))) {
1970 case LPAR:
1971 n = CHILD(n, 1);
1972 if (TYPE(n) == RPAR) {
1973 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001974 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001975 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001976 return;
1977 }
1978 break;
1979 case LSQB:
1980 n = CHILD(n, 1);
1981 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001982 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001983 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001984 return;
1985 }
1986 com_assign_list(c, n, assigning);
1987 return;
1988 case NAME:
1989 com_assign_name(c, CHILD(n, 0), assigning);
1990 return;
1991 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001992 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001993 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001994 return;
1995 }
1996 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001997
1998 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001999 com_error(c, PyExc_SyntaxError,
2000 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002001 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002002
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002003 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002004 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002005 com_error(c, PyExc_SystemError,
2006 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002007 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002008
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002009 }
2010 }
2011}
Guido van Rossum7c531111997-03-11 18:42:21 +00002012
Guido van Rossum79f25d91997-04-29 20:08:16 +00002013/* Forward */ static node *get_rawdocstring Py_PROTO((node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002014
2015static void
2016com_expr_stmt(c, n)
2017 struct compiling *c;
2018 node *n;
2019{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002020 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002021 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002022 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002023 return;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002024 com_node(c, CHILD(n, NCH(n)-1));
2025 if (NCH(n) == 1) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002026 if (c->c_interactive)
2027 com_addbyte(c, PRINT_EXPR);
2028 else
2029 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002030 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002031 }
2032 else {
2033 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002034 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002035 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002036 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002037 com_push(c, 1);
2038 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002039 com_assign(c, CHILD(n, i), OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002040 }
2041 }
2042}
2043
2044static void
Guido van Rossum228d7f31997-04-02 05:24:36 +00002045com_assert_stmt(c, n)
2046 struct compiling *c;
2047 node *n;
2048{
2049 int a = 0, b = 0;
2050 int i;
2051 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2052 /* Generate code like for
2053
2054 if __debug__:
2055 if not <test>:
2056 raise AssertionError [, <message>]
2057
2058 where <message> is the second test, if present.
2059 */
2060 if (Py_OptimizeFlag)
2061 return;
2062 com_addopnamestr(c, LOAD_GLOBAL, "__debug__");
2063 com_push(c, 1);
2064 com_addfwref(c, JUMP_IF_FALSE, &a);
2065 com_addbyte(c, POP_TOP);
2066 com_pop(c, 1);
2067 com_node(c, CHILD(n, 1));
2068 com_addfwref(c, JUMP_IF_TRUE, &b);
2069 com_addbyte(c, POP_TOP);
2070 com_pop(c, 1);
2071 /* Raise that exception! */
2072 com_addopnamestr(c, LOAD_GLOBAL, "AssertionError");
2073 com_push(c, 1);
2074 i = NCH(n)/2; /* Either 2 or 4 */
2075 if (i > 1)
2076 com_node(c, CHILD(n, 3));
2077 com_addoparg(c, RAISE_VARARGS, i);
2078 com_pop(c, i);
2079 /* The interpreter does not fall through */
2080 /* All jumps converge here */
2081 com_backpatch(c, a);
2082 com_backpatch(c, b);
2083 com_addbyte(c, POP_TOP);
2084}
2085
2086static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002087com_print_stmt(c, n)
2088 struct compiling *c;
2089 node *n;
2090{
2091 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002092 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
2093 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002094 com_node(c, CHILD(n, i));
2095 com_addbyte(c, PRINT_ITEM);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002096 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002097 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002098 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002099 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002100 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002101}
2102
2103static void
2104com_return_stmt(c, n)
2105 struct compiling *c;
2106 node *n;
2107{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002108 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002109 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002110 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002111 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002112 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002113 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002114 com_push(c, 1);
2115 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002116 else
2117 com_node(c, CHILD(n, 1));
2118 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002119 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002120}
2121
2122static void
2123com_raise_stmt(c, n)
2124 struct compiling *c;
2125 node *n;
2126{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002127 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002128 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2129 if (NCH(n) > 1) {
2130 com_node(c, CHILD(n, 1));
2131 if (NCH(n) > 3) {
2132 com_node(c, CHILD(n, 3));
2133 if (NCH(n) > 5)
2134 com_node(c, CHILD(n, 5));
2135 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002136 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002137 i = NCH(n)/2;
2138 com_addoparg(c, RAISE_VARARGS, i);
2139 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002140}
2141
2142static void
2143com_import_stmt(c, n)
2144 struct compiling *c;
2145 node *n;
2146{
2147 int i;
2148 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002149 /* 'import' dotted_name (',' dotted_name)* |
2150 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002151 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002152 /* 'from' dotted_name 'import' ... */
2153 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002154 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002155 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002156 for (i = 3; i < NCH(n); i += 2)
2157 com_addopname(c, IMPORT_FROM, CHILD(n, i));
2158 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002159 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002160 }
2161 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002162 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002163 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002164 REQ(CHILD(n, i), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002165 com_addopname(c, IMPORT_NAME, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002166 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002167 com_addopname(c, STORE_NAME, CHILD(CHILD(n, i), 0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002168 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002169 }
2170 }
2171}
2172
2173static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00002174com_global_stmt(c, n)
2175 struct compiling *c;
2176 node *n;
2177{
2178 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002179 REQ(n, global_stmt);
2180 /* 'global' NAME (',' NAME)* */
2181 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002182 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002183#ifdef PRIVATE_NAME_MANGLING
2184 char buffer[256];
2185 if (s != NULL && s[0] == '_' && s[1] == '_' &&
2186 c->c_private != NULL &&
Guido van Rossum582acec2000-06-28 22:07:35 +00002187 com_mangle(c, s, buffer, sizeof(buffer)))
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002188 s = buffer;
2189#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +00002190 if (PyDict_GetItemString(c->c_locals, s) != NULL) {
2191 com_error(c, PyExc_SyntaxError,
2192 "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002193 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002194 else if (PyDict_SetItemString(c->c_globals, s, Py_None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002195 c->c_errors++;
2196 }
2197}
2198
Guido van Rossum681d79a1995-07-18 14:51:37 +00002199static int
2200com_newlocal_o(c, nameval)
2201 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002202 PyObject *nameval;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002203{
2204 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002205 PyObject *ival;
2206 if (PyList_Size(c->c_varnames) != c->c_nlocals) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002207 /* This is usually caused by an error on a previous call */
2208 if (c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002209 com_error(c, PyExc_SystemError,
2210 "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002211 }
2212 return 0;
2213 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002214 ival = PyInt_FromLong(i = c->c_nlocals++);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002215 if (ival == NULL)
2216 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002217 else if (PyDict_SetItem(c->c_locals, nameval, ival) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002218 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002219 else if (PyList_Append(c->c_varnames, nameval) != 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002220 c->c_errors++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002221 Py_XDECREF(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002222 return i;
2223}
2224
2225static int
2226com_addlocal_o(c, nameval)
2227 struct compiling *c;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002228 PyObject *nameval;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002229{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002230 PyObject *ival = PyDict_GetItem(c->c_locals, nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002231 if (ival != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002232 return PyInt_AsLong(ival);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002233 return com_newlocal_o(c, nameval);
2234}
2235
2236static int
2237com_newlocal(c, name)
2238 struct compiling *c;
2239 char *name;
2240{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002241 PyObject *nameval = PyString_InternFromString(name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002242 int i;
2243 if (nameval == NULL) {
2244 c->c_errors++;
2245 return 0;
2246 }
2247 i = com_newlocal_o(c, nameval);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002248 Py_DECREF(nameval);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002249 return i;
2250}
2251
Guido van Rossumc5e96291991-12-10 13:53:51 +00002252static void
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002253com_exec_stmt(c, n)
2254 struct compiling *c;
2255 node *n;
2256{
2257 REQ(n, exec_stmt);
2258 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2259 com_node(c, CHILD(n, 1));
2260 if (NCH(n) >= 4)
2261 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002262 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002263 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002264 com_push(c, 1);
2265 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002266 if (NCH(n) >= 6)
2267 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002268 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002269 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002270 com_push(c, 1);
2271 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002272 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002273 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002274}
2275
Guido van Rossum7c531111997-03-11 18:42:21 +00002276static int
2277is_constant_false(c, n)
2278 struct compiling *c;
2279 node *n;
2280{
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
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002361com_if_stmt(c, n)
2362 struct compiling *c;
2363 node *n;
2364{
2365 int i;
2366 int anchor = 0;
2367 REQ(n, if_stmt);
2368 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2369 for (i = 0; i+3 < NCH(n); i+=4) {
2370 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002371 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002372 if (is_constant_false(c, ch))
2373 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002374 if (i > 0)
2375 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002376 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002377 com_addfwref(c, JUMP_IF_FALSE, &a);
2378 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002379 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002380 com_node(c, CHILD(n, i+3));
2381 com_addfwref(c, JUMP_FORWARD, &anchor);
2382 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002383 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002384 com_addbyte(c, POP_TOP);
2385 }
2386 if (i+2 < NCH(n))
2387 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002388 if (anchor)
2389 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002390}
2391
2392static void
2393com_while_stmt(c, n)
2394 struct compiling *c;
2395 node *n;
2396{
2397 int break_anchor = 0;
2398 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002399 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002400 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2401 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002402 block_push(c, SETUP_LOOP);
2403 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002404 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002405 com_node(c, CHILD(n, 1));
2406 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2407 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002408 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002409 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002410 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002411 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002412 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2413 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002414 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002415 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002416 com_addbyte(c, POP_TOP);
2417 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002418 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002419 if (NCH(n) > 4)
2420 com_node(c, CHILD(n, 6));
2421 com_backpatch(c, break_anchor);
2422}
2423
2424static void
2425com_for_stmt(c, n)
2426 struct compiling *c;
2427 node *n;
2428{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002429 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002430 int break_anchor = 0;
2431 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002432 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002433 REQ(n, for_stmt);
2434 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2435 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002436 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002437 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002438 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002439 if (v == NULL)
2440 c->c_errors++;
2441 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002442 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002443 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002444 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002445 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002446 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002447 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002448 com_assign(c, CHILD(n, 1), OP_ASSIGN);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002449 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002450 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002451 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002452 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2453 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002454 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002455 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002456 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002457 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002458 if (NCH(n) > 8)
2459 com_node(c, CHILD(n, 8));
2460 com_backpatch(c, break_anchor);
2461}
2462
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002463/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002464
2465 SETUP_FINALLY L
2466 <code for S>
2467 POP_BLOCK
2468 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002469 L: <code for Sf>
2470 END_FINALLY
2471
2472 The special instructions use the block stack. Each block
2473 stack entry contains the instruction that created it (here
2474 SETUP_FINALLY), the level of the value stack at the time the
2475 block stack entry was created, and a label (here L).
2476
2477 SETUP_FINALLY:
2478 Pushes the current value stack level and the label
2479 onto the block stack.
2480 POP_BLOCK:
2481 Pops en entry from the block stack, and pops the value
2482 stack until its level is the same as indicated on the
2483 block stack. (The label is ignored.)
2484 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002485 Pops a variable number of entries from the *value* stack
2486 and re-raises the exception they specify. The number of
2487 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002488
2489 The block stack is unwound when an exception is raised:
2490 when a SETUP_FINALLY entry is found, the exception is pushed
2491 onto the value stack (and the exception condition is cleared),
2492 and the interpreter jumps to the label gotten from the block
2493 stack.
2494
2495 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002496 (The contents of the value stack is shown in [], with the top
2497 at the right; 'tb' is trace-back info, 'val' the exception's
2498 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002499
2500 Value stack Label Instruction Argument
2501 [] SETUP_EXCEPT L1
2502 [] <code for S>
2503 [] POP_BLOCK
2504 [] JUMP_FORWARD L0
2505
Guido van Rossum3f5da241990-12-20 15:06:42 +00002506 [tb, val, exc] L1: DUP )
2507 [tb, val, exc, exc] <evaluate E1> )
2508 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2509 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2510 [tb, val, exc, 1] POP )
2511 [tb, val, exc] POP
2512 [tb, val] <assign to V1> (or POP if no V1)
2513 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002514 [] <code for S1>
2515 JUMP_FORWARD L0
2516
Guido van Rossum3f5da241990-12-20 15:06:42 +00002517 [tb, val, exc, 0] L2: POP
2518 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002519 .............................etc.......................
2520
Guido van Rossum3f5da241990-12-20 15:06:42 +00002521 [tb, val, exc, 0] Ln+1: POP
2522 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002523
2524 [] L0: <next statement>
2525
2526 Of course, parts are not generated if Vi or Ei is not present.
2527*/
2528
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002529static void
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002530com_try_except(c, n)
2531 struct compiling *c;
2532 node *n;
2533{
2534 int except_anchor = 0;
2535 int end_anchor = 0;
2536 int else_anchor = 0;
2537 int i;
2538 node *ch;
2539
2540 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2541 block_push(c, SETUP_EXCEPT);
2542 com_node(c, CHILD(n, 2));
2543 com_addbyte(c, POP_BLOCK);
2544 block_pop(c, SETUP_EXCEPT);
2545 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2546 com_backpatch(c, except_anchor);
2547 for (i = 3;
2548 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2549 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002550 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002551 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002552 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002553 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002554 break;
2555 }
2556 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002557 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002558 com_addoparg(c, SET_LINENO, ch->n_lineno);
2559 if (NCH(ch) > 1) {
2560 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002561 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002562 com_node(c, CHILD(ch, 1));
2563 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002564 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002565 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2566 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002567 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002568 }
2569 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 if (NCH(ch) > 3)
Guido van Rossum8861b741996-07-30 16:49:37 +00002572 com_assign(c, CHILD(ch, 3), OP_ASSIGN);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002573 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002574 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002575 com_pop(c, 1);
2576 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002577 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002578 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002579 com_node(c, CHILD(n, i+2));
2580 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2581 if (except_anchor) {
2582 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002583 /* We come in with [tb, val, exc, 0] on the
2584 stack; one pop and it's the same as
2585 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002586 com_addbyte(c, POP_TOP);
2587 }
2588 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002589 /* We actually come in here with [tb, val, exc] but the
2590 END_FINALLY will zap those and jump around.
2591 The c_stacklevel does not reflect them so we need not pop
2592 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002593 com_addbyte(c, END_FINALLY);
2594 com_backpatch(c, else_anchor);
2595 if (i < NCH(n))
2596 com_node(c, CHILD(n, i+2));
2597 com_backpatch(c, end_anchor);
2598}
2599
2600static void
2601com_try_finally(c, n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002602 struct compiling *c;
2603 node *n;
2604{
2605 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002606 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002607
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002608 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2609 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002610 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002611 com_addbyte(c, POP_BLOCK);
2612 block_pop(c, SETUP_FINALLY);
2613 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002614 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002615 /* While the generated code pushes only one item,
2616 the try-finally handling can enter here with
2617 up to three items. OK, here are the details:
2618 3 for an exception, 2 for RETURN, 1 for BREAK. */
2619 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002620 com_backpatch(c, finally_anchor);
2621 ch = CHILD(n, NCH(n)-1);
2622 com_addoparg(c, SET_LINENO, ch->n_lineno);
2623 com_node(c, ch);
2624 com_addbyte(c, END_FINALLY);
2625 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002626 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002627}
2628
2629static void
2630com_try_stmt(c, n)
2631 struct compiling *c;
2632 node *n;
2633{
2634 REQ(n, try_stmt);
2635 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2636 | 'try' ':' suite 'finally' ':' suite */
2637 if (TYPE(CHILD(n, 3)) != except_clause)
2638 com_try_finally(c, n);
2639 else
2640 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002641}
2642
Guido van Rossum8b993a91997-01-17 21:04:03 +00002643static node *
2644get_rawdocstring(n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002645 node *n;
2646{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002647 int i;
2648
Guido van Rossum8b993a91997-01-17 21:04:03 +00002649 /* Label to avoid tail recursion */
2650 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002651 switch (TYPE(n)) {
2652
2653 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002654 if (NCH(n) == 1) {
2655 n = CHILD(n, 0);
2656 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002657 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002658 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002659 case file_input:
2660 for (i = 0; i < NCH(n); i++) {
2661 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002662 if (TYPE(ch) == stmt) {
2663 n = ch;
2664 goto next;
2665 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002666 }
2667 break;
2668
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002669 case stmt:
2670 case simple_stmt:
2671 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002672 n = CHILD(n, 0);
2673 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002674
2675 case expr_stmt:
2676 case testlist:
2677 case test:
2678 case and_test:
2679 case not_test:
2680 case comparison:
2681 case expr:
2682 case xor_expr:
2683 case and_expr:
2684 case shift_expr:
2685 case arith_expr:
2686 case term:
2687 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002688 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002689 if (NCH(n) == 1) {
2690 n = CHILD(n, 0);
2691 goto next;
2692 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002693 break;
2694
2695 case atom:
2696 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002697 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002698 break;
2699
2700 }
2701 return NULL;
2702}
2703
Guido van Rossum79f25d91997-04-29 20:08:16 +00002704static PyObject *
Guido van Rossum8b993a91997-01-17 21:04:03 +00002705get_docstring(n)
2706 node *n;
2707{
Guido van Rossum541563e1999-01-28 15:08:09 +00002708 /* Don't generate doc-strings if run with -OO */
2709 if (Py_OptimizeFlag > 1)
2710 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002711 n = get_rawdocstring(n);
2712 if (n == NULL)
2713 return NULL;
2714 return parsestrplus(n);
2715}
2716
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002717static void
2718com_suite(c, n)
2719 struct compiling *c;
2720 node *n;
2721{
2722 REQ(n, suite);
2723 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2724 if (NCH(n) == 1) {
2725 com_node(c, CHILD(n, 0));
2726 }
2727 else {
2728 int i;
2729 for (i = 0; i < NCH(n); i++) {
2730 node *ch = CHILD(n, i);
2731 if (TYPE(ch) == stmt)
2732 com_node(c, ch);
2733 }
2734 }
2735}
2736
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002737/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002738static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002739com_continue_stmt(c, n)
2740 struct compiling *c;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002741 node *n; /* Not used, but passed for consistency */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002742{
2743 int i = c->c_nblocks;
2744 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2745 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2746 }
2747 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002748 com_error(c, PyExc_SyntaxError,
2749 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002750 }
2751 /* XXX Could allow it inside a 'finally' clause
2752 XXX if we could pop the exception still on the stack */
2753}
2754
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002755static int
Guido van Rossum681d79a1995-07-18 14:51:37 +00002756com_argdefs(c, n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002757 struct compiling *c;
2758 node *n;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002759{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002760 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002761 if (TYPE(n) == lambdef) {
2762 /* lambdef: 'lambda' [varargslist] ':' test */
2763 n = CHILD(n, 1);
2764 }
2765 else {
2766 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2767 n = CHILD(n, 2);
2768 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2769 n = CHILD(n, 1);
2770 }
2771 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002772 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002773 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002774 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002775 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2776 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002777 nargs = 0;
2778 ndefs = 0;
2779 for (i = 0; i < nch; i++) {
2780 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002781 if (TYPE(CHILD(n, i)) == STAR ||
2782 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002783 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002784 nargs++;
2785 i++;
2786 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002787 t = RPAR; /* Anything except EQUAL or COMMA */
2788 else
2789 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002790 if (t == EQUAL) {
2791 i++;
2792 ndefs++;
2793 com_node(c, CHILD(n, i));
2794 i++;
2795 if (i >= nch)
2796 break;
2797 t = TYPE(CHILD(n, i));
2798 }
2799 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00002800 /* Treat "(a=1, b)" as an error */
2801 if (ndefs)
2802 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00002803 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002804 }
2805 if (t != COMMA)
2806 break;
2807 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002808 return ndefs;
2809}
2810
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002811static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002812com_funcdef(c, n)
2813 struct compiling *c;
2814 node *n;
2815{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002816 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002817 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002818 v = (PyObject *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002819 if (v == NULL)
2820 c->c_errors++;
2821 else {
2822 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002823 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002824 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002825 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002826 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002827 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002828 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002829 com_pop(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002830 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002831 }
2832}
2833
2834static void
Guido van Rossum25831651993-05-19 14:50:45 +00002835com_bases(c, n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002836 struct compiling *c;
2837 node *n;
2838{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002839 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002840 REQ(n, testlist);
2841 /* testlist: test (',' test)* [','] */
2842 for (i = 0; i < NCH(n); i += 2)
2843 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002844 i = (NCH(n)+1) / 2;
2845 com_addoparg(c, BUILD_TUPLE, i);
2846 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00002847}
2848
2849static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002850com_classdef(c, n)
2851 struct compiling *c;
2852 node *n;
2853{
Guido van Rossum25831651993-05-19 14:50:45 +00002854 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002855 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002856 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002857 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00002858 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00002859 c->c_errors++;
2860 return;
2861 }
2862 /* Push the class name on the stack */
2863 i = com_addconst(c, v);
2864 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002865 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002866 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00002867 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002868 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00002869 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002870 com_push(c, 1);
2871 }
Guido van Rossum25831651993-05-19 14:50:45 +00002872 else
2873 com_bases(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002874 v = (PyObject *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002875 if (v == NULL)
2876 c->c_errors++;
2877 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002878 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002879 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002880 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002881 com_addoparg(c, MAKE_FUNCTION, 0);
2882 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002883 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002884 com_pop(c, 2);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002885 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002886 Py_DECREF(v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002887 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002888}
2889
2890static void
2891com_node(c, n)
2892 struct compiling *c;
2893 node *n;
2894{
2895 switch (TYPE(n)) {
2896
2897 /* Definition nodes */
2898
2899 case funcdef:
2900 com_funcdef(c, n);
2901 break;
2902 case classdef:
2903 com_classdef(c, n);
2904 break;
2905
2906 /* Trivial parse tree nodes */
2907
2908 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002909 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002910 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002911 com_node(c, CHILD(n, 0));
2912 break;
2913
2914 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002915 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2916 com_addoparg(c, SET_LINENO, n->n_lineno);
2917 {
2918 int i;
2919 for (i = 0; i < NCH(n)-1; i += 2)
2920 com_node(c, CHILD(n, i));
2921 }
2922 break;
2923
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002924 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002925 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002926 com_node(c, CHILD(n, 0));
2927 break;
2928
2929 /* Statement nodes */
2930
2931 case expr_stmt:
2932 com_expr_stmt(c, n);
2933 break;
2934 case print_stmt:
2935 com_print_stmt(c, n);
2936 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002937 case del_stmt: /* 'del' exprlist */
Guido van Rossum8861b741996-07-30 16:49:37 +00002938 com_assign(c, CHILD(n, 1), OP_DELETE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002939 break;
2940 case pass_stmt:
2941 break;
2942 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002943 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002944 com_error(c, PyExc_SyntaxError,
2945 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002946 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002947 com_addbyte(c, BREAK_LOOP);
2948 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002949 case continue_stmt:
2950 com_continue_stmt(c, n);
2951 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002952 case return_stmt:
2953 com_return_stmt(c, n);
2954 break;
2955 case raise_stmt:
2956 com_raise_stmt(c, n);
2957 break;
2958 case import_stmt:
2959 com_import_stmt(c, n);
2960 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002961 case global_stmt:
2962 com_global_stmt(c, n);
2963 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002964 case exec_stmt:
2965 com_exec_stmt(c, n);
2966 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002967 case assert_stmt:
2968 com_assert_stmt(c, n);
2969 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002970 case if_stmt:
2971 com_if_stmt(c, n);
2972 break;
2973 case while_stmt:
2974 com_while_stmt(c, n);
2975 break;
2976 case for_stmt:
2977 com_for_stmt(c, n);
2978 break;
2979 case try_stmt:
2980 com_try_stmt(c, n);
2981 break;
2982 case suite:
2983 com_suite(c, n);
2984 break;
2985
2986 /* Expression nodes */
2987
2988 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002989 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002990 break;
2991 case test:
2992 com_test(c, n);
2993 break;
2994 case and_test:
2995 com_and_test(c, n);
2996 break;
2997 case not_test:
2998 com_not_test(c, n);
2999 break;
3000 case comparison:
3001 com_comparison(c, n);
3002 break;
3003 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003004 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003005 break;
3006 case expr:
3007 com_expr(c, n);
3008 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003009 case xor_expr:
3010 com_xor_expr(c, n);
3011 break;
3012 case and_expr:
3013 com_and_expr(c, n);
3014 break;
3015 case shift_expr:
3016 com_shift_expr(c, n);
3017 break;
3018 case arith_expr:
3019 com_arith_expr(c, n);
3020 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003021 case term:
3022 com_term(c, n);
3023 break;
3024 case factor:
3025 com_factor(c, n);
3026 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003027 case power:
3028 com_power(c, n);
3029 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003030 case atom:
3031 com_atom(c, n);
3032 break;
3033
3034 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003035 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003036 com_error(c, PyExc_SystemError,
3037 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003038 }
3039}
3040
Guido van Rossum79f25d91997-04-29 20:08:16 +00003041static void com_fplist Py_PROTO((struct compiling *, node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003042
3043static void
3044com_fpdef(c, n)
3045 struct compiling *c;
3046 node *n;
3047{
3048 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3049 if (TYPE(CHILD(n, 0)) == LPAR)
3050 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003051 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003052 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003053 com_pop(c, 1);
3054 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003055}
3056
3057static void
3058com_fplist(c, n)
3059 struct compiling *c;
3060 node *n;
3061{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003062 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003063 if (NCH(n) == 1) {
3064 com_fpdef(c, CHILD(n, 0));
3065 }
3066 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003067 int i = (NCH(n)+1)/2;
3068 com_addoparg(c, UNPACK_TUPLE, i);
3069 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003070 for (i = 0; i < NCH(n); i += 2)
3071 com_fpdef(c, CHILD(n, i));
3072 }
3073}
3074
3075static void
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003076com_arglist(c, n)
3077 struct compiling *c;
3078 node *n;
3079{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003080 int nch, i;
3081 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003082 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003083 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003084 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003085 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003086 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003087 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003088 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003089 node *ch = CHILD(n, i);
3090 node *fp;
3091 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00003092 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003093 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003094 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3095 fp = CHILD(ch, 0);
3096 if (TYPE(fp) == NAME)
3097 name = STR(fp);
3098 else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003099 name = nbuf;
3100 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003101 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003102 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003103 com_newlocal(c, name);
3104 c->c_argcount++;
3105 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003106 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003107 ch = CHILD(n, i);
3108 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003109 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003110 else
3111 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003112 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003113 /* Handle *arguments */
3114 if (i < nch) {
3115 node *ch;
3116 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003117 if (TYPE(ch) != DOUBLESTAR) {
3118 REQ(ch, STAR);
3119 ch = CHILD(n, i+1);
3120 if (TYPE(ch) == NAME) {
3121 c->c_flags |= CO_VARARGS;
3122 i += 3;
3123 com_newlocal(c, STR(ch));
3124 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003125 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003126 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003127 /* Handle **keywords */
3128 if (i < nch) {
3129 node *ch;
3130 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003131 if (TYPE(ch) != DOUBLESTAR) {
3132 REQ(ch, STAR);
3133 ch = CHILD(n, i+1);
3134 REQ(ch, STAR);
3135 ch = CHILD(n, i+2);
3136 }
3137 else
3138 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003139 REQ(ch, NAME);
3140 c->c_flags |= CO_VARKEYWORDS;
3141 com_newlocal(c, STR(ch));
3142 }
3143 if (complex) {
3144 /* Generate code for complex arguments only after
3145 having counted the simple arguments */
3146 int ilocal = 0;
3147 for (i = 0; i < nch; i++) {
3148 node *ch = CHILD(n, i);
3149 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003150 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003151 break;
3152 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3153 fp = CHILD(ch, 0);
3154 if (TYPE(fp) != NAME) {
3155 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003156 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003157 com_fpdef(c, ch);
3158 }
3159 ilocal++;
3160 if (++i >= nch)
3161 break;
3162 ch = CHILD(n, i);
3163 if (TYPE(ch) == EQUAL)
3164 i += 2;
3165 else
3166 REQ(ch, COMMA);
3167 }
3168 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003169}
3170
3171static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003172com_file_input(c, n)
3173 struct compiling *c;
3174 node *n;
3175{
3176 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003177 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003178 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003179 doc = get_docstring(n);
3180 if (doc != NULL) {
3181 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003182 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003183 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003184 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003185 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003186 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003187 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003188 for (i = 0; i < NCH(n); i++) {
3189 node *ch = CHILD(n, i);
3190 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3191 com_node(c, ch);
3192 }
3193}
3194
3195/* Top-level compile-node interface */
3196
3197static void
3198compile_funcdef(c, n)
3199 struct compiling *c;
3200 node *n;
3201{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003202 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003203 node *ch;
3204 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003205 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003206 doc = get_docstring(CHILD(n, 4));
3207 if (doc != NULL) {
3208 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003209 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003210 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003211 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003212 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003213 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3214 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003215 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003216 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003217 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003218 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003219 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003220 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003221 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003222 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003223 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003224}
3225
3226static void
Guido van Rossum590baa41993-11-30 13:40:46 +00003227compile_lambdef(c, n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003228 struct compiling *c;
3229 node *n;
3230{
Guido van Rossum590baa41993-11-30 13:40:46 +00003231 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003232 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003233 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003234
3235 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003236 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003237 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003238 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003239 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003240 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003241 else
3242 ch = CHILD(n, 2);
3243 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003244 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003245 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003246}
3247
3248static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003249compile_classdef(c, n)
3250 struct compiling *c;
3251 node *n;
3252{
3253 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003254 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003255 REQ(n, classdef);
3256 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3257 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003258#ifdef PRIVATE_NAME_MANGLING
3259 c->c_private = c->c_name;
3260#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003261 ch = CHILD(n, NCH(n)-1); /* The suite */
3262 doc = get_docstring(ch);
3263 if (doc != NULL) {
3264 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003265 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003266 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003267 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003268 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003269 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003270 }
3271 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003272 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003273 com_node(c, ch);
3274 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003275 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003276 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003277 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003278}
3279
3280static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003281compile_node(c, n)
3282 struct compiling *c;
3283 node *n;
3284{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003285 com_addoparg(c, SET_LINENO, n->n_lineno);
3286
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003287 switch (TYPE(n)) {
3288
Guido van Rossum4c417781991-01-21 16:09:22 +00003289 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003290 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003291 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003292 n = CHILD(n, 0);
3293 if (TYPE(n) != NEWLINE)
3294 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003295 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003296 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003297 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003298 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003299 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003300 break;
3301
Guido van Rossum4c417781991-01-21 16:09:22 +00003302 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003303 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003304 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003305 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003306 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003307 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003308 break;
3309
Guido van Rossum590baa41993-11-30 13:40:46 +00003310 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003311 com_node(c, CHILD(n, 0));
3312 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003313 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003314 break;
3315
Guido van Rossum590baa41993-11-30 13:40:46 +00003316 case lambdef: /* anonymous function definition */
3317 compile_lambdef(c, n);
3318 break;
3319
Guido van Rossum4c417781991-01-21 16:09:22 +00003320 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003321 compile_funcdef(c, n);
3322 break;
3323
Guido van Rossum4c417781991-01-21 16:09:22 +00003324 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003325 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003326 break;
3327
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003328 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003329 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003330 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003331 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003332 }
3333}
3334
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003335/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00003336
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003337 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
3338 instructions that refer to local variables with LOAD_FAST etc.
3339 The latter instructions are much faster because they don't need to
3340 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003341
Guido van Rossum681d79a1995-07-18 14:51:37 +00003342 To find all local variables, we check all STORE_NAME, IMPORT_FROM
3343 and DELETE_NAME instructions. This yields all local variables,
3344 function definitions, class definitions and import statements.
3345 Argument names have already been entered into the list by the
3346 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003347
3348 All remaining LOAD_NAME instructions must refer to non-local (global
3349 or builtin) variables, so are replaced by LOAD_GLOBAL.
3350
3351 There are two problems: 'from foo import *' and 'exec' may introduce
3352 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00003353 case, we can still optimize bona fide locals (since those
3354 statements will be surrounded by fast_2_locals() and
3355 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003356
Guido van Rossum681d79a1995-07-18 14:51:37 +00003357 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00003358
3359static void
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003360optimize(c)
3361 struct compiling *c;
Guido van Rossum282914b1991-04-04 10:42:56 +00003362{
Guido van Rossum0a697f61991-04-16 08:39:12 +00003363 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00003364 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00003365 int oparg = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003366 PyObject *name;
3367 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003368
Guido van Rossum282914b1991-04-04 10:42:56 +00003369#define NEXTOP() (*next_instr++)
3370#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossum79f25d91997-04-29 20:08:16 +00003371#define GETITEM(v, i) (PyList_GetItem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003372#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
3373
Guido van Rossum79f25d91997-04-29 20:08:16 +00003374 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003375
3376 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00003377
Guido van Rossum79f25d91997-04-29 20:08:16 +00003378 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003379 for (;;) {
3380 opcode = NEXTOP();
3381 if (opcode == STOP_CODE)
3382 break;
3383 if (HAS_ARG(opcode))
3384 oparg = NEXTARG();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003385 switch (opcode) {
3386 case STORE_NAME:
3387 case DELETE_NAME:
3388 case IMPORT_FROM:
3389 com_addlocal_o(c, GETNAMEOBJ(oparg));
3390 break;
3391 case EXEC_STMT:
3392 c->c_flags &= ~CO_OPTIMIZED;
3393 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00003394 }
3395 }
3396
Guido van Rossum79f25d91997-04-29 20:08:16 +00003397 if (PyDict_GetItemString(c->c_locals, "*") != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003398 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003399
Guido van Rossum79f25d91997-04-29 20:08:16 +00003400 next_instr = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003401 for (;;) {
3402 cur_instr = next_instr;
3403 opcode = NEXTOP();
3404 if (opcode == STOP_CODE)
3405 break;
3406 if (HAS_ARG(opcode))
3407 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003408 if (opcode == LOAD_NAME ||
3409 opcode == STORE_NAME ||
3410 opcode == DELETE_NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003411 PyObject *v;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003412 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00003413 name = GETNAMEOBJ(oparg);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003414 v = PyDict_GetItem(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003415 if (v == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003416 if (opcode == LOAD_NAME &&
3417 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003418 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003419 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00003420 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003421 i = PyInt_AsLong(v);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003422 switch (opcode) {
3423 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
3424 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
3425 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
3426 }
3427 cur_instr[1] = i & 0xff;
3428 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00003429 }
3430 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003431
Guido van Rossum681d79a1995-07-18 14:51:37 +00003432 if (c->c_errors == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00003433 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00003434}
3435
Guido van Rossum79f25d91997-04-29 20:08:16 +00003436PyCodeObject *
3437PyNode_Compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003438 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003439 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003440{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003441 return jcompile(n, filename, NULL);
3442}
3443
Guido van Rossum79f25d91997-04-29 20:08:16 +00003444static PyCodeObject *
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003445icompile(n, base)
3446 node *n;
3447 struct compiling *base;
3448{
3449 return jcompile(n, base->c_filename, base);
3450}
3451
Guido van Rossum79f25d91997-04-29 20:08:16 +00003452static PyCodeObject *
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003453jcompile(n, filename, base)
3454 node *n;
3455 char *filename;
3456 struct compiling *base;
3457{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003458 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003459 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003460 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003461 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003462#ifdef PRIVATE_NAME_MANGLING
3463 if (base)
3464 sc.c_private = base->c_private;
3465 else
3466 sc.c_private = NULL;
3467#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003468 compile_node(&sc, n);
3469 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003470 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003471 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003472 sc.c_flags |= CO_NEWLOCALS;
3473 }
3474 else if (TYPE(n) == classdef)
3475 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00003476 co = NULL;
3477 if (sc.c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003478 PyObject *consts, *names, *varnames, *filename, *name;
3479 consts = PyList_AsTuple(sc.c_consts);
3480 names = PyList_AsTuple(sc.c_names);
3481 varnames = PyList_AsTuple(sc.c_varnames);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003482 filename = PyString_InternFromString(sc.c_filename);
3483 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003484 if (!PyErr_Occurred())
3485 co = PyCode_New(sc.c_argcount,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003486 sc.c_nlocals,
Guido van Rossum8b993a91997-01-17 21:04:03 +00003487 sc.c_maxstacklevel,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003488 sc.c_flags,
3489 sc.c_code,
3490 consts,
3491 names,
3492 varnames,
3493 filename,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003494 name,
3495 sc.c_firstlineno,
3496 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003497 Py_XDECREF(consts);
3498 Py_XDECREF(names);
3499 Py_XDECREF(varnames);
3500 Py_XDECREF(filename);
3501 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003502 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003503 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003504 return co;
3505}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003506
3507int
3508PyCode_Addr2Line(co, addrq)
3509 PyCodeObject *co;
3510 int addrq;
3511{
3512 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003513 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003514 int line = co->co_firstlineno;
3515 int addr = 0;
3516 while (--size >= 0) {
3517 addr += *p++;
3518 if (addr > addrq)
3519 break;
3520 line += *p++;
3521 }
3522 return line;
3523}