Mercurial > projects > ddmd
comparison dmd/SwitchStatement.d @ 162:438eaa11eed4
updated build script to use dmd2.039
some missing methods implemented
author | korDen |
---|---|
date | Tue, 21 Sep 2010 14:59:56 +0400 |
parents | af1bebfd96a4 |
children | af724d3510d7 |
comparison
equal
deleted
inserted
replaced
161:584dc990e12f | 162:438eaa11eed4 |
---|---|
1 module dmd.SwitchStatement; | 1 module dmd.SwitchStatement; |
2 | 2 |
3 import dmd.common; | 3 import dmd.common; |
4 import dmd.Statement; | 4 import dmd.Statement; |
5 import dmd.Expression; | 5 import dmd.Expression; |
6 import dmd.GlobalExpressions; | |
6 import dmd.DefaultStatement; | 7 import dmd.DefaultStatement; |
7 import dmd.TryFinallyStatement; | 8 import dmd.TryFinallyStatement; |
8 import dmd.Array; | 9 import dmd.Array; |
9 import dmd.Loc; | 10 import dmd.Loc; |
10 import dmd.Scope; | 11 import dmd.Scope; |
31 import dmd.Dsymbol; | 32 import dmd.Dsymbol; |
32 import dmd.EnumMember; | 33 import dmd.EnumMember; |
33 import dmd.TypeTypedef; | 34 import dmd.TypeTypedef; |
34 import dmd.TOK; | 35 import dmd.TOK; |
35 import dmd.StringExp; | 36 import dmd.StringExp; |
37 import dmd.expression.Equal; | |
36 | 38 |
37 import dmd.backend.Util; | 39 import dmd.backend.Util; |
38 import dmd.backend.block; | 40 import dmd.backend.block; |
39 import dmd.backend.Blockx; | 41 import dmd.backend.Blockx; |
40 import dmd.backend.elem; | 42 import dmd.backend.elem; |
243 return result; | 245 return result; |
244 } | 246 } |
245 | 247 |
246 override Expression interpret(InterState istate) | 248 override Expression interpret(InterState istate) |
247 { | 249 { |
248 assert(false); | 250 version (LOG) { |
251 printf("SwitchStatement.interpret()\n"); | |
252 } | |
253 if (istate.start == this) | |
254 istate.start = null; | |
255 Expression e = null; | |
256 | |
257 if (istate.start) | |
258 { | |
259 e = body_ ? body_.interpret(istate) : null; | |
260 if (istate.start) | |
261 return null; | |
262 if (e is EXP_CANT_INTERPRET) | |
263 return e; | |
264 if (e is EXP_BREAK_INTERPRET) | |
265 return null; | |
266 return e; | |
267 } | |
268 | |
269 | |
270 Expression econdition = condition.interpret(istate); | |
271 if (econdition is EXP_CANT_INTERPRET) | |
272 return EXP_CANT_INTERPRET; | |
273 | |
274 Statement s = null; | |
275 if (cases) | |
276 { | |
277 for (size_t i = 0; i < cases.dim; i++) | |
278 { | |
279 CaseStatement cs = cast(CaseStatement)cases.data[i]; | |
280 e = Equal(TOKequal, Type.tint32, econdition, cs.exp); | |
281 if (e is EXP_CANT_INTERPRET) | |
282 return EXP_CANT_INTERPRET; | |
283 if (e.isBool(true)) | |
284 { | |
285 s = cs; | |
286 break; | |
287 } | |
288 } | |
289 } | |
290 if (!s) | |
291 { | |
292 if (hasNoDefault) | |
293 error("no default or case for %s in switch statement", econdition.toChars()); | |
294 s = sdefault; | |
295 } | |
296 | |
297 assert(s); | |
298 istate.start = s; | |
299 e = body_ ? body_.interpret(istate) : null; | |
300 assert(!istate.start); | |
301 if (e is EXP_BREAK_INTERPRET) | |
302 return null; | |
303 return e; | |
249 } | 304 } |
250 | 305 |
251 override void toCBuffer(OutBuffer buf, HdrGenState* hgs) | 306 override void toCBuffer(OutBuffer buf, HdrGenState* hgs) |
252 { | 307 { |
253 assert(false); | 308 assert(false); |