Mercurial > projects > ddmd
diff dmd/CaseRangeStatement.d @ 64:4290d870944a
More fixes
author | korDen |
---|---|
date | Mon, 23 Aug 2010 20:29:15 +0400 |
parents | b7d29f613539 |
children | 2e2a5c3f943a |
line wrap: on
line diff
--- a/dmd/CaseRangeStatement.d Mon Aug 23 16:52:24 2010 +0400 +++ b/dmd/CaseRangeStatement.d Mon Aug 23 20:29:15 2010 +0400 @@ -1,10 +1,17 @@ module dmd.CaseRangeStatement; import dmd.Statement; +import dmd.ArrayTypes; import dmd.Expression; +import dmd.ExpStatement; +import dmd.IntegerExp; +import dmd.CaseStatement; +import dmd.CompoundStatement; import dmd.Statement; import dmd.Loc; import dmd.OutBuffer; +import dmd.WANT; +import dmd.SwitchStatement; import dmd.HdrGenState; import dmd.Scope; @@ -29,11 +36,60 @@ Statement semantic(Scope sc) { - assert(false); + SwitchStatement sw = sc.sw; + + //printf("CaseRangeStatement.semantic() %s\n", toChars()); + if (sw.isFinal) + error("case ranges not allowed in final switch"); + + first = first.semantic(sc); + first = first.implicitCastTo(sc, sw.condition.type); + first = first.optimize(WANTvalue | WANTinterpret); + long fval = first.toInteger(); + + last = last.semantic(sc); + last = last.implicitCastTo(sc, sw.condition.type); + last = last.optimize(WANTvalue | WANTinterpret); + long lval = last.toInteger(); + + if (lval - fval > 256) + { + error("more than 256 cases in case range"); + lval = fval + 256; + } + + /* This works by replacing the CaseRange with an array of Case's. + * + * case a: .. case b: s; + * => + * case a: + * [...] + * case b: + * s; + */ + + Statements statements = new Statements(); + for (long i = fval; i <= lval; i++) + { + Statement s = statement; + if (i != lval) + s = new ExpStatement(loc, null); + Expression e = new IntegerExp(loc, i, first.type); + Statement cs = new CaseStatement(loc, e, s); + statements.push(cast(void*)cs); + } + Statement s = new CompoundStatement(loc, statements); + s = s.semantic(sc); + return s; } void toCBuffer(OutBuffer buf, HdrGenState* hgs) { - assert(false); + buf.writestring("case "); + first.toCBuffer(buf, hgs); + buf.writestring(": .. case "); + last.toCBuffer(buf, hgs); + buf.writenl(); + statement.toCBuffer(buf, hgs); } } \ No newline at end of file