annotate dmdscript_tango/statement.d @ 0:55c2951c07be

initial, files origin, premoved tree
author saaadel
date Sun, 24 Jan 2010 12:34:47 +0200
parents
children 8363a4bf6a8f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2 /* Digital Mars DMDScript source code.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
3 * Copyright (c) 2000-2002 by Chromium Communications
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
4 * D version Copyright (c) 2004-2007 by Digital Mars
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
5 * All Rights Reserved
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
6 * written by Walter Bright
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
7 * www.digitalmars.com
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
8 * Use at your own risk. There is no warranty, express or implied.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
9 * License for redistribution is by the GNU General Public License in gpl.txt.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
10 *
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
11 * A binary, non-exclusive license for commercial use can be
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
12 * purchased from www.digitalmars.com/dscript/buy.html.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
13 *
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
14 * DMDScript is implemented in the D Programming Language,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
15 * www.digitalmars.com/d/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
16 *
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
17 * For a C++ implementation of DMDScript, including COM support,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
18 * see www.digitalmars.com/dscript/cppscript.html.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
19 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
20
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
21
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
22 module dmdscript.statement;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
23
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
24 import std.stdio;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
25 import std.string;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
26 import std.math;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
27
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
28 import dmdscript.script;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
29 import dmdscript.value;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
30 import dmdscript.scopex;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
31 import dmdscript.expression;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
32 import dmdscript.irstate;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
33 import dmdscript.symbol;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
34 import dmdscript.identifier;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
35 import dmdscript.ir;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
36 import dmdscript.lexer;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
37 import dmdscript.errmsgs;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
38 import dmdscript.functiondefinition;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
39 import dmdscript.opcodes;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
40
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
41 enum
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
42 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
43 TOPSTATEMENT,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
44 FUNCTIONDEFINITION,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
45 EXPSTATEMENT,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
46 VARSTATEMENT,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
47 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
48
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
49
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
50 /******************************** TopStatement ***************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
51
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
52 class TopStatement
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
53 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
54 const uint TOPSTATEMENT_SIGNATURE = 0xBA3FE1F3;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
55 uint signature = TOPSTATEMENT_SIGNATURE;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
56
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
57 Loc loc;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
58 int done; // 0: parsed
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
59 // 1: semantic
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
60 // 2: toIR
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
61 int st;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
62
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
63 this(Loc loc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
64 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
65 this.loc = loc;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
66 this.done = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
67 this.st = TOPSTATEMENT;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
68 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
69
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
70 invariant
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
71 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
72 assert(signature == TOPSTATEMENT_SIGNATURE);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
73 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
74
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
75 void toBuffer(inout tchar[] buf)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
76 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
77 buf ~= "TopStatement.toBuffer()\n";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
78 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
79
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
80 Statement semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
81 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
82 writefln("TopStatement.semantic(%p)", this);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
83 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
84 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
85
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
86 void toIR(IRstate *irs)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
87 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
88 writefln("TopStatement.toIR(%p)", this);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
89 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
90
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
91 void error(Scope *sc, int msgnum)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
92 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
93 error(sc, errmsgtbl[msgnum]);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
94 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
95
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
96 void error(Scope *sc, ...)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
97 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
98 tchar[] buf;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
99 tchar[] sourcename;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
100
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
101 if (sc.funcdef)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
102 { if (sc.funcdef.isanonymous)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
103 sourcename = "anonymous";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
104 else if (sc.funcdef.name)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
105 sourcename ~= sc.funcdef.name.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
106 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
107 buf = std.string.format("%s(%d) : Error: ", sourcename, loc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
108
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
109 void putc(dchar c)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
110 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
111 std.utf.encode(buf, c);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
112 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
113
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
114 std.format.doFormat(&putc, _arguments, _argptr);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
115
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
116
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
117 if (!sc.errinfo.message)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
118 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
119 sc.errinfo.message = buf;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
120 sc.errinfo.linnum = loc;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
121 sc.errinfo.srcline = Lexer.locToSrcline(sc.getSource().ptr, loc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
122 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
123 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
124
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
125 TopStatement ImpliedReturn()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
126 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
127 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
128 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
129 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
130
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
131 /******************************** Statement ***************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
132
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
133 class Statement : TopStatement
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
134 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
135 LabelSymbol *label;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
136
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
137 this(Loc loc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
138 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
139 super(loc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
140 this.loc = loc;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
141 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
142
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
143 void toBuffer(inout tchar[] buf)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
144 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
145 buf ~= "Statement.toBuffer()\n";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
146 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
147
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
148 Statement semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
149 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
150 writef("Statement.semantic(%p)\n", this);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
151 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
152 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
153
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
154 void toIR(IRstate *irs)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
155 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
156 writef("Statement.toIR(%p)\n", this);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
157 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
158
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
159 uint getBreak()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
160 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
161 assert(0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
162 return 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
163 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
164
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
165 uint getContinue()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
166 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
167 assert(0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
168 return 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
169 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
170
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
171 uint getGoto()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
172 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
173 assert(0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
174 return 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
175 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
176
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
177 uint getTarget()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
178 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
179 assert(0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
180 return 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
181 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
182
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
183 ScopeStatement getScope()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
184 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
185 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
186 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
187 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
188
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
189 /******************************** EmptyStatement ***************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
190
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
191 class EmptyStatement : Statement
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
192 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
193 this(Loc loc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
194 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
195 super(loc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
196 this.loc = loc;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
197 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
198
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
199 void toBuffer(inout tchar[] buf)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
200 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
201 buf ~= ";\n";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
202 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
203
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
204 Statement semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
205 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
206 //writef("EmptyStatement.semantic(%p)\n", this);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
207 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
208 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
209
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
210 void toIR(IRstate *irs)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
211 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
212 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
213 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
214
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
215 /******************************** ExpStatement ***************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
216
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
217 class ExpStatement : Statement
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
218 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
219 Expression exp;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
220
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
221 this(Loc loc, Expression exp)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
222 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
223 //writef("ExpStatement.ExpStatement(this = %x, exp = %x)\n", this, exp);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
224 super(loc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
225 st = EXPSTATEMENT;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
226 this.exp = exp;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
227 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
228
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
229 void toBuffer(inout tchar[] buf)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
230 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
231 if (exp)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
232 exp.toBuffer(buf);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
233 buf ~= ";\n";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
234 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
235
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
236 Statement semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
237 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
238 //writef("exp = '%s'\n", exp.toString());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
239 //writef("ExpStatement.semantic(this = %x, exp = %x, exp.vptr = %x, %x, %x)\n", this, exp, ((uint *)exp)[0], /*(*(uint **)exp)[12],*/ *(uint *)(*(uint **)exp)[12]);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
240 if (exp)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
241 exp = exp.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
242 //writef("-semantic()\n");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
243 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
244 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
245
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
246 TopStatement ImpliedReturn()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
247 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
248 return new ImpliedReturnStatement(loc, exp);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
249 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
250
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
251 void toIR(IRstate *irs)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
252 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
253 //writef("ExpStatement.toIR(%p)\n", exp);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
254 if (exp)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
255 { uint marksave = irs.mark();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
256
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
257 assert(exp);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
258 exp.toIR(irs, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
259 irs.release(marksave);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
260
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
261 exp = null; // release to garbage collector
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
262 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
263 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
264 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
265
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
266 /****************************** VarDeclaration ******************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
267
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
268 class VarDeclaration
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
269 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
270 Loc loc;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
271 Identifier *name;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
272 Expression init;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
273
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
274 this(Loc loc, Identifier *name, Expression init)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
275 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
276 this.loc = loc;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
277 this.init = init;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
278 this.name = name;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
279 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
280 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
281
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
282 /******************************** VarStatement ***************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
283
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
284 class VarStatement : Statement
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
285 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
286 VarDeclaration[] vardecls;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
287
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
288 this(Loc loc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
289 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
290 super(loc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
291 st = VARSTATEMENT;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
292 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
293
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
294 Statement semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
295 { FunctionDefinition fd;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
296 uint i;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
297
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
298 // Collect all the Var statements in order in the function
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
299 // declaration, this is so it is easy to instantiate them
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
300 fd = sc.funcdef;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
301 //fd.varnames.reserve(vardecls.length);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
302
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
303 for (i = 0; i < vardecls.length; i++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
304 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
305 VarDeclaration vd;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
306
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
307 vd = vardecls[i];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
308 if (vd.init)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
309 vd.init = vd.init.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
310 fd.varnames ~= vd.name;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
311 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
312
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
313 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
314 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
315
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
316 void toBuffer(inout tchar[] buf)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
317 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
318 uint i;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
319
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
320 if (vardecls.length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
321 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
322 buf ~= "var ";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
323
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
324 for (i = 0; i < vardecls.length; i++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
325 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
326 VarDeclaration vd;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
327
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
328 vd = vardecls[i];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
329 buf ~= vd.name.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
330 if (vd.init)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
331 { buf ~= " = ";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
332 vd.init.toBuffer(buf);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
333 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
334 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
335 buf ~= ";\n";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
336 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
337 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
338
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
339 void toIR(IRstate *irs)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
340 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
341 uint i;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
342 uint ret;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
343
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
344 if (vardecls.length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
345 { uint marksave;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
346
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
347 marksave = irs.mark();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
348 ret = irs.alloc(1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
349
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
350 for (i = 0; i < vardecls.length; i++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
351 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
352 VarDeclaration vd;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
353
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
354 vd = vardecls[i];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
355
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
356 // This works like assignment statements:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
357 // name = init;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
358 IR property;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
359
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
360 if (vd.init)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
361 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
362 vd.init.toIR(irs, ret);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
363 property.id = Identifier.build(vd.name.toString());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
364 irs.gen2(loc, IRputthis, ret, property.index);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
365 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
366 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
367 irs.release(marksave);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
368 vardecls[] = null; // help gc
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
369 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
370 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
371 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
372
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
373 /******************************** BlockStatement ***************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
374
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
375 class BlockStatement : Statement
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
376 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
377 Statement[] statements;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
378
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
379 this(Loc loc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
380 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
381 super(loc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
382 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
383
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
384 Statement semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
385 { uint i;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
386
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
387 //writefln("BlockStatement.semantic()");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
388 for (i = 0; i < statements.length; i++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
389 { Statement s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
390
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
391 s = statements[i];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
392 assert(s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
393 statements[i] = s.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
394 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
395
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
396 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
397 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
398
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
399 TopStatement ImpliedReturn()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
400 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
401 uint i = statements.length;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
402
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
403 if (i)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
404 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
405 TopStatement ts = statements[i - 1];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
406 ts = ts.ImpliedReturn();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
407 statements[i - 1] = cast(Statement)ts;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
408 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
409 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
410 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
411
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
412
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
413 void toBuffer(inout tchar[] buf)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
414 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
415 buf ~= "{\n";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
416
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
417 foreach (Statement s; statements)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
418 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
419 s.toBuffer(buf);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
420 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
421
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
422 buf ~= "}\n";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
423 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
424
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
425 void toIR(IRstate *irs)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
426 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
427 foreach (Statement s; statements)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
428 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
429 s.toIR(irs);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
430 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
431
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
432 // Release to garbage collector
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
433 statements[] = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
434 statements = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
435 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
436 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
437
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
438 /******************************** LabelStatement ***************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
439
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
440 class LabelStatement : Statement
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
441 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
442 Identifier* ident;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
443 Statement statement;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
444 uint gotoIP;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
445 uint breakIP;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
446 ScopeStatement scopeContext;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
447
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
448 this(Loc loc, Identifier *ident, Statement statement)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
449 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
450 //writef("LabelStatement.LabelStatement(%p, '%s', %p)\n", this, ident.toChars(), statement);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
451 super(loc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
452 this.ident = ident;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
453 this.statement = statement;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
454 gotoIP = ~0u;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
455 breakIP = ~0u;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
456 scopeContext = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
457 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
458
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
459 Statement semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
460 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
461 LabelSymbol ls;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
462
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
463 //writef("LabelStatement.semantic('%ls')\n", ident.toString());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
464 scopeContext = sc.scopeContext;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
465 ls = sc.searchLabel(ident);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
466 if (ls)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
467 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
468 // Ignore multiple definition errors
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
469 //if (ls.statement)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
470 //error(sc, "label '%s' is already defined", ident.toString());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
471 ls.statement = this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
472 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
473 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
474 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
475 ls = new LabelSymbol(loc, ident, this);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
476 sc.insertLabel(ls);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
477 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
478 if (statement)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
479 statement = statement.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
480 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
481 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
482
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
483 TopStatement ImpliedReturn()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
484 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
485 if (statement)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
486 statement = cast(Statement)statement.ImpliedReturn();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
487 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
488 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
489
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
490 void toBuffer(inout tchar[] buf)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
491 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
492 buf ~= ident.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
493 buf ~= ": ";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
494 if (statement)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
495 statement.toBuffer(buf);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
496 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
497 buf ~= '\n';
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
498 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
499
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
500 void toIR(IRstate *irs)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
501 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
502 gotoIP = irs.getIP();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
503 statement.toIR(irs);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
504 breakIP = irs.getIP();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
505 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
506
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
507 uint getGoto()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
508 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
509 return gotoIP;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
510 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
511
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
512 uint getBreak()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
513 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
514 return breakIP;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
515 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
516
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
517 uint getContinue()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
518 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
519 return statement.getContinue();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
520 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
521
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
522 ScopeStatement getScope()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
523 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
524 return scopeContext;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
525 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
526 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
527
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
528 /******************************** IfStatement ***************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
529
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
530 class IfStatement : Statement
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
531 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
532 Expression condition;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
533 Statement ifbody;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
534 Statement elsebody;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
535
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
536 this(Loc loc, Expression condition, Statement ifbody, Statement elsebody)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
537 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
538 super(loc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
539 this.condition = condition;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
540 this.ifbody = ifbody;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
541 this.elsebody = elsebody;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
542 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
543
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
544 Statement semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
545 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
546 //writef("IfStatement.semantic(%p)\n", sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
547 assert(condition);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
548 condition = condition.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
549 ifbody = ifbody.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
550 if (elsebody)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
551 elsebody = elsebody.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
552
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
553 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
554 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
555
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
556 TopStatement ImpliedReturn()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
557 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
558 assert(condition);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
559 ifbody = cast(Statement)ifbody.ImpliedReturn();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
560 if (elsebody)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
561 elsebody = cast(Statement)elsebody.ImpliedReturn();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
562 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
563 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
564
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
565
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
566
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
567 void toIR(IRstate *irs)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
568 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
569 uint c;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
570 uint u1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
571 uint u2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
572
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
573 assert(condition);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
574 c = irs.alloc(1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
575 condition.toIR(irs, c);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
576 u1 = irs.getIP();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
577 irs.gen2(loc, (condition.isBooleanResult() ? IRjfb : IRjf), 0, c);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
578 irs.release(c, 1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
579 ifbody.toIR(irs);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
580 if (elsebody)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
581 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
582 u2 = irs.getIP();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
583 irs.gen1(loc, IRjmp, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
584 irs.patchJmp(u1, irs.getIP());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
585 elsebody.toIR(irs);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
586 irs.patchJmp(u2, irs.getIP());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
587 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
588 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
589 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
590 irs.patchJmp(u1, irs.getIP());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
591 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
592
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
593 // Help GC
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
594 condition = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
595 ifbody = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
596 elsebody = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
597 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
598 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
599
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
600 /******************************** SwitchStatement ***************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
601
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
602 class SwitchStatement : Statement
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
603 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
604 Expression condition;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
605 Statement bdy;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
606 uint breakIP;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
607 ScopeStatement scopeContext;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
608
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
609 DefaultStatement swdefault;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
610 CaseStatement[] cases;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
611
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
612 this(Loc loc, Expression c, Statement b)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
613 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
614 super(loc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
615 condition = c;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
616 bdy = b;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
617 breakIP = ~0u;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
618 scopeContext = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
619
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
620 swdefault = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
621 cases = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
622 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
623
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
624 Statement semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
625 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
626 condition = condition.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
627
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
628 SwitchStatement switchSave = sc.switchTarget;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
629 Statement breakSave = sc.breakTarget;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
630
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
631 scopeContext = sc.scopeContext;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
632 sc.switchTarget = this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
633 sc.breakTarget = this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
634
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
635 bdy = bdy.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
636
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
637 sc.switchTarget = switchSave;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
638 sc.breakTarget = breakSave;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
639
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
640 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
641 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
642
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
643 void toIR(IRstate *irs)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
644 { uint c;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
645 uint udefault;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
646 uint marksave;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
647
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
648 //writef("SwitchStatement.toIR()\n");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
649 marksave = irs.mark();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
650 c = irs.alloc(1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
651 condition.toIR(irs, c);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
652
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
653 // Generate a sequence of cmp-jt
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
654 // Not the most efficient, but we await a more formal
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
655 // specification of switch before we attempt to optimize
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
656
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
657 if (cases.length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
658 { uint x;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
659
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
660 x = irs.alloc(1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
661 for (uint i = 0; i < cases.length; i++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
662 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
663 CaseStatement cs;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
664
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
665 x = irs.alloc(1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
666 cs = cases[i];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
667 cs.exp.toIR(irs, x);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
668 irs.gen3(loc, IRcid, x, c, x);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
669 cs.patchIP = irs.getIP();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
670 irs.gen2(loc, IRjt, 0, x);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
671 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
672 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
673 udefault = irs.getIP();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
674 irs.gen1(loc, IRjmp, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
675
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
676 Statement breakSave = irs.breakTarget;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
677 irs.breakTarget = this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
678 bdy.toIR(irs);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
679
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
680 irs.breakTarget = breakSave;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
681 breakIP = irs.getIP();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
682
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
683 // Patch jump addresses
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
684 if (cases.length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
685 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
686 for (uint i = 0; i < cases.length; i++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
687 { CaseStatement cs;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
688
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
689 cs = cases[i];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
690 irs.patchJmp(cs.patchIP, cs.caseIP);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
691 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
692 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
693 if (swdefault)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
694 irs.patchJmp(udefault, swdefault.defaultIP);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
695 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
696 irs.patchJmp(udefault, breakIP);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
697 irs.release(marksave);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
698
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
699 // Help gc
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
700 condition = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
701 bdy = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
702 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
703
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
704 uint getBreak()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
705 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
706 return breakIP;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
707 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
708
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
709 ScopeStatement getScope()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
710 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
711 return scopeContext;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
712 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
713 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
714
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
715
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
716 /******************************** CaseStatement ***************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
717
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
718 class CaseStatement : Statement
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
719 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
720 Expression exp;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
721 uint caseIP;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
722 uint patchIP;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
723
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
724 this(Loc loc, Expression exp)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
725 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
726 super(loc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
727 this.exp = exp;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
728 caseIP = ~0u;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
729 patchIP = ~0u;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
730 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
731
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
732 Statement semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
733 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
734 //writef("CaseStatement.semantic(%p)\n", sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
735 exp = exp.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
736 if (sc.switchTarget)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
737 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
738 SwitchStatement sw = sc.switchTarget;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
739 uint i;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
740
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
741 // Look for duplicate
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
742 for (i = 0; i < sw.cases.length; i++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
743 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
744 CaseStatement cs = sw.cases[i];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
745
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
746 if (exp == cs.exp)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
747 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
748 error(sc, errmsgtbl[ERR_SWITCH_REDUNDANT_CASE], exp.toString());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
749 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
750 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
751 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
752 sw.cases ~= this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
753 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
754 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
755 { error(sc, errmsgtbl[ERR_MISPLACED_SWITCH_CASE], exp.toString());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
756 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
757 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
758 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
759 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
760
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
761 void toIR(IRstate *irs)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
762 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
763 caseIP = irs.getIP();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
764 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
765 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
766
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
767 /******************************** DefaultStatement ***************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
768
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
769 class DefaultStatement : Statement
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
770 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
771 uint defaultIP;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
772
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
773 this(Loc loc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
774 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
775 super(loc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
776 defaultIP = ~0u;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
777 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
778
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
779 Statement semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
780 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
781 if (sc.switchTarget)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
782 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
783 SwitchStatement sw = sc.switchTarget;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
784
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
785 if (sw.swdefault)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
786 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
787 error(sc, ERR_SWITCH_REDUNDANT_DEFAULT);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
788 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
789 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
790 sw.swdefault = this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
791 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
792 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
793 { error(sc, ERR_MISPLACED_SWITCH_DEFAULT);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
794 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
795 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
796 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
797 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
798
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
799 void toIR(IRstate *irs)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
800 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
801 defaultIP = irs.getIP();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
802 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
803 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
804
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
805 /******************************** DoStatement ***************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
806
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
807 class DoStatement : Statement
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
808 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
809 Statement bdy;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
810 Expression condition;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
811 uint breakIP;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
812 uint continueIP;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
813 ScopeStatement scopeContext;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
814
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
815 this(Loc loc, Statement b, Expression c)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
816 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
817 super(loc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
818 bdy = b;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
819 condition = c;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
820 breakIP = ~0u;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
821 continueIP = ~0u;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
822 scopeContext = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
823 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
824
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
825 Statement semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
826 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
827 Statement continueSave = sc.continueTarget;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
828 Statement breakSave = sc.breakTarget;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
829
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
830 scopeContext = sc.scopeContext;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
831 sc.continueTarget = this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
832 sc.breakTarget = this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
833
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
834 bdy = bdy.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
835 condition = condition.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
836
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
837 sc.continueTarget = continueSave;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
838 sc.breakTarget = breakSave;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
839
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
840 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
841 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
842
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
843 TopStatement ImpliedReturn()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
844 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
845 if (bdy)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
846 bdy = cast(Statement)bdy.ImpliedReturn();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
847 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
848 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
849
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
850 void toIR(IRstate *irs)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
851 { uint c;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
852 uint u1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
853 Statement continueSave = irs.continueTarget;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
854 Statement breakSave = irs.breakTarget;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
855 uint marksave;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
856
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
857 irs.continueTarget = this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
858 irs.breakTarget = this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
859
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
860 marksave = irs.mark();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
861 u1 = irs.getIP();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
862 bdy.toIR(irs);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
863 c = irs.alloc(1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
864 continueIP = irs.getIP();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
865 condition.toIR(irs, c);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
866 irs.gen2(loc, (condition.isBooleanResult() ? IRjtb : IRjt), u1 - irs.getIP(), c);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
867 breakIP = irs.getIP();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
868 irs.release(marksave);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
869
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
870 irs.continueTarget = continueSave;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
871 irs.breakTarget = breakSave;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
872
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
873 // Help GC
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
874 condition = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
875 bdy = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
876 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
877
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
878 uint getBreak()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
879 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
880 return breakIP;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
881 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
882
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
883 uint getContinue()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
884 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
885 return continueIP;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
886 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
887
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
888 ScopeStatement getScope()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
889 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
890 return scopeContext;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
891 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
892 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
893
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
894 /******************************** WhileStatement ***************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
895
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
896 class WhileStatement : Statement
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
897 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
898 Expression condition;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
899 Statement bdy;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
900 uint breakIP;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
901 uint continueIP;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
902 ScopeStatement scopeContext;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
903
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
904 this(Loc loc, Expression c, Statement b)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
905 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
906 super(loc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
907 condition = c;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
908 bdy = b;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
909 breakIP = ~0u;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
910 continueIP = ~0u;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
911 scopeContext = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
912 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
913
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
914 Statement semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
915 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
916 Statement continueSave = sc.continueTarget;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
917 Statement breakSave = sc.breakTarget;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
918
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
919 scopeContext = sc.scopeContext;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
920 sc.continueTarget = this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
921 sc.breakTarget = this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
922
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
923 condition = condition.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
924 bdy = bdy.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
925
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
926 sc.continueTarget = continueSave;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
927 sc.breakTarget = breakSave;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
928
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
929 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
930 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
931
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
932 TopStatement ImpliedReturn()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
933 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
934 if (bdy)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
935 bdy = cast(Statement)bdy.ImpliedReturn();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
936 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
937 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
938
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
939 void toIR(IRstate *irs)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
940 { uint c;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
941 uint u1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
942 uint u2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
943
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
944 Statement continueSave = irs.continueTarget;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
945 Statement breakSave = irs.breakTarget;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
946 uint marksave = irs.mark();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
947
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
948 irs.continueTarget = this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
949 irs.breakTarget = this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
950
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
951 u1 = irs.getIP();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
952 continueIP = u1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
953 c = irs.alloc(1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
954 condition.toIR(irs, c);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
955 u2 = irs.getIP();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
956 irs.gen2(loc, (condition.isBooleanResult() ? IRjfb : IRjf), 0, c);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
957 bdy.toIR(irs);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
958 irs.gen1(loc, IRjmp, u1 - irs.getIP());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
959 irs.patchJmp(u2, irs.getIP());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
960 breakIP = irs.getIP();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
961
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
962 irs.release(marksave);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
963 irs.continueTarget = continueSave;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
964 irs.breakTarget = breakSave;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
965
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
966 // Help GC
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
967 condition = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
968 bdy = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
969 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
970
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
971 uint getBreak()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
972 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
973 return breakIP;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
974 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
975
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
976 uint getContinue()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
977 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
978 return continueIP;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
979 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
980
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
981 ScopeStatement getScope()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
982 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
983 return scopeContext;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
984 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
985 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
986
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
987 /******************************** ForStatement ***************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
988
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
989 class ForStatement : Statement
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
990 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
991 Statement init;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
992 Expression condition;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
993 Expression increment;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
994 Statement bdy;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
995 uint breakIP;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
996 uint continueIP;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
997 ScopeStatement scopeContext;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
998
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
999 this(Loc loc, Statement init, Expression condition, Expression increment, Statement bdy)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1000 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1001 super(loc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1002 this.init = init;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1003 this.condition = condition;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1004 this.increment = increment;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1005 this.bdy = bdy;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1006 breakIP = ~0u;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1007 continueIP = ~0u;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1008 scopeContext = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1009 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1010
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1011 Statement semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1012 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1013 Statement continueSave = sc.continueTarget;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1014 Statement breakSave = sc.breakTarget;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1015
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1016 if (init)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1017 init = init.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1018 if (condition)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1019 condition = condition.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1020 if (increment)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1021 increment = increment.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1022
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1023 scopeContext = sc.scopeContext;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1024 sc.continueTarget = this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1025 sc.breakTarget = this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1026
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1027 bdy = bdy.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1028
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1029 sc.continueTarget = continueSave;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1030 sc.breakTarget = breakSave;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1031
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1032 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1033 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1034
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1035 TopStatement ImpliedReturn()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1036 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1037 if (bdy)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1038 bdy = cast(Statement)bdy.ImpliedReturn();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1039 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1040 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1041
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1042 void toIR(IRstate *irs)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1043 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1044 uint u1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1045 uint u2 = 0; // unneeded initialization keeps lint happy
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1046
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1047 Statement continueSave = irs.continueTarget;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1048 Statement breakSave = irs.breakTarget;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1049 uint marksave = irs.mark();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1050
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1051 irs.continueTarget = this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1052 irs.breakTarget = this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1053
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1054 if (init)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1055 init.toIR(irs);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1056 u1 = irs.getIP();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1057 if (condition)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1058 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1059 if (condition.op == TOKless || condition.op == TOKlessequal)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1060 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1061 BinExp be = cast(BinExp)condition;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1062 RealExpression re;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1063 uint b;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1064 uint c;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1065
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1066 b = irs.alloc(1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1067 be.e1.toIR(irs, b);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1068 re = cast(RealExpression )be.e2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1069 if (be.e2.op == TOKreal && !isnan(re.value))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1070 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1071 u2 = irs.getIP();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1072 irs.gen(loc, (condition.op == TOKless) ? IRjltc : IRjlec, 4, 0, b, re.value);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1073 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1074 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1075 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1076 c = irs.alloc(1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1077 be.e2.toIR(irs, c);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1078 u2 = irs.getIP();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1079 irs.gen3(loc, (condition.op == TOKless) ? IRjlt : IRjle, 0, b, c);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1080 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1081 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1082 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1083 { uint c;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1084
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1085 c = irs.alloc(1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1086 condition.toIR(irs, c);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1087 u2 = irs.getIP();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1088 irs.gen2(loc, (condition.isBooleanResult() ? IRjfb : IRjf), 0, c);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1089 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1090 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1091 bdy.toIR(irs);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1092 continueIP = irs.getIP();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1093 if (increment)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1094 increment.toIR(irs, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1095 irs.gen1(loc, IRjmp, u1 - irs.getIP());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1096 if (condition)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1097 irs.patchJmp(u2, irs.getIP());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1098
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1099 breakIP = irs.getIP();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1100
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1101 irs.release(marksave);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1102 irs.continueTarget = continueSave;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1103 irs.breakTarget = breakSave;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1104
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1105 // Help GC
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1106 init = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1107 condition = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1108 bdy = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1109 increment = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1110 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1111
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1112 uint getBreak()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1113 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1114 return breakIP;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1115 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1116
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1117 uint getContinue()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1118 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1119 return continueIP;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1120 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1121
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1122 ScopeStatement getScope()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1123 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1124 return scopeContext;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1125 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1126 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1127
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1128 /******************************** ForInStatement ***************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1129
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1130 class ForInStatement : Statement
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1131 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1132 Statement init;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1133 Expression inexp;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1134 Statement bdy;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1135 uint breakIP;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1136 uint continueIP;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1137 ScopeStatement scopeContext;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1138
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1139 this(Loc loc, Statement init, Expression inexp, Statement bdy)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1140 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1141 super(loc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1142 this.init = init;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1143 this.inexp = inexp;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1144 this.bdy = bdy;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1145 breakIP = ~0u;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1146 continueIP = ~0u;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1147 scopeContext = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1148 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1149
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1150 Statement semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1151 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1152 Statement continueSave = sc.continueTarget;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1153 Statement breakSave = sc.breakTarget;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1154
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1155 init = init.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1156
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1157 if (init.st == EXPSTATEMENT)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1158 { ExpStatement es;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1159
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1160 es = cast(ExpStatement)(init);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1161 es.exp.checkLvalue(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1162 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1163 else if (init.st == VARSTATEMENT)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1164 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1165 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1166 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1167 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1168 error(sc, ERR_INIT_NOT_EXPRESSION);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1169 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1170 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1171
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1172 inexp = inexp.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1173
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1174 scopeContext = sc.scopeContext;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1175 sc.continueTarget = this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1176 sc.breakTarget = this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1177
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1178 bdy = bdy.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1179
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1180 sc.continueTarget = continueSave;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1181 sc.breakTarget = breakSave;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1182
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1183 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1184 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1185
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1186 TopStatement ImpliedReturn()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1187 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1188 bdy = cast(Statement)bdy.ImpliedReturn();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1189 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1190 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1191
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1192 void toIR(IRstate *irs)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1193 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1194 uint e;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1195 uint iter;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1196 ExpStatement es;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1197 VarStatement vs;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1198 uint base;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1199 IR property;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1200 int opoff;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1201 uint marksave = irs.mark();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1202
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1203 e = irs.alloc(1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1204 inexp.toIR(irs, e);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1205 iter = irs.alloc(1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1206 irs.gen2(loc, IRiter, iter, e);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1207
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1208 Statement continueSave = irs.continueTarget;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1209 Statement breakSave = irs.breakTarget;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1210
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1211 irs.continueTarget = this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1212 irs.breakTarget = this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1213
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1214 if (init.st == EXPSTATEMENT)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1215 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1216 es = cast(ExpStatement)(init);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1217 es.exp.toLvalue(irs, base, &property, opoff);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1218 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1219 else if (init.st == VARSTATEMENT)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1220 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1221 VarDeclaration vd;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1222
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1223 vs = cast(VarStatement)(init);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1224 assert(vs.vardecls.length == 1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1225 vd = vs.vardecls[0];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1226
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1227 property.id = Identifier.build(vd.name.toString());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1228 opoff = 2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1229 base = ~0u;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1230 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1231 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1232 { // Error already reported by semantic()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1233 return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1234 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1235
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1236 continueIP = irs.getIP();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1237 if (opoff == 2)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1238 irs.gen3(loc, IRnextscope, 0, property.index, iter);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1239 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1240 irs.gen(loc, IRnext + opoff, 4, 0, base, property.index, iter);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1241 bdy.toIR(irs);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1242 irs.gen1(loc, IRjmp, continueIP - irs.getIP());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1243 irs.patchJmp(continueIP, irs.getIP());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1244
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1245 breakIP = irs.getIP();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1246
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1247 irs.continueTarget = continueSave;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1248 irs.breakTarget = breakSave;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1249 irs.release(marksave);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1250
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1251 // Help GC
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1252 init = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1253 inexp = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1254 bdy = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1255 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1256
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1257 uint getBreak()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1258 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1259 return breakIP;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1260 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1261
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1262 uint getContinue()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1263 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1264 return continueIP;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1265 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1266
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1267 ScopeStatement getScope()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1268 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1269 return scopeContext;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1270 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1271 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1272
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1273 /******************************** ScopeStatement ***************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1274
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1275 class ScopeStatement : Statement
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1276 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1277 ScopeStatement enclosingScope;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1278 int depth; // syntactical nesting level of ScopeStatement's
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1279 int npops; // how many items added to scope chain
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1280
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1281 this(Loc loc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1282 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1283 super(loc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1284 enclosingScope = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1285 depth = 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1286 npops = 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1287 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1288 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1289
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1290 /******************************** WithStatement ***************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1291
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1292 class WithStatement : ScopeStatement
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1293 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1294 Expression exp;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1295 Statement bdy;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1296
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1297 this(Loc loc, Expression exp, Statement bdy)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1298 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1299 super(loc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1300 this.exp = exp;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1301 this.bdy = bdy;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1302 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1303
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1304 Statement semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1305 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1306 exp = exp.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1307
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1308 enclosingScope = sc.scopeContext;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1309 sc.scopeContext = this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1310
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1311 // So enclosing FunctionDeclaration knows how deep the With's
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1312 // can nest
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1313 if (enclosingScope)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1314 depth = enclosingScope.depth + 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1315 if (depth > sc.funcdef.withdepth)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1316 sc.funcdef.withdepth = depth;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1317
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1318 sc.nestDepth++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1319 bdy = bdy.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1320 sc.nestDepth--;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1321
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1322 sc.scopeContext = enclosingScope;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1323 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1324 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1325
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1326 TopStatement ImpliedReturn()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1327 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1328 bdy = cast(Statement)bdy.ImpliedReturn();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1329 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1330 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1331
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1332
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1333
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1334 void toIR(IRstate *irs)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1335 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1336 uint c;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1337 uint marksave = irs.mark();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1338
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1339 irs.scopeContext = this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1340
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1341 c = irs.alloc(1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1342 exp.toIR(irs, c);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1343 irs.gen1(loc, IRpush, c);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1344 bdy.toIR(irs);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1345 irs.gen0(loc, IRpop);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1346
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1347 irs.scopeContext = enclosingScope;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1348 irs.release(marksave);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1349
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1350 // Help GC
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1351 exp = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1352 bdy = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1353 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1354 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1355
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1356 /******************************** ContinueStatement ***************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1357
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1358 class ContinueStatement : Statement
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1359 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1360 Identifier *ident;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1361 Statement target;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1362
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1363 this(Loc loc, Identifier *ident)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1364 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1365 super(loc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1366 this.ident = ident;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1367 target = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1368 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1369
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1370 Statement semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1371 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1372 if (ident == null)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1373 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1374 target = sc.continueTarget;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1375 if (!target)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1376 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1377 error(sc, ERR_MISPLACED_CONTINUE);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1378 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1379 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1380 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1381 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1382 { LabelSymbol ls;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1383
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1384 ls = sc.searchLabel(ident);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1385 if (!ls || !ls.statement)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1386 { error(sc, errmsgtbl[ERR_UNDEFINED_STATEMENT_LABEL], ident.toString());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1387 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1388 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1389 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1390 target = ls.statement;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1391 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1392 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1393 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1394
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1395 void toIR(IRstate *irs)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1396 { ScopeStatement w;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1397 ScopeStatement tw;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1398
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1399 tw = target.getScope();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1400 for (w = irs.scopeContext; !(w is tw); w = w.enclosingScope)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1401 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1402 assert(w);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1403 irs.pops(w.npops);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1404 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1405 irs.addFixup(irs.getIP());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1406 irs.gen1(loc, IRjmp, cast(uint)cast(void*)this);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1407 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1408
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1409 uint getTarget()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1410 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1411 assert(target);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1412 return target.getContinue();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1413 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1414 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1415
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1416 /******************************** BreakStatement ***************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1417
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1418 class BreakStatement : Statement
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1419 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1420 Identifier *ident;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1421 Statement target;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1422
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1423 this(Loc loc, Identifier *ident)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1424 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1425 super(loc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1426 this.ident = ident;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1427 target = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1428 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1429
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1430 Statement semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1431 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1432 //writef("BreakStatement.semantic(%p)\n", sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1433 if (ident == null)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1434 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1435 target = sc.breakTarget;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1436 if (!target)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1437 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1438 error(sc, ERR_MISPLACED_BREAK);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1439 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1440 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1441 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1442 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1443 { LabelSymbol ls;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1444
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1445 ls = sc.searchLabel(ident);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1446 if (!ls || !ls.statement)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1447 { error(sc, errmsgtbl[ERR_UNDEFINED_STATEMENT_LABEL], ident.toString());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1448 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1449 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1450 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1451 target = ls.statement;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1452 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1453 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1454 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1455
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1456 void toIR(IRstate *irs)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1457 { ScopeStatement w;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1458 ScopeStatement tw;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1459
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1460 assert(target);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1461 tw = target.getScope();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1462 for (w = irs.scopeContext; !(w is tw); w = w.enclosingScope)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1463 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1464 assert(w);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1465 irs.pops(w.npops);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1466 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1467
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1468 irs.addFixup(irs.getIP());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1469 irs.gen1(loc, IRjmp, cast(uint)cast(void*)this);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1470 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1471
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1472 uint getTarget()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1473 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1474 assert(target);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1475 return target.getBreak();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1476 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1477 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1478
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1479 /******************************** GotoStatement ***************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1480
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1481 class GotoStatement : Statement
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1482 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1483 Identifier *ident;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1484 LabelSymbol label;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1485
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1486 this(Loc loc, Identifier *ident)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1487 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1488 super(loc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1489 this.ident = ident;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1490 label = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1491 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1492
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1493 Statement semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1494 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1495 LabelSymbol ls;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1496
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1497 ls = sc.searchLabel(ident);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1498 if (!ls)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1499 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1500 ls = new LabelSymbol(loc, ident, null);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1501 sc.insertLabel(ls);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1502 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1503 label = ls;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1504 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1505 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1506
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1507 void toIR(IRstate *irs)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1508 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1509 assert(label);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1510
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1511 // Determine how many with pops we need to do
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1512 for (ScopeStatement w = irs.scopeContext; ; w = w.enclosingScope)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1513 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1514 if (!w)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1515 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1516 if (label.statement.scopeContext)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1517 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1518 assert(0); // BUG: should do next statement instead
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1519 //script.error(errmsgtbl[ERR_GOTO_INTO_WITH]);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1520 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1521 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1522 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1523 if (w is label.statement.scopeContext)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1524 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1525 irs.pops(w.npops);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1526 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1527
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1528 irs.addFixup(irs.getIP());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1529 irs.gen1(loc, IRjmp, cast(uint)cast(void*)this);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1530 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1531
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1532 uint getTarget()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1533 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1534 return label.statement.getGoto();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1535 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1536 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1537
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1538 /******************************** ReturnStatement ***************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1539
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1540 class ReturnStatement : Statement
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1541 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1542 Expression exp;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1543
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1544 this(Loc loc, Expression exp)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1545 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1546 super(loc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1547 this.exp = exp;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1548 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1549
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1550 Statement semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1551 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1552 if (exp)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1553 exp = exp.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1554
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1555 // Don't allow return from eval functions or global function
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1556 if (sc.funcdef.iseval || sc.funcdef.isglobal)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1557 error(sc, ERR_MISPLACED_RETURN);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1558
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1559 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1560 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1561
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1562 void toBuffer(inout tchar[] buf)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1563 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1564 //writef("ReturnStatement.toBuffer()\n");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1565 buf ~= "return ";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1566 if (exp)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1567 exp.toBuffer(buf);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1568 buf ~= ";\n";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1569 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1570
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1571 void toIR(IRstate *irs)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1572 { ScopeStatement w;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1573 int npops;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1574
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1575 npops = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1576 for (w = irs.scopeContext; w; w = w.enclosingScope)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1577 npops += w.npops;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1578
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1579 if (exp)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1580 { uint e;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1581
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1582 e = irs.alloc(1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1583 exp.toIR(irs, e);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1584 if (npops)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1585 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1586 irs.gen1(loc, IRimpret, e);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1587 irs.pops(npops);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1588 irs.gen0(loc, IRret);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1589 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1590 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1591 irs.gen1(loc, IRretexp, e);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1592 irs.release(e, 1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1593 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1594 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1595 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1596 if (npops)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1597 irs.pops(npops);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1598 irs.gen0(loc, IRret);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1599 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1600
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1601 // Help GC
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1602 exp = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1603 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1604 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1605
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1606 /******************************** ImpliedReturnStatement ***************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1607
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1608 // Same as ReturnStatement, except that the return value is set but the
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1609 // function does not actually return. Useful for setting the return
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1610 // value for loop bodies.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1611
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1612 class ImpliedReturnStatement : Statement
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1613 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1614 Expression exp;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1615
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1616 this(Loc loc, Expression exp)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1617 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1618 super(loc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1619 this.exp = exp;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1620 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1621
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1622 Statement semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1623 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1624 if (exp)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1625 exp = exp.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1626 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1627 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1628
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1629 void toBuffer(inout tchar[] buf)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1630 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1631 if (exp)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1632 exp.toBuffer(buf);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1633 buf ~= ";\n";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1634 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1635
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1636 void toIR(IRstate *irs)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1637 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1638 if (exp)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1639 { uint e;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1640
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1641 e = irs.alloc(1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1642 exp.toIR(irs, e);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1643 irs.gen1(loc, IRimpret, e);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1644 irs.release(e, 1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1645
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1646 // Help GC
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1647 exp = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1648 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1649 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1650 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1651
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1652 /******************************** ThrowStatement ***************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1653
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1654 class ThrowStatement : Statement
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1655 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1656 Expression exp;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1657
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1658 this(Loc loc, Expression exp)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1659 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1660 super(loc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1661 this.exp = exp;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1662 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1663
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1664 Statement semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1665 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1666 if (exp)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1667 exp = exp.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1668 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1669 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1670 error(sc, ERR_NO_THROW_EXPRESSION);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1671 return new EmptyStatement(loc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1672 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1673 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1674 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1675
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1676 void toBuffer(inout tchar[] buf)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1677 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1678 buf ~= "throw ";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1679 if (exp)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1680 exp.toBuffer(buf);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1681 buf ~= ";\n";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1682 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1683
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1684 void toIR(IRstate *irs)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1685 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1686 uint e;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1687
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1688 assert(exp);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1689 e = irs.alloc(1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1690 exp.toIR(irs, e);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1691 irs.gen1(loc, IRthrow, e);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1692 irs.release(e, 1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1693
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1694 // Help GC
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1695 exp = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1696 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1697 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1698
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1699 /******************************** TryStatement ***************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1700
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1701 class TryStatement : ScopeStatement
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1702 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1703 Statement bdy;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1704 Identifier* catchident;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1705 Statement catchbdy;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1706 Statement finalbdy;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1707
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1708 this(Loc loc, Statement bdy,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1709 Identifier *catchident, Statement catchbdy,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1710 Statement finalbdy)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1711 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1712 super(loc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1713 this.bdy = bdy;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1714 this.catchident = catchident;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1715 this.catchbdy = catchbdy;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1716 this.finalbdy = finalbdy;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1717 if (catchbdy && finalbdy)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1718 npops = 2; // 2 items in scope chain
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1719 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1720
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1721 Statement semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1722 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1723 enclosingScope = sc.scopeContext;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1724 sc.scopeContext = this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1725
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1726 // So enclosing FunctionDeclaration knows how deep the With's
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1727 // can nest
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1728 if (enclosingScope)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1729 depth = enclosingScope.depth + 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1730 if (depth > sc.funcdef.withdepth)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1731 sc.funcdef.withdepth = depth;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1732
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1733 bdy.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1734 if (catchbdy)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1735 catchbdy.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1736 if (finalbdy)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1737 finalbdy.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1738
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1739 sc.scopeContext = enclosingScope;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1740 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1741 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1742
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1743 void toBuffer(inout tchar[] buf)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1744 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1745 buf ~= "try\n";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1746 bdy.toBuffer(buf);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1747 if (catchident)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1748 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1749 buf ~= "catch (" ~
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1750 catchident.toString() ~
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1751 ")\n";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1752 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1753 if (catchbdy)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1754 catchbdy.toBuffer(buf);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1755 if (finalbdy)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1756 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1757 buf ~= "finally\n";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1758 finalbdy.toBuffer(buf);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1759 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1760 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1761
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1762 void toIR(IRstate *irs)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1763 { uint f;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1764 uint c;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1765 uint e;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1766 uint e2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1767 uint marksave = irs.mark();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1768
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1769 irs.scopeContext = this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1770 if (finalbdy)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1771 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1772 f = irs.getIP();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1773 irs.gen1(loc, IRtryfinally, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1774 if (catchbdy)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1775 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1776 c = irs.getIP();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1777 irs.gen2(loc, IRtrycatch, 0, cast(uint)Identifier.build(catchident.toString()));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1778 bdy.toIR(irs);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1779 irs.gen0(loc, IRpop); // remove catch clause
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1780 irs.gen0(loc, IRpop); // call finalbdy
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1781
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1782 e = irs.getIP();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1783 irs.gen1(loc, IRjmp, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1784 irs.patchJmp(c, irs.getIP());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1785 catchbdy.toIR(irs);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1786 irs.gen0(loc, IRpop); // remove catch object
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1787 irs.gen0(loc, IRpop); // call finalbdy code
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1788 e2 = irs.getIP();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1789 irs.gen1(loc, IRjmp, 0); // jmp past finalbdy
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1790
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1791 irs.patchJmp(f, irs.getIP());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1792 irs.scopeContext = enclosingScope;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1793 finalbdy.toIR(irs);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1794 irs.gen0(loc, IRfinallyret);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1795 irs.patchJmp(e, irs.getIP());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1796 irs.patchJmp(e2, irs.getIP());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1797 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1798 else // finalbdy only
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1799 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1800 bdy.toIR(irs);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1801 irs.gen0(loc, IRpop);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1802 e = irs.getIP();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1803 irs.gen1(loc, IRjmp, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1804 irs.patchJmp(f, irs.getIP());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1805 irs.scopeContext = enclosingScope;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1806 finalbdy.toIR(irs);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1807 irs.gen0(loc, IRfinallyret);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1808 irs.patchJmp(e, irs.getIP());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1809 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1810 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1811 else // catchbdy only
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1812 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1813 c = irs.getIP();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1814 irs.gen2(loc, IRtrycatch, 0, cast(uint)Identifier.build(catchident.toString()));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1815 bdy.toIR(irs);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1816 irs.gen0(loc, IRpop);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1817 e = irs.getIP();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1818 irs.gen1(loc, IRjmp, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1819 irs.patchJmp(c, irs.getIP());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1820 catchbdy.toIR(irs);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1821 irs.gen0(loc, IRpop);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1822 irs.patchJmp(e, irs.getIP());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1823 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1824 irs.scopeContext = enclosingScope;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1825 irs.release(marksave);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1826
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1827 // Help GC
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1828 bdy = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1829 catchident = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1830 catchbdy = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1831 finalbdy = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1832 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1833 }