Chromium Code Reviews| Index: frog/leg/ssa/nodes.dart |
| diff --git a/frog/leg/ssa/nodes.dart b/frog/leg/ssa/nodes.dart |
| index 0d7b4f125531863bd126db9ae7059388157619cf..0f7a144aa028939606ce04e4d9d55d334db0b521 100644 |
| --- a/frog/leg/ssa/nodes.dart |
| +++ b/frog/leg/ssa/nodes.dart |
| @@ -11,6 +11,7 @@ interface HVisitor<R> { |
| R visitBitXor(HBitXor node); |
| R visitBoolify(HBoolify node); |
| R visitBoundsCheck(HBoundsCheck node); |
| + R visitBreak(HBreak node); |
| R visitDivide(HDivide node); |
| R visitEquals(HEquals node); |
| R visitExit(HExit node); |
| @@ -135,9 +136,9 @@ class HGraph { |
| return result; |
| } |
| - HBasicBlock addNewLoopHeaderBlock() { |
| + HBasicBlock addNewLoopHeaderBlock(List<SourceString> labels) { |
| HBasicBlock result = addNewBlock(); |
| - result.loopInformation = new HLoopInformation(result); |
| + result.loopInformation = new HLoopInformation(result, labels); |
| return result; |
| } |
| @@ -207,6 +208,7 @@ class HBaseVisitor extends HGraphVisitor implements HVisitor { |
| visitBailoutTarget(HBailoutTarget node) => visitInstruction(node); |
| visitBoolify(HBoolify node) => visitInstruction(node); |
| visitBoundsCheck(HBoundsCheck node) => visitCheck(node); |
| + visitBreak(HBreak node) => visitGoto(node); |
| visitCheck(HCheck node) => visitInstruction(node); |
| visitDivide(HDivide node) => visitBinaryArithmetic(node); |
| visitEquals(HEquals node) => visitRelational(node); |
| @@ -349,7 +351,7 @@ class HBasicBlock extends HInstructionList { |
| HInstructionList phis; |
| - HLoopInformation loopInformation = null; |
| + HBlockInformation blockInformation = null; |
|
Lasse Reichstein Nielsen
2012/02/20 13:56:16
I store both loop information and labeled block in
floitsch
2012/02/20 19:01:54
I would prefer two fields. This way we could get r
Lasse Reichstein Nielsen
2012/02/21 13:53:56
Done.
|
| HBasicBlock parentLoopHeader = null; |
| List<HBailoutTarget> bailouts; |
| @@ -359,6 +361,11 @@ class HBasicBlock extends HInstructionList { |
| HBasicBlock dominator = null; |
| final List<HBasicBlock> dominatedBlocks; |
| + // For recognizing labeled statements. |
| + List<SourceString> labels; |
| + |
| + bool isBlockEnd; |
| + |
| HBasicBlock() : this.withId(null); |
| HBasicBlock.withId(this.id) |
| : phis = new HInstructionList(), |
| @@ -371,9 +378,35 @@ class HBasicBlock extends HInstructionList { |
| bool isOpen() => status == STATUS_OPEN; |
| bool isClosed() => status == STATUS_CLOSED; |
| - bool isLoopHeader() => loopInformation !== null; |
| + bool isLoopHeader() => blockInformation is HLoopInformation; |
| + bool hasLabeledBlockInformation() => |
| + blockInformation is HLabeledBlockInformation; |
| bool hasBailouts() => !bailouts.isEmpty(); |
| + void set loopInformation(HLoopInformation info) { |
| + assert(this.blockInformation === null); |
| + blockInformation = info; |
| + } |
| + |
| + void set labeledBlockInformation(HLabeledBlockInformation info) { |
| + assert(this.blockInformation === null); |
| + blockInformation = info; |
| + } |
| + |
| + HLoopInformation get loopInformation() { |
| + if (blockInformation is HLoopInformation) { |
| + return blockInformation; |
| + } |
| + return null; |
| + } |
| + |
| + HLabeledBlockInformation get labeledBlockInformation() { |
| + if (blockInformation is HLabeledBlockInformation) { |
| + return blockInformation; |
| + } |
| + return null; |
| + } |
| + |
| void open() { |
| assert(isNew()); |
| status = STATUS_OPEN; |
| @@ -583,12 +616,24 @@ class HBasicBlock extends HInstructionList { |
| } |
| } |
| -class HLoopInformation { |
| +class HBlockInformation { |
| + // Just a marker class. |
| +} |
| + |
| +class HLabeledBlockInformation extends HBlockInformation { |
| + final HBasicBlock start; |
| + final HBasicBlock end; |
| + final List<SourceString> labels; |
| + HLabeledBlockInformation(this.start, this.end, this.labels); |
| +} |
| + |
| +class HLoopInformation extends HBlockInformation { |
| final HBasicBlock header; |
| final List<HBasicBlock> blocks; |
| final List<HBasicBlock> backEdges; |
| + final List<SourceString> labels; |
| - HLoopInformation(this.header) |
| + HLoopInformation(this.header, this.labels) |
| : blocks = new List<HBasicBlock>(), |
| backEdges = new List<HBasicBlock>(); |
| @@ -1634,6 +1679,13 @@ class HGoto extends HControlFlow { |
| accept(HVisitor visitor) => visitor.visitGoto(this); |
| } |
| +class HBreak extends HGoto { |
| + final SourceString label; |
| + HBreak([this.label]); |
| + toString() => 'break'; |
| + accept(HVisitor visitor) => visitor.visitBreak(this); |
| +} |
| + |
| class HTry extends HControlFlow { |
| HParameterValue exception; |
| HBasicBlock finallyBlock; |