Mercurial > projects > ddmd
annotate dmd/GotoDefaultStatement.d @ 168:ceed63f310fb
stringtable, stringbuffer and freelist moved to Global
author | korDen |
---|---|
date | Thu, 30 Sep 2010 12:57:13 +0400 |
parents | e28b18c23469 |
children | e3afd1303184 |
rev | line source |
---|---|
0 | 1 module dmd.GotoDefaultStatement; |
2 | |
114 | 3 import dmd.common; |
0 | 4 import dmd.Statement; |
5 import dmd.SwitchStatement; | |
6 import dmd.Loc; | |
7 import dmd.Scope; | |
8 import dmd.Expression; | |
9 import dmd.InterState; | |
10 import dmd.OutBuffer; | |
11 import dmd.HdrGenState; | |
12 import dmd.IRState; | |
13 import dmd.BE; | |
14 | |
68
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
15 import dmd.backend.block; |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
16 import dmd.backend.Blockx; |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
17 import dmd.backend.Util; |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
18 import dmd.backend.BC; |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
19 |
0 | 20 class GotoDefaultStatement : Statement |
21 { | |
22 SwitchStatement sw; | |
23 | |
24 this(Loc loc) | |
25 { | |
26 super(loc); | |
51 | 27 sw = null; |
0 | 28 } |
29 | |
72 | 30 override Statement syntaxCopy() |
0 | 31 { |
64 | 32 GotoDefaultStatement s = new GotoDefaultStatement(loc); |
33 return s; | |
0 | 34 } |
35 | |
72 | 36 override Statement semantic(Scope sc) |
0 | 37 { |
64 | 38 sw = sc.sw; |
39 if (!sw) | |
40 error("goto default not in switch statement"); | |
41 return this; | |
0 | 42 } |
43 | |
72 | 44 override Expression interpret(InterState istate) |
0 | 45 { |
46 assert(false); | |
47 } | |
48 | |
72 | 49 override BE blockExit() |
0 | 50 { |
64 | 51 return BEgoto; |
0 | 52 } |
53 | |
72 | 54 override void toCBuffer(OutBuffer buf, HdrGenState* hgs) |
0 | 55 { |
64 | 56 buf.writestring("goto default;\n"); |
0 | 57 } |
58 | |
72 | 59 override void toIR(IRState *irs) |
0 | 60 { |
68
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
61 block *b; |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
62 Blockx *blx = irs.blx; |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
63 block *bdest = irs.getDefaultBlock(); |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
64 |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
65 b = blx.curblock; |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
66 |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
67 // The rest is equivalent to GotoStatement |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
68 |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
69 // Adjust exception handler scope index if in different try blocks |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
70 if (b.Btry != bdest.Btry) |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
71 { |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
72 // Check that bdest is in an enclosing try block |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
73 for (block* bt = b.Btry; bt != bdest.Btry; bt = bt.Btry) |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
74 { |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
75 if (!bt) |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
76 { |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
77 //printf("b.Btry = %p, bdest.Btry = %p\n", b.Btry, bdest.Btry); |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
78 error("cannot goto into try block"); |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
79 break; |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
80 } |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
81 } |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
82 |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
83 //setScopeIndex(blx, b, bdest.Btry ? bdest.Btry.Bscope_index : -1); |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
84 } |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
85 |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
86 list_append(&b.Bsucc,bdest); |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
87 incUsage(irs, loc); |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
88 block_next(blx,BCgoto,null); |
0 | 89 } |
72 | 90 } |