Mercurial > projects > ddmd
annotate dmd/CaseRangeStatement.d @ 168:ceed63f310fb
stringtable, stringbuffer and freelist moved to Global
author | korDen |
---|---|
date | Thu, 30 Sep 2010 12:57:13 +0400 |
parents | c77e9f4f1793 |
children | e3afd1303184 |
rev | line source |
---|---|
0 | 1 module dmd.CaseRangeStatement; |
2 | |
114 | 3 import dmd.common; |
0 | 4 import dmd.Statement; |
64 | 5 import dmd.ArrayTypes; |
0 | 6 import dmd.Expression; |
64 | 7 import dmd.ExpStatement; |
8 import dmd.IntegerExp; | |
9 import dmd.CaseStatement; | |
10 import dmd.CompoundStatement; | |
0 | 11 import dmd.Statement; |
12 import dmd.Loc; | |
13 import dmd.OutBuffer; | |
64 | 14 import dmd.WANT; |
15 import dmd.SwitchStatement; | |
0 | 16 import dmd.HdrGenState; |
17 import dmd.Scope; | |
18 | |
19 class CaseRangeStatement : Statement | |
20 { | |
21 Expression first; | |
22 Expression last; | |
23 Statement statement; | |
24 | |
25 this(Loc loc, Expression first, Expression last, Statement s) | |
26 { | |
27 super(loc); | |
51 | 28 this.first = first; |
29 this.last = last; | |
30 this.statement = s; | |
0 | 31 } |
32 | |
72 | 33 override Statement syntaxCopy() |
0 | 34 { |
35 assert(false); | |
36 } | |
37 | |
72 | 38 override Statement semantic(Scope sc) |
0 | 39 { |
64 | 40 SwitchStatement sw = sc.sw; |
41 | |
42 //printf("CaseRangeStatement.semantic() %s\n", toChars()); | |
43 if (sw.isFinal) | |
44 error("case ranges not allowed in final switch"); | |
45 | |
46 first = first.semantic(sc); | |
47 first = first.implicitCastTo(sc, sw.condition.type); | |
48 first = first.optimize(WANTvalue | WANTinterpret); | |
49 long fval = first.toInteger(); | |
50 | |
51 last = last.semantic(sc); | |
52 last = last.implicitCastTo(sc, sw.condition.type); | |
53 last = last.optimize(WANTvalue | WANTinterpret); | |
54 long lval = last.toInteger(); | |
55 | |
56 if (lval - fval > 256) | |
57 { | |
58 error("more than 256 cases in case range"); | |
59 lval = fval + 256; | |
60 } | |
61 | |
62 /* This works by replacing the CaseRange with an array of Case's. | |
63 * | |
64 * case a: .. case b: s; | |
65 * => | |
66 * case a: | |
67 * [...] | |
68 * case b: | |
69 * s; | |
70 */ | |
71 | |
72 Statements statements = new Statements(); | |
73 for (long i = fval; i <= lval; i++) | |
74 { | |
75 Statement s = statement; | |
76 if (i != lval) | |
77 s = new ExpStatement(loc, null); | |
78 Expression e = new IntegerExp(loc, i, first.type); | |
79 Statement cs = new CaseStatement(loc, e, s); | |
122
c77e9f4f1793
Statements -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents:
114
diff
changeset
|
80 statements.push(cs); |
64 | 81 } |
82 Statement s = new CompoundStatement(loc, statements); | |
83 s = s.semantic(sc); | |
84 return s; | |
0 | 85 } |
86 | |
72 | 87 override void toCBuffer(OutBuffer buf, HdrGenState* hgs) |
0 | 88 { |
64 | 89 buf.writestring("case "); |
90 first.toCBuffer(buf, hgs); | |
91 buf.writestring(": .. case "); | |
92 last.toCBuffer(buf, hgs); | |
93 buf.writenl(); | |
94 statement.toCBuffer(buf, hgs); | |
0 | 95 } |
72 | 96 } |