annotate Python/compile.c @ 73:3028acaa56b0 legacy-trunk

Compile class definitions. Document and fix code generation for try statements. Use two bytes for all arguments. Avoid duplicate entries in lists of constants and names.
author Guido van Rossum <guido@python.org>
date Sun, 18 Nov 1990 17:35:03 +0000
parents cccd534f2280
children a6934380c6e7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 /* Compile an expression node to intermediate code */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 #include <stdio.h>
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
4 #include <ctype.h>
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 #include "string.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
6
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 #include "PROTO.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 #include "object.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 #include "objimpl.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
10 #include "intobject.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
11 #include "floatobject.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
12 #include "stringobject.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
13 #include "listobject.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
14 #include "node.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
15 #include "token.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
16 #include "graminit.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
17 #include "errors.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
18 #include "compile.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
19 #include "opcode.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
20
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
21 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
22 code_dealloc(c)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
23 codeobject *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
24 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
25 XDECREF(c->co_code);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
26 XDECREF(c->co_consts);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
27 XDECREF(c->co_names);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
28 DEL(c);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
29 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
30
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
31 typeobject Codetype = {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
32 OB_HEAD_INIT(&Typetype)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
33 0,
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
34 "code",
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
35 sizeof(codeobject),
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
36 0,
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
37 code_dealloc, /*tp_dealloc*/
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
38 0, /*tp_print*/
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
39 0, /*tp_getattr*/
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
40 0, /*tp_setattr*/
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
41 0, /*tp_compare*/
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
42 0, /*tp_repr*/
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
43 0, /*tp_as_number*/
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
44 0, /*tp_as_sequence*/
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
45 0, /*tp_as_mapping*/
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
46 };
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
47
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
48 static codeobject *newcodeobject PROTO((object *, object *, object *));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
49
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
50 static codeobject *
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
51 newcodeobject(code, consts, names)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
52 object *code;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
53 object *consts;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
54 object *names;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
55 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
56 codeobject *co;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
57 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
58 /* Check argument types */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
59 if (code == NULL || !is_stringobject(code) ||
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
60 consts == NULL || !is_listobject(consts) ||
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
61 names == NULL || !is_listobject(names)) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 err_badcall();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
63 return NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
64 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
65 /* Make sure the list of names contains only strings */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
66 for (i = getlistsize(names); --i >= 0; ) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
67 object *v = getlistitem(names, i);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
68 if (v == NULL || !is_stringobject(v)) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
69 err_badcall();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
70 return NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
71 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
72 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
73 co = NEWOBJ(codeobject, &Codetype);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
74 if (co != NULL) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
75 INCREF(code);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
76 co->co_code = (stringobject *)code;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
77 INCREF(consts);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
78 co->co_consts = consts;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
79 INCREF(names);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
80 co->co_names = names;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
81 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
82 return co;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
83 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
84
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
85
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
86 /* Data structure used internally */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
87 struct compiling {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
88 object *c_code; /* string */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
89 object *c_consts; /* list of objects */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
90 object *c_names; /* list of strings (names) */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
91 int c_nexti; /* index into c_code */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
92 int c_errors; /* counts errors occurred */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
93 };
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
94
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
95 /* Prototypes */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
96 static int com_init PROTO((struct compiling *));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
97 static void com_free PROTO((struct compiling *));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
98 static void com_done PROTO((struct compiling *));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
99 static void com_node PROTO((struct compiling *, struct _node *));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
100 static void com_addbyte PROTO((struct compiling *, int));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
101 static void com_addint PROTO((struct compiling *, int));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
102 static void com_addoparg PROTO((struct compiling *, int, int));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
103 static void com_addfwref PROTO((struct compiling *, int, int *));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
104 static void com_backpatch PROTO((struct compiling *, int));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
105 static int com_add PROTO((struct compiling *, object *, object *));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
106 static int com_addconst PROTO((struct compiling *, object *));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
107 static int com_addname PROTO((struct compiling *, object *));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
108 static void com_addopname PROTO((struct compiling *, int, node *));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
109
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
110 static int
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
111 com_init(c)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
112 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
113 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
114 if ((c->c_code = newsizedstringobject((char *)NULL, 0)) == NULL)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
115 goto fail_3;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
116 if ((c->c_consts = newlistobject(0)) == NULL)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
117 goto fail_2;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
118 if ((c->c_names = newlistobject(0)) == NULL)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
119 goto fail_1;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
120 c->c_nexti = 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
121 c->c_errors = 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
122 return 1;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
123
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
124 fail_1:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
125 DECREF(c->c_consts);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
126 fail_2:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
127 DECREF(c->c_code);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
128 fail_3:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
129 return 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
130 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
131
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
132 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
133 com_free(c)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
134 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
135 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
136 XDECREF(c->c_code);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
137 XDECREF(c->c_consts);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
138 XDECREF(c->c_names);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
139 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
140
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
141 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
142 com_done(c)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
143 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
144 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
145 if (c->c_code != NULL)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
146 resizestring(&c->c_code, c->c_nexti);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
147 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
148
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
149 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
150 com_addbyte(c, byte)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
151 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
152 int byte;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
153 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
154 int len;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
155 if (byte < 0 || byte > 255) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
156 err_setstr(SystemError, "com_addbyte: byte out of range");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
157 c->c_errors++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
158 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
159 if (c->c_code == NULL)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
160 return;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
161 len = getstringsize(c->c_code);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
162 if (c->c_nexti >= len) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
163 if (resizestring(&c->c_code, len+1000) != 0) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
164 c->c_errors++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
165 return;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
166 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
167 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
168 getstringvalue(c->c_code)[c->c_nexti++] = byte;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
169 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
170
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
171 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
172 com_addint(c, x)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
173 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
174 int x;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
175 {
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
176 com_addbyte(c, x & 0xff);
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
177 com_addbyte(c, x >> 8); /* XXX x should be positive */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
178 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
179
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
180 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
181 com_addoparg(c, op, arg)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
182 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
183 int op;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
184 int arg;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
185 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
186 com_addbyte(c, op);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
187 com_addint(c, arg);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
188 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
189
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
190 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
191 com_addfwref(c, op, p_anchor)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
192 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
193 int op;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
194 int *p_anchor;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
195 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
196 /* Compile a forward reference for backpatching */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
197 int here;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
198 int anchor;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
199 com_addbyte(c, op);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
200 here = c->c_nexti;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
201 anchor = *p_anchor;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
202 *p_anchor = here;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
203 com_addint(c, anchor == 0 ? 0 : here - anchor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
204 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
205
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
206 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
207 com_backpatch(c, anchor)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
208 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
209 int anchor; /* Must be nonzero */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
210 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
211 unsigned char *code = (unsigned char *) getstringvalue(c->c_code);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
212 int target = c->c_nexti;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
213 int lastanchor = 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
214 int dist;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
215 int prev;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
216 for (;;) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
217 /* Make the JUMP instruction at anchor point to target */
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
218 prev = code[anchor] + (code[anchor+1] << 8);
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
219 dist = target - (anchor+2);
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
220 code[anchor] = dist & 0xff;
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
221 code[anchor+1] = dist >> 8;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
222 if (!prev)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
223 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
224 lastanchor = anchor;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
225 anchor -= prev;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
226 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
227 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
228
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
229 /* Handle constants and names uniformly */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
230
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
231 static int
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
232 com_add(c, list, v)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
233 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
234 object *list;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
235 object *v;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
236 {
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
237 int n = getlistsize(list);
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
238 int i;
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
239 for (i = n; --i >= 0; ) {
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
240 object *w = getlistitem(list, i);
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
241 if (cmpobject(v, w) == 0)
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
242 return i;
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
243 }
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
244 if (addlistitem(list, v) != 0)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
245 c->c_errors++;
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
246 return n;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
247 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
248
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
249 static int
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
250 com_addconst(c, v)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
251 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
252 object *v;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
253 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
254 return com_add(c, c->c_consts, v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
255 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
256
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
257 static int
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
258 com_addname(c, v)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
259 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
260 object *v;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
261 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
262 return com_add(c, c->c_names, v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
263 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
264
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
265 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
266 com_addopname(c, op, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
267 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
268 int op;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
269 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
270 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
271 object *v;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
272 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
273 char *name;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
274 if (TYPE(n) == STAR)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
275 name = "*";
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
276 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
277 REQ(n, NAME);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
278 name = STR(n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
279 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
280 if ((v = newstringobject(name)) == NULL) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
281 c->c_errors++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
282 i = 255;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
283 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
284 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
285 i = com_addname(c, v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
286 DECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
287 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
288 com_addoparg(c, op, i);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
289 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
290
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
291 static object *
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
292 parsenumber(s)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
293 char *s;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
294 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
295 extern long strtol();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
296 extern double atof();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
297 char *end = s;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
298 long x;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
299 x = strtol(s, &end, 0);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
300 if (*end == '\0')
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
301 return newintobject(x);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
302 if (*end == '.' || *end == 'e' || *end == 'E')
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
303 return newfloatobject(atof(s));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
304 err_setstr(RuntimeError, "bad number syntax");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
305 return NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
306 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
307
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
308 static object *
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
309 parsestr(s)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
310 char *s;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
311 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
312 object *v;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
313 int len;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
314 char *buf;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
315 char *p;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
316 int c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
317 if (*s != '\'') {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
318 err_badcall();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
319 return NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
320 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
321 s++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
322 len = strlen(s);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
323 if (s[--len] != '\'') {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
324 err_badcall();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
325 return NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
326 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
327 if (strchr(s, '\\') == NULL)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
328 return newsizedstringobject(s, len);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
329 v = newsizedstringobject((char *)NULL, len);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
330 p = buf = getstringvalue(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
331 while (*s != '\0' && *s != '\'') {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
332 if (*s != '\\') {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
333 *p++ = *s++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
334 continue;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
335 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
336 s++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
337 switch (*s++) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
338 /* XXX This assumes ASCII! */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
339 case '\\': *p++ = '\\'; break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
340 case '\'': *p++ = '\''; break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
341 case 'b': *p++ = '\b'; break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
342 case 'f': *p++ = '\014'; break; /* FF */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
343 case 't': *p++ = '\t'; break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
344 case 'n': *p++ = '\n'; break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
345 case 'r': *p++ = '\r'; break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
346 case 'v': *p++ = '\013'; break; /* VT */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
347 case 'E': *p++ = '\033'; break; /* ESC, not C */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
348 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
349 case '0': case '1': case '2': case '3':
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
350 case '4': case '5': case '6': case '7':
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
351 c = s[-1] - '0';
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
352 if ('0' <= *s && *s <= '7') {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
353 c = (c<<3) + *s++ - '0';
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
354 if ('0' <= *s && *s <= '7')
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
355 c = (c<<3) + *s++ - '0';
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
356 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
357 *p++ = c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
358 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
359 case 'x':
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
360 if (isxdigit(*s)) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
361 sscanf(s, "%x", &c);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
362 *p++ = c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
363 do {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
364 s++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
365 } while (isxdigit(*s));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
366 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
367 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
368 /* FALLTHROUGH */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
369 default: *p++ = '\\'; *p++ = s[-1]; break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
370 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
371 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
372 resizestring(&v, (int)(p - buf));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
373 return v;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
374 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
375
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
376 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
377 com_list_constructor(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
378 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
379 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
380 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
381 int len;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
382 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
383 object *v, *w;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
384 if (TYPE(n) != testlist)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
385 REQ(n, exprlist);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
386 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
387 len = (NCH(n) + 1) / 2;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
388 for (i = 0; i < NCH(n); i += 2)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
389 com_node(c, CHILD(n, i));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
390 com_addoparg(c, BUILD_LIST, len);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
391 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
392
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
393 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
394 com_atom(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
395 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
396 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
397 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
398 node *ch;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
399 object *v;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
400 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
401 REQ(n, atom);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
402 ch = CHILD(n, 0);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
403 switch (TYPE(ch)) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
404 case LPAR:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
405 if (TYPE(CHILD(n, 1)) == RPAR)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
406 com_addoparg(c, BUILD_TUPLE, 0);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
407 else
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
408 com_node(c, CHILD(n, 1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
409 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
410 case LSQB:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
411 if (TYPE(CHILD(n, 1)) == RSQB)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
412 com_addoparg(c, BUILD_LIST, 0);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
413 else
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
414 com_list_constructor(c, CHILD(n, 1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
415 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
416 case LBRACE:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
417 com_addoparg(c, BUILD_MAP, 0);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
418 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
419 case BACKQUOTE:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
420 com_node(c, CHILD(n, 1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
421 com_addbyte(c, UNARY_CONVERT);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
422 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
423 case NUMBER:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
424 if ((v = parsenumber(STR(ch))) == NULL) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
425 c->c_errors++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
426 i = 255;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
427 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
428 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
429 i = com_addconst(c, v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
430 DECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
431 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
432 com_addoparg(c, LOAD_CONST, i);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
433 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
434 case STRING:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
435 if ((v = parsestr(STR(ch))) == NULL) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
436 c->c_errors++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
437 i = 255;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
438 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
439 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
440 i = com_addconst(c, v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
441 DECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
442 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
443 com_addoparg(c, LOAD_CONST, i);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
444 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
445 case NAME:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
446 com_addopname(c, LOAD_NAME, ch);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
447 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
448 default:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
449 fprintf(stderr, "node type %d\n", TYPE(ch));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
450 err_setstr(SystemError, "com_atom: unexpected node type");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
451 c->c_errors++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
452 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
453 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
454
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
455 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
456 com_slice(c, n, op)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
457 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
458 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
459 int op;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
460 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
461 if (NCH(n) == 1) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
462 com_addbyte(c, op);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
463 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
464 else if (NCH(n) == 2) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
465 if (TYPE(CHILD(n, 0)) != COLON) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
466 com_node(c, CHILD(n, 0));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
467 com_addbyte(c, op+1);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
468 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
469 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
470 com_node(c, CHILD(n, 1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
471 com_addbyte(c, op+2);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
472 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
473 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
474 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
475 com_node(c, CHILD(n, 0));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
476 com_node(c, CHILD(n, 2));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
477 com_addbyte(c, op+3);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
478 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
479 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
480
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
481 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
482 com_apply_subscript(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
483 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
484 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
485 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
486 REQ(n, subscript);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
487 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) != COLON) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
488 /* It's a single subscript */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
489 com_node(c, CHILD(n, 0));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
490 com_addbyte(c, BINARY_SUBSCR);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
491 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
492 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
493 /* It's a slice: [expr] ':' [expr] */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
494 com_slice(c, n, SLICE);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
495 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
496 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
497
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
498 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
499 com_call_function(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
500 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
501 node *n; /* EITHER testlist OR ')' */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
502 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
503 if (TYPE(n) == RPAR) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
504 com_addbyte(c, UNARY_CALL);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
505 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
506 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
507 com_node(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
508 com_addbyte(c, BINARY_CALL);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
509 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
510 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
511
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
512 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
513 com_select_member(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
514 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
515 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
516 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
517 com_addopname(c, LOAD_ATTR, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
518 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
519
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
520 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
521 com_apply_trailer(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
522 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
523 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
524 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
525 REQ(n, trailer);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
526 switch (TYPE(CHILD(n, 0))) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
527 case LPAR:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
528 com_call_function(c, CHILD(n, 1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
529 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
530 case DOT:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
531 com_select_member(c, CHILD(n, 1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
532 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
533 case LSQB:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
534 com_apply_subscript(c, CHILD(n, 1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
535 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
536 default:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
537 err_setstr(SystemError,
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
538 "com_apply_trailer: unknown trailer type");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
539 c->c_errors++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
540 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
541 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
542
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
543 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
544 com_factor(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
545 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
546 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
547 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
548 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
549 REQ(n, factor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
550 if (TYPE(CHILD(n, 0)) == PLUS) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
551 com_factor(c, CHILD(n, 1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
552 com_addbyte(c, UNARY_POSITIVE);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
553 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
554 else if (TYPE(CHILD(n, 0)) == MINUS) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
555 com_factor(c, CHILD(n, 1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
556 com_addbyte(c, UNARY_NEGATIVE);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
557 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
558 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
559 com_atom(c, CHILD(n, 0));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
560 for (i = 1; i < NCH(n); i++)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
561 com_apply_trailer(c, CHILD(n, i));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
562 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
563 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
564
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
565 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
566 com_term(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
567 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
568 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
569 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
570 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
571 int op;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
572 REQ(n, term);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
573 com_factor(c, CHILD(n, 0));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
574 for (i = 2; i < NCH(n); i += 2) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
575 com_factor(c, CHILD(n, i));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
576 switch (TYPE(CHILD(n, i-1))) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
577 case STAR:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
578 op = BINARY_MULTIPLY;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
579 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
580 case SLASH:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
581 op = BINARY_DIVIDE;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
582 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
583 case PERCENT:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
584 op = BINARY_MODULO;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
585 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
586 default:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
587 err_setstr(SystemError,
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
588 "com_term: term operator not *, / or %");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
589 c->c_errors++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
590 op = 255;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
591 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
592 com_addbyte(c, op);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
593 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
594 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
595
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
596 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
597 com_expr(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
598 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
599 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
600 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
601 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
602 int op;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
603 REQ(n, expr);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
604 com_term(c, CHILD(n, 0));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
605 for (i = 2; i < NCH(n); i += 2) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
606 com_term(c, CHILD(n, i));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
607 switch (TYPE(CHILD(n, i-1))) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
608 case PLUS:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
609 op = BINARY_ADD;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
610 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
611 case MINUS:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
612 op = BINARY_SUBTRACT;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
613 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
614 default:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
615 err_setstr(SystemError,
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
616 "com_expr: expr operator not + or -");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
617 c->c_errors++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
618 op = 255;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
619 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
620 com_addbyte(c, op);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
621 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
622 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
623
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
624 static enum cmp_op
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
625 cmp_type(n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
626 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
627 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
628 REQ(n, comp_op);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
629 /* comp_op: '<' | '>' | '=' | '>' '=' | '<' '=' | '<' '>'
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
630 | 'in' | 'not' 'in' | 'is' | 'is' not' */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
631 if (NCH(n) == 1) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
632 n = CHILD(n, 0);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
633 switch (TYPE(n)) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
634 case LESS: return LT;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
635 case GREATER: return GT;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
636 case EQUAL: return EQ;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
637 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
638 if (strcmp(STR(n), "is") == 0) return IS;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
639 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
640 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
641 else if (NCH(n) == 2) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
642 int t2 = TYPE(CHILD(n, 1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
643 switch (TYPE(CHILD(n, 0))) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
644 case LESS: if (t2 == EQUAL) return LE;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
645 if (t2 == GREATER) return NE;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
646 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
647 case GREATER: if (t2 == EQUAL) return GE;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
648 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
649 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
650 return NOT_IN;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
651 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
652 return IS_NOT;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
653 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
654 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
655 return BAD;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
656 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
657
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
658 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
659 com_comparison(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
660 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
661 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
662 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
663 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
664 enum cmp_op op;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
665 int anchor;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
666 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
667 com_expr(c, CHILD(n, 0));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
668 if (NCH(n) == 1)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
669 return;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
670
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
671 /****************************************************************
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
672 The following code is generated for all but the last
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
673 comparison in a chain:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
674
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
675 label: on stack: opcode: jump to:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
676
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
677 a <code to load b>
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
678 a, b DUP_TOP
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
679 a, b, b ROT_THREE
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
680 b, a, b COMPARE_OP
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
681 b, 0-or-1 JUMP_IF_FALSE L1
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
682 b, 1 POP_TOP
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
683 b
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
684
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
685 We are now ready to repeat this sequence for the next
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
686 comparison in the chain.
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
687
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
688 For the last we generate:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
689
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
690 b <code to load c>
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
691 b, c COMPARE_OP
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
692 0-or-1
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
693
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
694 If there were any jumps to L1 (i.e., there was more than one
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
695 comparison), we generate:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
696
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
697 0-or-1 JUMP_FORWARD L2
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
698 L1: b, 0 ROT_TWO
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
699 0, b POP_TOP
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
700 0
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
701 L2:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
702 ****************************************************************/
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
703
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
704 anchor = 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
705
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
706 for (i = 2; i < NCH(n); i += 2) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
707 com_expr(c, CHILD(n, i));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
708 if (i+2 < NCH(n)) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
709 com_addbyte(c, DUP_TOP);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
710 com_addbyte(c, ROT_THREE);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
711 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
712 op = cmp_type(CHILD(n, i-1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
713 if (op == BAD) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
714 err_setstr(SystemError,
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
715 "com_comparison: unknown comparison op");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
716 c->c_errors++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
717 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
718 com_addoparg(c, COMPARE_OP, op);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
719 if (i+2 < NCH(n)) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
720 com_addfwref(c, JUMP_IF_FALSE, &anchor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
721 com_addbyte(c, POP_TOP);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
722 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
723 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
724
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
725 if (anchor) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
726 int anchor2 = 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
727 com_addfwref(c, JUMP_FORWARD, &anchor2);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
728 com_backpatch(c, anchor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
729 com_addbyte(c, ROT_TWO);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
730 com_addbyte(c, POP_TOP);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
731 com_backpatch(c, anchor2);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
732 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
733 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
734
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
735 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
736 com_not_test(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
737 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
738 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
739 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
740 REQ(n, not_test); /* 'not' not_test | comparison */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
741 if (NCH(n) == 1) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
742 com_comparison(c, CHILD(n, 0));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
743 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
744 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
745 com_not_test(c, CHILD(n, 1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
746 com_addbyte(c, UNARY_NOT);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
747 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
748 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
749
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
750 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
751 com_and_test(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
752 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
753 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
754 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
755 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
756 int anchor;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
757 REQ(n, and_test); /* not_test ('and' not_test)* */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
758 anchor = 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
759 i = 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
760 for (;;) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
761 com_not_test(c, CHILD(n, i));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
762 if ((i += 2) >= NCH(n))
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
763 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
764 com_addfwref(c, JUMP_IF_FALSE, &anchor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
765 com_addbyte(c, POP_TOP);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
766 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
767 if (anchor)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
768 com_backpatch(c, anchor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
769 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
770
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
771 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
772 com_test(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
773 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
774 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
775 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
776 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
777 int anchor;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
778 REQ(n, test); /* and_test ('and' and_test)* */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
779 anchor = 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
780 i = 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
781 for (;;) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
782 com_and_test(c, CHILD(n, i));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
783 if ((i += 2) >= NCH(n))
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
784 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
785 com_addfwref(c, JUMP_IF_TRUE, &anchor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
786 com_addbyte(c, POP_TOP);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
787 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
788 if (anchor)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
789 com_backpatch(c, anchor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
790 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
791
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
792 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
793 com_list(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
794 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
795 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
796 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
797 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
798 if (NCH(n) == 1) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
799 com_node(c, CHILD(n, 0));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
800 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
801 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
802 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
803 int len;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
804 len = (NCH(n) + 1) / 2;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
805 for (i = 0; i < NCH(n); i += 2)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
806 com_node(c, CHILD(n, i));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
807 com_addoparg(c, BUILD_TUPLE, len);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
808 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
809 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
810
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
811
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
812 /* Begin of assignment compilation */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
813
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
814 static void com_assign_name PROTO((struct compiling *, node *, int));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
815 static void com_assign PROTO((struct compiling *, node *, int));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
816
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
817 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
818 com_assign_attr(c, n, assigning)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
819 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
820 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
821 int assigning;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
822 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
823 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
824 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
825
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
826 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
827 com_assign_slice(c, n, assigning)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
828 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
829 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
830 int assigning;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
831 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
832 com_slice(c, n, assigning ? STORE_SLICE : DELETE_SLICE);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
833 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
834
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
835 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
836 com_assign_subscript(c, n, assigning)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
837 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
838 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
839 int assigning;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
840 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
841 com_node(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
842 com_addbyte(c, assigning ? STORE_SUBSCR : DELETE_SUBSCR);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
843 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
844
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
845 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
846 com_assign_trailer(c, n, assigning)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
847 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
848 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
849 int assigning;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
850 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
851 char *name;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
852 REQ(n, trailer);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
853 switch (TYPE(CHILD(n, 0))) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
854 case LPAR: /* '(' [exprlist] ')' */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
855 err_setstr(TypeError, "can't assign to function call");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
856 c->c_errors++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
857 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
858 case DOT: /* '.' NAME */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
859 com_assign_attr(c, CHILD(n, 1), assigning);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
860 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
861 case LSQB: /* '[' subscript ']' */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
862 n = CHILD(n, 1);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
863 REQ(n, subscript); /* subscript: expr | [expr] ':' [expr] */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
864 if (NCH(n) > 1 || TYPE(CHILD(n, 0)) == COLON)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
865 com_assign_slice(c, n, assigning);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
866 else
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
867 com_assign_subscript(c, CHILD(n, 0), assigning);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
868 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
869 default:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
870 err_setstr(TypeError, "unknown trailer type");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
871 c->c_errors++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
872 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
873 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
874
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
875 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
876 com_assign_tuple(c, n, assigning)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
877 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
878 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
879 int assigning;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
880 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
881 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
882 if (TYPE(n) != testlist)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
883 REQ(n, exprlist);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
884 if (assigning)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
885 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
886 for (i = 0; i < NCH(n); i += 2)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
887 com_assign(c, CHILD(n, i), assigning);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
888 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
889
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
890 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
891 com_assign_list(c, n, assigning)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
892 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
893 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
894 int assigning;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
895 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
896 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
897 if (assigning)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
898 com_addoparg(c, UNPACK_LIST, (NCH(n)+1)/2);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
899 for (i = 0; i < NCH(n); i += 2)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
900 com_assign(c, CHILD(n, i), assigning);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
901 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
902
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
903 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
904 com_assign_name(c, n, assigning)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
905 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
906 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
907 int assigning;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
908 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
909 REQ(n, NAME);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
910 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
911 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
912
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
913 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
914 com_assign(c, n, assigning)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
915 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
916 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
917 int assigning;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
918 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
919 /* Loop to avoid trivial recursion */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
920 for (;;) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
921 switch (TYPE(n)) {
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
922
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
923 case exprlist:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
924 case testlist:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
925 if (NCH(n) > 1) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
926 com_assign_tuple(c, n, assigning);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
927 return;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
928 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
929 n = CHILD(n, 0);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
930 break;
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
931
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
932 case test:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
933 case and_test:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
934 case not_test:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
935 if (NCH(n) > 1) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
936 err_setstr(TypeError,
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
937 "can't assign to operator");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
938 c->c_errors++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
939 return;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
940 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
941 n = CHILD(n, 0);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
942 break;
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
943
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
944 case comparison:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
945 if (NCH(n) > 1) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
946 err_setstr(TypeError,
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
947 "can't assign to operator");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
948 c->c_errors++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
949 return;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
950 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
951 n = CHILD(n, 0);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
952 break;
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
953
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
954 case expr:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
955 if (NCH(n) > 1) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
956 err_setstr(TypeError,
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
957 "can't assign to operator");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
958 c->c_errors++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
959 return;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
960 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
961 n = CHILD(n, 0);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
962 break;
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
963
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
964 case term:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
965 if (NCH(n) > 1) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
966 err_setstr(TypeError,
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
967 "can't assign to operator");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
968 c->c_errors++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
969 return;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
970 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
971 n = CHILD(n, 0);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
972 break;
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
973
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
974 case factor: /* ('+'|'-') factor | atom trailer* */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
975 if (TYPE(CHILD(n, 0)) != atom) { /* '+' | '-' */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
976 err_setstr(TypeError,
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
977 "can't assign to operator");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
978 c->c_errors++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
979 return;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
980 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
981 if (NCH(n) > 1) { /* trailer present */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
982 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
983 com_node(c, CHILD(n, 0));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
984 for (i = 1; i+1 < NCH(n); i++) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
985 com_apply_trailer(c, CHILD(n, i));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
986 } /* NB i is still alive */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
987 com_assign_trailer(c,
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
988 CHILD(n, i), assigning);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
989 return;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
990 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
991 n = CHILD(n, 0);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
992 break;
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
993
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
994 case atom:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
995 switch (TYPE(CHILD(n, 0))) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
996 case LPAR:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
997 n = CHILD(n, 1);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
998 if (TYPE(n) == RPAR) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
999 /* XXX Should allow () = () ??? */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1000 err_setstr(TypeError,
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1001 "can't assign to ()");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1002 c->c_errors++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1003 return;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1004 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1005 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1006 case LSQB:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1007 n = CHILD(n, 1);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1008 if (TYPE(n) == RSQB) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1009 err_setstr(TypeError,
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1010 "can't assign to []");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1011 c->c_errors++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1012 return;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1013 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1014 com_assign_list(c, n, assigning);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1015 return;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1016 case NAME:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1017 com_assign_name(c, CHILD(n, 0), assigning);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1018 return;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1019 default:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1020 err_setstr(TypeError,
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1021 "can't assign to constant");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1022 c->c_errors++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1023 return;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1024 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1025 break;
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1026
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1027 default:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1028 fprintf(stderr, "node type %d\n", TYPE(n));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1029 err_setstr(SystemError, "com_assign: bad node");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1030 c->c_errors++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1031 return;
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1032
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1033 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1034 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1035 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1036
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1037 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1038 com_expr_stmt(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1039 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1040 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1041 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1042 REQ(n, expr_stmt); /* exprlist ('=' exprlist)* NEWLINE */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1043 com_node(c, CHILD(n, NCH(n)-2));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1044 if (NCH(n) == 2) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1045 com_addbyte(c, PRINT_EXPR);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1046 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1047 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1048 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1049 for (i = 0; i < NCH(n)-3; i+=2) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1050 if (i+2 < NCH(n)-3)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1051 com_addbyte(c, DUP_TOP);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1052 com_assign(c, CHILD(n, i), 1/*assign*/);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1053 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1054 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1055 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1056
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1057 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1058 com_print_stmt(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1059 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1060 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1061 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1062 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1063 REQ(n, print_stmt); /* 'print' (test ',')* [test] NEWLINE */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1064 for (i = 1; i+1 < NCH(n); i += 2) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1065 com_node(c, CHILD(n, i));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1066 com_addbyte(c, PRINT_ITEM);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1067 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1068 if (TYPE(CHILD(n, NCH(n)-2)) != COMMA)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1069 com_addbyte(c, PRINT_NEWLINE);
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1070 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1071 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1072
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1073 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1074 com_return_stmt(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1075 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1076 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1077 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1078 REQ(n, return_stmt); /* 'return' [testlist] NEWLINE */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1079 if (NCH(n) == 2)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1080 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1081 else
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1082 com_node(c, CHILD(n, 1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1083 com_addbyte(c, RETURN_VALUE);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1084 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1085
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1086 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1087 com_raise_stmt(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1088 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1089 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1090 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1091 REQ(n, raise_stmt); /* 'raise' expr [',' expr] NEWLINE */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1092 com_node(c, CHILD(n, 1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1093 if (NCH(n) > 3)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1094 com_node(c, CHILD(n, 3));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1095 else
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1096 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1097 com_addbyte(c, RAISE_EXCEPTION);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1098 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1099
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1100 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1101 com_import_stmt(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1102 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1103 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1104 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1105 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1106 REQ(n, import_stmt);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1107 /* 'import' NAME (',' NAME)* NEWLINE |
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1108 'from' NAME 'import' ('*' | NAME (',' NAME)*) NEWLINE */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1109 if (STR(CHILD(n, 0))[0] == 'f') {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1110 /* 'from' NAME 'import' ... */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1111 REQ(CHILD(n, 1), NAME);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1112 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1113 for (i = 3; i < NCH(n); i += 2)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1114 com_addopname(c, IMPORT_FROM, CHILD(n, i));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1115 com_addbyte(c, POP_TOP);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1116 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1117 else {
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1118 /* 'import' ... */
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1119 for (i = 1; i < NCH(n); i += 2) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1120 com_addopname(c, IMPORT_NAME, CHILD(n, i));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1121 com_addopname(c, STORE_NAME, CHILD(n, i));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1122 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1123 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1124 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1125
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1126 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1127 com_if_stmt(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1128 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1129 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1130 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1131 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1132 int anchor = 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1133 REQ(n, if_stmt);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1134 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1135 for (i = 0; i+3 < NCH(n); i+=4) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1136 int a = 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1137 com_node(c, CHILD(n, i+1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1138 com_addfwref(c, JUMP_IF_FALSE, &a);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1139 com_addbyte(c, POP_TOP);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1140 com_node(c, CHILD(n, i+3));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1141 com_addfwref(c, JUMP_FORWARD, &anchor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1142 com_backpatch(c, a);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1143 com_addbyte(c, POP_TOP);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1144 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1145 if (i+2 < NCH(n))
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1146 com_node(c, CHILD(n, i+2));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1147 com_backpatch(c, anchor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1148 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1149
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1150 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1151 com_while_stmt(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1152 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1153 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1154 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1155 int break_anchor = 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1156 int anchor = 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1157 int begin;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1158 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1159 com_addfwref(c, SETUP_LOOP, &break_anchor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1160 begin = c->c_nexti;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1161 com_node(c, CHILD(n, 1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1162 com_addfwref(c, JUMP_IF_FALSE, &anchor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1163 com_addbyte(c, POP_TOP);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1164 com_node(c, CHILD(n, 3));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1165 com_addoparg(c, JUMP_ABSOLUTE, begin);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1166 com_backpatch(c, anchor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1167 com_addbyte(c, POP_TOP);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1168 com_addbyte(c, POP_BLOCK);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1169 if (NCH(n) > 4)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1170 com_node(c, CHILD(n, 6));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1171 com_backpatch(c, break_anchor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1172 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1173
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1174 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1175 com_for_stmt(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1176 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1177 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1178 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1179 object *v;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1180 int break_anchor = 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1181 int anchor = 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1182 int begin;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1183 REQ(n, for_stmt);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1184 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1185 com_addfwref(c, SETUP_LOOP, &break_anchor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1186 com_node(c, CHILD(n, 3));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1187 v = newintobject(0L);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1188 if (v == NULL)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1189 c->c_errors++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1190 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1191 XDECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1192 begin = c->c_nexti;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1193 com_addfwref(c, FOR_LOOP, &anchor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1194 com_assign(c, CHILD(n, 1), 1/*assigning*/);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1195 com_node(c, CHILD(n, 5));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1196 com_addoparg(c, JUMP_ABSOLUTE, begin);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1197 com_backpatch(c, anchor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1198 com_addbyte(c, POP_BLOCK);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1199 if (NCH(n) > 8)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1200 com_node(c, CHILD(n, 8));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1201 com_backpatch(c, break_anchor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1202 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1203
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1204 /* Although 'execpt' and 'finally' clauses can be combined
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1205 syntactically, they are compiled separately. In fact,
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1206 try: S
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1207 except E1: S1
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1208 except E2: S2
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1209 ...
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1210 finally: Sf
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1211 is equivalent to
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1212 try:
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1213 try: S
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1214 except E1: S1
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1215 except E2: S2
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1216 ...
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1217 finally: Sf
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1218 meaning that the 'finally' clause is entered even if things
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1219 go wrong again in an exception handler. Note that this is
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1220 not the case for exception handlers: at most one is entered.
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1221
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1222 Code generated for "try: S finally: Sf" is as follows:
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1223
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1224 SETUP_FINALLY L
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1225 <code for S>
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1226 POP_BLOCK
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1227 LOAD_CONST <nil>
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1228 LOAD_CONST <nil>
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1229 L: <code for Sf>
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1230 END_FINALLY
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1231
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1232 The special instructions use the block stack. Each block
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1233 stack entry contains the instruction that created it (here
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1234 SETUP_FINALLY), the level of the value stack at the time the
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1235 block stack entry was created, and a label (here L).
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1236
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1237 SETUP_FINALLY:
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1238 Pushes the current value stack level and the label
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1239 onto the block stack.
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1240 POP_BLOCK:
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1241 Pops en entry from the block stack, and pops the value
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1242 stack until its level is the same as indicated on the
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1243 block stack. (The label is ignored.)
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1244 END_FINALLY:
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1245 Pops two entries from the *value* stack and re-raises
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1246 the exception they specify. If the top entry is nil,
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1247 no exception is raised. If it is a number, a pseudo
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1248 exception is raised ('return' or 'break'). Otherwise,
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1249 a real exception (specified by a string) is raised.
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1250 The second entry popped from the is the value that goes
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1251 with the exception (or the return value).
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1252
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1253 The block stack is unwound when an exception is raised:
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1254 when a SETUP_FINALLY entry is found, the exception is pushed
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1255 onto the value stack (and the exception condition is cleared),
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1256 and the interpreter jumps to the label gotten from the block
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1257 stack.
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1258
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1259 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1260
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1261 Value stack Label Instruction Argument
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1262 [] SETUP_EXCEPT L1
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1263 [] <code for S>
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1264 [] POP_BLOCK
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1265 [] JUMP_FORWARD L0
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1266
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1267 [val, exc] L1: DUP
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1268 [val, exc, exc] <evaluate E1>
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1269 [val, exc, exc, E1] COMPARE_OP EXC_MATCH
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1270 [val, exc, 1-or-0] JUMP_IF_FALSE L2
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1271 [val, exc, 1] POP
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1272 [val, exc] POP
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1273 [val] <assign to V1>
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1274 [] <code for S1>
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1275 JUMP_FORWARD L0
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1276
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1277 [val, exc, 0] L2: POP
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1278 [val, exc] DUP
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1279 .............................etc.......................
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1280
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1281 [val, exc, 0] Ln+1: POP
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1282 [val, exc] END_FINALLY # re-raise exception
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1283
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1284 [] L0: <next statement>
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1285
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1286 Of course, parts are not generated if Vi or Ei is not present.
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1287 */
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1288
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1289 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1290 com_try_stmt(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1291 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1292 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1293 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1294 int finally_anchor = 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1295 int except_anchor = 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1296 REQ(n, try_stmt);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1297 /* 'try' ':' suite (except_clause ':' suite)* ['finally' ':' suite] */
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1298
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1299 if (NCH(n) > 3 && TYPE(CHILD(n, NCH(n)-3)) != except_clause) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1300 /* Have a 'finally' clause */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1301 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1302 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1303 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == except_clause) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1304 /* Have an 'except' clause */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1305 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1306 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1307 com_node(c, CHILD(n, 2));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1308 if (except_anchor) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1309 int end_anchor = 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1310 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1311 node *ch;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1312 com_addbyte(c, POP_BLOCK);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1313 com_addfwref(c, JUMP_FORWARD, &end_anchor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1314 com_backpatch(c, except_anchor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1315 for (i = 3;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1316 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1317 i += 3) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1318 /* except_clause: 'except' [expr [',' expr]] */
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1319 if (except_anchor == 0) {
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1320 err_setstr(TypeError,
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1321 "default 'except:' must be last");
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1322 c->c_errors++;
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1323 break;
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1324 }
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1325 except_anchor = 0;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1326 if (NCH(ch) > 1) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1327 com_addbyte(c, DUP_TOP);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1328 com_node(c, CHILD(ch, 1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1329 com_addoparg(c, COMPARE_OP, EXC_MATCH);
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1330 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1331 com_addbyte(c, POP_TOP);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1332 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1333 com_addbyte(c, POP_TOP);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1334 if (NCH(ch) > 3)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1335 com_assign(c, CHILD(ch, 3), 1/*assigning*/);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1336 else
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1337 com_addbyte(c, POP_TOP);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1338 com_node(c, CHILD(n, i+2));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1339 com_addfwref(c, JUMP_FORWARD, &end_anchor);
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1340 if (except_anchor) {
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1341 com_backpatch(c, except_anchor);
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1342 com_addbyte(c, POP_TOP);
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1343 }
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1344 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1345 com_addbyte(c, END_FINALLY);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1346 com_backpatch(c, end_anchor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1347 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1348 if (finally_anchor) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1349 com_addbyte(c, POP_BLOCK);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1350 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1351 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1352 com_backpatch(c, finally_anchor);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1353 com_node(c, CHILD(n, NCH(n)-1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1354 com_addbyte(c, END_FINALLY);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1355 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1356 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1357
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1358 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1359 com_suite(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1360 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1361 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1362 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1363 REQ(n, suite);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1364 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1365 if (NCH(n) == 1) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1366 com_node(c, CHILD(n, 0));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1367 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1368 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1369 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1370 for (i = 0; i < NCH(n); i++) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1371 node *ch = CHILD(n, i);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1372 if (TYPE(ch) == stmt)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1373 com_node(c, ch);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1374 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1375 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1376 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1377
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1378 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1379 com_funcdef(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1380 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1381 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1382 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1383 object *v;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1384 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1385 v = (object *)compile(n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1386 if (v == NULL)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1387 c->c_errors++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1388 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1389 int i = com_addconst(c, v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1390 com_addoparg(c, LOAD_CONST, i);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1391 com_addbyte(c, BUILD_FUNCTION);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1392 com_addopname(c, STORE_NAME, CHILD(n, 1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1393 DECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1394 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1395 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1396
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1397 static void
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1398 com_bases(c, n)
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1399 struct compiling *c;
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1400 node *n;
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1401 {
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1402 int i, nbases;
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1403 REQ(n, baselist);
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1404 /*
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1405 baselist: atom arguments (',' atom arguments)*
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1406 arguments: '(' [testlist] ')'
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1407 */
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1408 for (i = 0; i < NCH(n); i += 3)
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1409 com_node(c, CHILD(n, i));
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1410 com_addoparg(c, BUILD_TUPLE, (NCH(n)+1) / 3);
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1411 }
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1412
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1413 static void
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1414 com_classdef(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1415 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1416 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1417 {
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1418 object *v;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1419 REQ(n, classdef);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1420 /*
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1421 classdef: 'class' NAME parameters ['=' baselist] ':' suite
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1422 baselist: atom arguments (',' atom arguments)*
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1423 arguments: '(' [testlist] ')'
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1424 */
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1425 if (NCH(n) == 7)
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1426 com_bases(c, CHILD(n, 4));
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1427 else
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1428 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1429 v = (object *)compile(n);
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1430 if (v == NULL)
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1431 c->c_errors++;
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1432 else {
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1433 int i = com_addconst(c, v);
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1434 com_addoparg(c, LOAD_CONST, i);
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1435 com_addbyte(c, BUILD_FUNCTION);
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1436 com_addbyte(c, UNARY_CALL);
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1437 com_addbyte(c, BUILD_CLASS);
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1438 com_addopname(c, STORE_NAME, CHILD(n, 1));
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1439 DECREF(v);
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1440 }
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1441 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1442
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1443 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1444 com_node(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1445 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1446 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1447 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1448 switch (TYPE(n)) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1449
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1450 /* Definition nodes */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1451
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1452 case funcdef:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1453 com_funcdef(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1454 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1455 case classdef:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1456 com_classdef(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1457 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1458
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1459 /* Trivial parse tree nodes */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1460
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1461 case stmt:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1462 case simple_stmt:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1463 case flow_stmt:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1464 case compound_stmt:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1465 com_node(c, CHILD(n, 0));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1466 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1467
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1468 /* Statement nodes */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1469
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1470 case expr_stmt:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1471 com_expr_stmt(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1472 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1473 case print_stmt:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1474 com_print_stmt(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1475 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1476 case del_stmt: /* 'del' exprlist NEWLINE */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1477 com_assign(c, CHILD(n, 1), 0/*delete*/);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1478 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1479 case pass_stmt:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1480 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1481 case break_stmt:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1482 com_addbyte(c, BREAK_LOOP);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1483 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1484 case return_stmt:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1485 com_return_stmt(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1486 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1487 case raise_stmt:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1488 com_raise_stmt(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1489 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1490 case import_stmt:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1491 com_import_stmt(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1492 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1493 case if_stmt:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1494 com_if_stmt(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1495 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1496 case while_stmt:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1497 com_while_stmt(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1498 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1499 case for_stmt:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1500 com_for_stmt(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1501 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1502 case try_stmt:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1503 com_try_stmt(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1504 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1505 case suite:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1506 com_suite(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1507 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1508
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1509 /* Expression nodes */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1510
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1511 case testlist:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1512 com_list(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1513 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1514 case test:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1515 com_test(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1516 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1517 case and_test:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1518 com_and_test(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1519 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1520 case not_test:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1521 com_not_test(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1522 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1523 case comparison:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1524 com_comparison(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1525 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1526 case exprlist:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1527 com_list(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1528 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1529 case expr:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1530 com_expr(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1531 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1532 case term:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1533 com_term(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1534 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1535 case factor:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1536 com_factor(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1537 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1538 case atom:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1539 com_atom(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1540 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1541
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1542 default:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1543 fprintf(stderr, "node type %d\n", TYPE(n));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1544 err_setstr(SystemError, "com_node: unexpected node type");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1545 c->c_errors++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1546 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1547 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1548
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1549 static void com_fplist PROTO((struct compiling *, node *));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1550
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1551 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1552 com_fpdef(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1553 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1554 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1555 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1556 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1557 if (TYPE(CHILD(n, 0)) == LPAR)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1558 com_fplist(c, CHILD(n, 1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1559 else
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1560 com_addopname(c, STORE_NAME, CHILD(n, 0));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1561 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1562
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1563 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1564 com_fplist(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1565 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1566 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1567 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1568 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1569 if (NCH(n) == 1) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1570 com_fpdef(c, CHILD(n, 0));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1571 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1572 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1573 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1574 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1575 for (i = 0; i < NCH(n); i += 2)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1576 com_fpdef(c, CHILD(n, i));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1577 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1578 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1579
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1580 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1581 com_file_input(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1582 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1583 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1584 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1585 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1586 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1587 for (i = 0; i < NCH(n); i++) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1588 node *ch = CHILD(n, i);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1589 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1590 com_node(c, ch);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1591 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1592 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1593
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1594 /* Top-level compile-node interface */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1595
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1596 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1597 compile_funcdef(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1598 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1599 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1600 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1601 node *ch;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1602 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1603 ch = CHILD(n, 2); /* parameters: '(' [fplist] ')' */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1604 ch = CHILD(ch, 1); /* ')' | fplist */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1605 if (TYPE(ch) == RPAR)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1606 com_addbyte(c, REFUSE_ARGS);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1607 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1608 com_addbyte(c, REQUIRE_ARGS);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1609 com_fplist(c, ch);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1610 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1611 com_node(c, CHILD(n, 4));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1612 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1613 com_addbyte(c, RETURN_VALUE);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1614 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1615
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1616 static void
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1617 compile_classdef(c, n)
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1618 struct compiling *c;
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1619 node *n;
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1620 {
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1621 node *ch;
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1622 REQ(n, classdef);
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1623 /*
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1624 classdef: 'class' NAME parameters ['=' baselist] ':' suite
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1625 */
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1626 com_addbyte(c, REFUSE_ARGS);
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1627 com_node(c, CHILD(n, NCH(n)-1));
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1628 com_addbyte(c, LOAD_LOCALS);
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1629 com_addbyte(c, RETURN_VALUE);
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1630 }
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1631
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1632 static void
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1633 compile_node(c, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1634 struct compiling *c;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1635 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1636 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1637 switch (TYPE(n)) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1638
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1639 case single_input:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1640 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1641 n = CHILD(n, 0);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1642 if (TYPE(n) != NEWLINE)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1643 com_node(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1644 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1645
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1646 case file_input:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1647 com_file_input(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1648 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1649
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1650 case expr_input:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1651 case eval_input:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1652 com_node(c, CHILD(n, 0));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1653 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1654
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1655 case funcdef:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1656 compile_funcdef(c, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1657 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1658
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1659 case classdef:
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1660 compile_classdef(c, n);
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1661 break;
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
1662
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1663 default:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1664 fprintf(stderr, "node type %d\n", TYPE(n));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1665 err_setstr(SystemError, "compile_node: unexpected node type");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1666 c->c_errors++;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1667 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1668 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1669
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1670 codeobject *
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1671 compile(n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1672 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1673 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1674 struct compiling sc;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1675 codeobject *co;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1676 if (!com_init(&sc))
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1677 return NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1678 compile_node(&sc, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1679 com_done(&sc);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1680 if (sc.c_errors == 0)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1681 co = newcodeobject(sc.c_code, sc.c_consts, sc.c_names);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1682 else
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1683 co = NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1684 com_free(&sc);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1685 return co;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1686 }