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

Unified Diff: pkg/compiler/lib/src/js_backend/codegen/codegen.dart

Issue 1575593002: dart2js cps: Name labels uniquely within each method, not globally. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Use putIfAbsent Created 4 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 | pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/js_backend/codegen/codegen.dart
diff --git a/pkg/compiler/lib/src/js_backend/codegen/codegen.dart b/pkg/compiler/lib/src/js_backend/codegen/codegen.dart
index 0da171bc16c40dc5937612a6ae902d981a5a06f6..ab412b2a604540d4e1f803e4c02afe88d5e42533 100644
--- a/pkg/compiler/lib/src/js_backend/codegen/codegen.dart
+++ b/pkg/compiler/lib/src/js_backend/codegen/codegen.dart
@@ -81,7 +81,7 @@ class CodeGenerator extends tree_ir.StatementVisitor
/// [Unreachable] statements whether they may use fallthrough or not.
List<bool> emitUnreachableAsReturn = <bool>[false];
- Set<tree_ir.Label> usedLabels = new Set<tree_ir.Label>();
+ final Map<tree_ir.Label, String> labelNames = <tree_ir.Label, String>{};
List<js.Statement> accumulator = new List<js.Statement>();
@@ -581,8 +581,7 @@ class CodeGenerator extends tree_ir.StatementVisitor
shortContinue.use();
accumulator.add(new js.Continue(null));
} else {
- usedLabels.add(node.target);
- accumulator.add(new js.Continue(node.target.name));
+ accumulator.add(new js.Continue(makeLabel(node.target)));
}
}
@@ -614,8 +613,7 @@ class CodeGenerator extends tree_ir.StatementVisitor
shortContinue.use();
accumulator.add(new js.Continue(null));
} else {
- usedLabels.add(node.target);
- accumulator.add(new js.Break(node.target.name));
+ accumulator.add(new js.Break(makeLabel(node.target)));
}
}
@@ -670,13 +668,18 @@ class CodeGenerator extends tree_ir.StatementVisitor
visitStatement(node.next);
}
+ /// Creates a name for [label] if it does not already have one.
+ ///
+ /// This also marks the label as being used.
+ String makeLabel(tree_ir.Label label) {
+ return labelNames.putIfAbsent(label, () => 'L${labelNames.length}');
+ }
+
/// Wraps a node in a labeled statement unless the label is unused.
js.Statement insertLabel(tree_ir.Label label, js.Statement node) {
- if (usedLabels.remove(label)) {
- return new js.LabeledStatement(label.name, node);
- } else {
- return node;
- }
+ String name = labelNames[label];
+ if (name == null) return node; // Label is unused.
+ return new js.LabeledStatement(name, node);
}
/// Returns the current [accumulator] wrapped in a block if neccessary.
« no previous file with comments | « no previous file | pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698