annotate dmd/DoStatement.d @ 178:e3afd1303184

Many small bugs fixed Made all classes derive from TObject to detect memory leaks (functionality is disabled for now) Began work on overriding backend memory allocations (to avoid memory leaks)
author korDen
date Sun, 17 Oct 2010 07:42:00 +0400
parents af724d3510d7
children b0d41ff5e0df
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1 module dmd.DoStatement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2
114
e28b18c23469 added a module dmd.common for commonly used stuff
Trass3r
parents: 72
diff changeset
3 import dmd.common;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4 import dmd.Statement;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5 import dmd.Expression;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6 import dmd.Loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
7 import dmd.Scope;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
8 import dmd.InterState;
155
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
9 import dmd.GlobalExpressions;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
10 import dmd.HdrGenState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
11 import dmd.OutBuffer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
12 import dmd.InlineScanState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
13 import dmd.IRState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
14 import dmd.BE;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
15 import dmd.WANT;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
16
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
17 import dmd.backend.block;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
18 import dmd.backend.Blockx;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
19 import dmd.backend.Util;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
20 import dmd.backend.BC;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
21
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
22 class DoStatement : Statement
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
23 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
24 Statement body_;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
25 Expression condition;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
26
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
27 this(Loc loc, Statement b, Expression c)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
28 {
178
e3afd1303184 Many small bugs fixed
korDen
parents: 174
diff changeset
29 register();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
30 super(loc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
31 body_ = b;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
32 condition = c;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
33 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
34
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 63
diff changeset
35 override Statement syntaxCopy()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
36 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
37 DoStatement s = new DoStatement(loc, body_ ? body_.syntaxCopy() : null, condition.syntaxCopy());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
38 return s;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
39 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
40
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 63
diff changeset
41 override Statement semantic(Scope sc)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
42 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
43 sc.noctor++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
44 if (body_)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
45 body_ = body_.semanticScope(sc, this, this);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
46 sc.noctor--;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
47 condition = condition.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
48 condition = resolveProperties(sc, condition);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
49 condition = condition.optimize(WANTvalue);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
50
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
51 condition = condition.checkToBoolean();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
52
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
53 return this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
54 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
55
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 63
diff changeset
56 override bool hasBreak()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
57 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
58 return true;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
59 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
60
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 63
diff changeset
61 override bool hasContinue()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
62 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
63 return true;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
64 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
65
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 63
diff changeset
66 override bool usesEH()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
67 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
68 return body_ ? body_.usesEH() : false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
69 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
70
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 63
diff changeset
71 override BE blockExit()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
72 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
73 BE result;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
74
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
75 if (body_)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
76 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
77 result = body_.blockExit();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
78 if (result == BE.BEbreak)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
79 return BE.BEfallthru;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
80 if (result & BE.BEcontinue)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
81 result |= BE.BEfallthru;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
82 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
83 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
84 result = BE.BEfallthru;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
85
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
86 if (result & BE.BEfallthru)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
87 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
88 if (condition.canThrow())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
89 result |= BE.BEthrow;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
90 if (!(result & BE.BEbreak) && condition.isBool(true))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
91 result &= ~BE.BEfallthru;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
92 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
93 result &= ~(BE.BEbreak | BE.BEcontinue);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
94
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
95 return result;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
96 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
97
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 63
diff changeset
98 override bool comeFrom()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
99 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
100 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
101 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
102
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 63
diff changeset
103 override Expression interpret(InterState istate)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
104 {
155
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
105 version(LOG)
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
106 writef("DoStatement::interpret()\n");
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
107
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
108 if (istate.start == this)
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
109 istate.start = null;
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
110 Expression e;
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
111
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
112 if (istate.start)
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
113 {
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
114 e = body_ ? body_.interpret(istate) : null;
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
115 if (istate.start)
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
116 return null;
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
117 if (e is EXP_CANT_INTERPRET)
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
118 return e;
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
119 if (e is EXP_BREAK_INTERPRET)
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
120 return null;
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
121 if (e is EXP_CONTINUE_INTERPRET)
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
122 goto Lcontinue;
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
123 if (e)
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
124 return e;
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
125 }
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
126
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
127 while (1)
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
128 {
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
129 e = body_ ? body_.interpret(istate) : null;
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
130 if (e is EXP_CANT_INTERPRET)
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
131 break;
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
132 if (e is EXP_BREAK_INTERPRET)
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
133 {
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
134 e = null;
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
135 break;
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
136 }
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
137 if (e && e !is EXP_CONTINUE_INTERPRET)
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
138 break;
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
139
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
140 Lcontinue:
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
141 e = condition.interpret(istate);
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
142 if (e is EXP_CANT_INTERPRET)
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
143 break;
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
144 if (!e.isConst())
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
145 {
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
146 e = EXP_CANT_INTERPRET;
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
147 break;
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
148 }
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
149 if (e.isBool(true))
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
150 {
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
151 }
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
152 else if (e.isBool(false))
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
153 {
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
154 e = null;
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
155 break;
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
156 }
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
157 else
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
158 assert(0);
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
159 }
a43c65469219 + Statement.interpret()
trass3r
parents: 114
diff changeset
160 return e;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
161 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
162
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 63
diff changeset
163 override void toCBuffer(OutBuffer buf, HdrGenState* hgs)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
164 {
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 155
diff changeset
165 buf.writestring("do");
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 155
diff changeset
166 buf.writenl();
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 155
diff changeset
167 if (body_)
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 155
diff changeset
168 body_.toCBuffer(buf, hgs);
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 155
diff changeset
169 buf.writestring("while (");
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 155
diff changeset
170 condition.toCBuffer(buf, hgs);
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 155
diff changeset
171 buf.writebyte(')');
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
172 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
173
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 63
diff changeset
174 override Statement inlineScan(InlineScanState* iss)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
175 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
176 body_ = body_ ? body_.inlineScan(iss) : null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
177 condition = condition.inlineScan(iss);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
178 return this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
179 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
180
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 63
diff changeset
181 override void toIR(IRState* irs)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
182 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
183 Blockx *blx = irs.blx;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
184
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
185 IRState mystate = IRState(irs,this);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
186 mystate.breakBlock = block_calloc(blx);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
187 mystate.contBlock = block_calloc(blx);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
188
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
189 block* bpre = blx.curblock;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
190 block_next(blx, BCgoto, null);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
191 list_append(&bpre.Bsucc, blx.curblock);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
192
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
193 list_append(&mystate.contBlock.Bsucc, blx.curblock);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
194 list_append(&mystate.contBlock.Bsucc, mystate.breakBlock);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
195
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
196 if (body_)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
197 body_.toIR(&mystate);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
198 list_append(&blx.curblock.Bsucc, mystate.contBlock);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
199
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
200 block_next(blx, BCgoto, mystate.contBlock);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
201 incUsage(irs, condition.loc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
202 block_appendexp(mystate.contBlock, condition.toElem(&mystate));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
203 block_next(blx, BCiftrue, mystate.breakBlock);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
204 }
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 63
diff changeset
205 }