Mercurial > projects > ddmd
annotate dmd/GotoDefaultStatement.d @ 178:e3afd1303184
Many small bugs fixed
Made all classes derive from TObject to detect memory leaks (functionality is disabled for now)
Began work on overriding backend memory allocations (to avoid memory leaks)
author | korDen |
---|---|
date | Sun, 17 Oct 2010 07:42:00 +0400 |
parents | e28b18c23469 |
children | b0d41ff5e0df |
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 { | |
178 | 26 register(); |
0 | 27 super(loc); |
51 | 28 sw = null; |
0 | 29 } |
30 | |
72 | 31 override Statement syntaxCopy() |
0 | 32 { |
64 | 33 GotoDefaultStatement s = new GotoDefaultStatement(loc); |
34 return s; | |
0 | 35 } |
36 | |
72 | 37 override Statement semantic(Scope sc) |
0 | 38 { |
64 | 39 sw = sc.sw; |
40 if (!sw) | |
41 error("goto default not in switch statement"); | |
42 return this; | |
0 | 43 } |
44 | |
72 | 45 override Expression interpret(InterState istate) |
0 | 46 { |
47 assert(false); | |
48 } | |
49 | |
72 | 50 override BE blockExit() |
0 | 51 { |
64 | 52 return BEgoto; |
0 | 53 } |
54 | |
72 | 55 override void toCBuffer(OutBuffer buf, HdrGenState* hgs) |
0 | 56 { |
64 | 57 buf.writestring("goto default;\n"); |
0 | 58 } |
59 | |
72 | 60 override void toIR(IRState *irs) |
0 | 61 { |
68
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
62 block *b; |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
63 Blockx *blx = irs.blx; |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
64 block *bdest = irs.getDefaultBlock(); |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
65 |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
66 b = blx.curblock; |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
67 |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
68 // The rest is equivalent to GotoStatement |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
69 |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
70 // Adjust exception handler scope index if in different try blocks |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
71 if (b.Btry != bdest.Btry) |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
72 { |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
73 // Check that bdest is in an enclosing try block |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
74 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
|
75 { |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
76 if (!bt) |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
77 { |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
78 //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
|
79 error("cannot goto into try block"); |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
80 break; |
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 |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
84 //setScopeIndex(blx, b, bdest.Btry ? bdest.Btry.Bscope_index : -1); |
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 |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
87 list_append(&b.Bsucc,bdest); |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
88 incUsage(irs, loc); |
ee3a9f34dc48
final bits of codegen implementation to compile Phobos
korDen
parents:
64
diff
changeset
|
89 block_next(blx,BCgoto,null); |
0 | 90 } |
72 | 91 } |