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);