Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(160)

Unified Diff: pkg/compiler/lib/src/kernel/kernel_visitor.dart

Issue 2664513003: Fix Rasta to correctly identify added break targets in switch statements. (Closed)
Patch Set: Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/kernel/kernel_visitor.dart
diff --git a/pkg/compiler/lib/src/kernel/kernel_visitor.dart b/pkg/compiler/lib/src/kernel/kernel_visitor.dart
index 1bb66cc305e12d29a81ff1711c0df87bf576fbb8..5216b97d1aff5b97eb2646398b6bcead25870333 100644
--- a/pkg/compiler/lib/src/kernel/kernel_visitor.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_visitor.dart
@@ -400,12 +400,16 @@ class KernelVisitor extends Object
return continueSwitchTargets[target];
}
+ /// The optional positional parameter isBreakTarget can be added in cases
+ /// where a break statement was added but the element model and underlying
+ /// JumpTargets don't know about it.
ir.Statement buildBreakTarget(
- ir.Statement statement, Node node, JumpTarget jumpTarget) {
+ ir.Statement statement, Node node, JumpTarget jumpTarget,
+ [bool isBreakTarget]) {
assert(node.isValidBreakTarget());
assert(jumpTarget == elements.getTargetDefinition(node));
associateNode(statement, node);
- if (jumpTarget != null && jumpTarget.isBreakTarget) {
+ if (jumpTarget != null && (jumpTarget.isBreakTarget || isBreakTarget)) {
ir.LabeledStatement breakTarget = getBreakTarget(jumpTarget);
breakTarget.body = statement;
statement.parent = breakTarget;
@@ -1011,6 +1015,7 @@ class KernelVisitor extends Object
ir.Statement visitSwitchStatement(SwitchStatement node) {
ir.Expression expression = visitForValue(node.expression);
List<ir.SwitchCase> cases = <ir.SwitchCase>[];
+ bool switchIsBreakTarget = elements.getTargetDefinition(node).isBreakTarget;
for (SwitchCase caseNode in node.cases.nodes) {
cases.add(caseNode.accept(this));
JumpTarget jumpTarget = elements.getTargetDefinition(caseNode);
@@ -1043,6 +1048,10 @@ class KernelVisitor extends Object
if (!caseNode.isDefaultCase) {
statements.add(new ir.BreakStatement(
getBreakTarget(elements.getTargetDefinition(node))));
+ // Because we "helpfully" add a break here, in the underlying
+ // element model the jump target doesn't actually know it's a break
+ // target, so we have to pass that information.
+ switchIsBreakTarget = true;
}
} else {
statements.add(new ir.ExpressionStatement(new ir.Throw(
@@ -1058,7 +1067,7 @@ class KernelVisitor extends Object
assert(!casesIterator.moveNext());
return buildBreakTarget(new ir.SwitchStatement(expression, cases), node,
- elements.getTargetDefinition(node));
+ elements.getTargetDefinition(node), switchIsBreakTarget);
}
@override
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698