Index: pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart |
diff --git a/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart b/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart |
index 78e70fbd60f7c44542eb7a2db2adc6852338a550..2a25e1a900fa33e0d59125249bf0b4e6e4696465 100644 |
--- a/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart |
+++ b/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart |
@@ -229,6 +229,51 @@ class KernelAstAdapter extends KernelToElementMapMixin |
return getElement(variable) as LocalElement; |
} |
+ @override |
+ JumpTarget getJumpTargetForBreak(ir.BreakStatement node) { |
+ return getJumpTarget(node.target); |
+ } |
+ |
+ @override |
+ JumpTarget getJumpTargetForLabel(ir.LabeledStatement node) { |
+ return getJumpTarget(node); |
+ } |
+ |
+ @override |
+ JumpTarget getJumpTargetForSwitch(ir.SwitchStatement node) { |
+ return getJumpTarget(node); |
+ } |
+ |
+ @override |
+ JumpTarget getJumpTargetForContinueSwitch(ir.ContinueSwitchStatement node) { |
+ return getJumpTarget(node.target); |
+ } |
+ |
+ @override |
+ JumpTarget getJumpTargetForSwitchCase(ir.SwitchCase node) { |
+ return getJumpTarget(node, isContinueTarget: true); |
+ } |
+ |
+ @override |
+ JumpTarget getJumpTargetForDo(ir.DoStatement node) { |
+ return getJumpTarget(node); |
+ } |
+ |
+ @override |
+ JumpTarget getJumpTargetForFor(ir.ForStatement node) { |
+ return getJumpTarget(node); |
+ } |
+ |
+ @override |
+ JumpTarget getJumpTargetForForIn(ir.ForInStatement node) { |
+ return getJumpTarget(node); |
+ } |
+ |
+ @override |
+ JumpTarget getJumpTargetForWhile(ir.WhileStatement node) { |
+ return getJumpTarget(node); |
+ } |
+ |
KernelJumpTarget getJumpTarget(ir.TreeNode node, |
{bool isContinueTarget: false}) { |
return _jumpTargets.putIfAbsent(node, () { |
@@ -386,7 +431,7 @@ class DartTypeConverter extends ir.DartTypeVisitor<ResolutionDartType> { |
} |
} |
-class KernelJumpTarget extends JumpTarget<ast.Node> { |
+class KernelJumpTarget implements JumpTargetX { |
static int index = 0; |
/// Pointer to the actual executable statements that a jump target refers to. |
@@ -450,9 +495,13 @@ class KernelJumpTarget extends JumpTarget<ast.Node> { |
} |
@override |
- LabelDefinition<ast.Node> addLabel(ast.Label label, String labelName) { |
- LabelDefinition result = new LabelDefinitionX(label, labelName, this); |
+ LabelDefinition<ast.Node> addLabel(ast.Label label, String labelName, |
+ {bool isBreakTarget: false}) { |
+ LabelDefinitionX result = new LabelDefinitionX(label, labelName, this); |
labels.add(result); |
+ if (isBreakTarget) { |
+ result.setBreakTarget(); |
+ } |
return result; |
} |
@@ -494,7 +543,7 @@ class KernelSwitchCaseJumpHandler extends SwitchCaseJumpHandler { |
int switchIndex = 1; |
for (ir.SwitchCase switchCase in switchStatement.cases) { |
JumpTarget continueTarget = |
- localsMap.getJumpTarget(switchCase, isContinueTarget: true); |
+ localsMap.getJumpTargetForSwitchCase(switchCase); |
assert(continueTarget is KernelJumpTarget); |
targetIndexMap[continueTarget] = switchIndex; |
assert(builder.jumpTargets[continueTarget] == null); |