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

Unified Diff: pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart

Issue 2644293004: Fix labeled break 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 | « pkg/compiler/lib/src/kernel/kernel_visitor.dart ('k') | tests/compiler/dart2js/kernel/loops_test.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 1337bd5ca8205227e77aa4a8ab5cf84534418142..545468d3c0d020befe78dc929e0f5fe2296b48eb 100644
--- a/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
+++ b/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
@@ -377,17 +377,16 @@ class KernelAstAdapter {
LibraryElement get jsHelperLibrary => _backend.helpers.jsHelperLibrary;
KernelJumpTarget getJumpTarget(ir.TreeNode node,
- {bool isContinueTarget: false}) =>
- _jumpTargets.putIfAbsent(node, () {
- if (node is ir.LabeledStatement &&
- _jumpTargets.containsKey((node as ir.LabeledStatement).body)) {
- return _jumpTargets[(node as ir.LabeledStatement).body];
- }
- return new KernelJumpTarget(node, makeContinueLabel: isContinueTarget);
- });
-
- LabelDefinition getTargetLabel(ir.Node node) =>
- elements.getTargetLabel(getNode(node));
+ {bool isContinueTarget: false}) {
+ return _jumpTargets.putIfAbsent(node, () {
+ if (node is ir.LabeledStatement &&
+ _jumpTargets.containsKey((node as ir.LabeledStatement).body)) {
+ return _jumpTargets[(node as ir.LabeledStatement).body];
+ }
+ return new KernelJumpTarget(node, this,
+ makeContinueLabel: isContinueTarget);
+ });
+ }
ir.Class get mapLiteralClass =>
kernel.classes[_backend.helpers.mapLiteralClass];
@@ -1006,15 +1005,31 @@ class KernelJumpTarget extends JumpTarget {
@override
bool isContinueTarget = false;
- KernelJumpTarget(this.targetStatement, {bool makeContinueLabel = false}) {
- labels = <LabelDefinition>[];
+ KernelJumpTarget(this.targetStatement, KernelAstAdapter adapter,
+ {bool makeContinueLabel = false}) {
originalStatement = targetStatement;
- if (targetStatement is ir.LabeledStatement) {
+ this.labels = <LabelDefinition>[];
+ if (targetStatement is ir.WhileStatement ||
+ targetStatement is ir.DoStatement ||
+ targetStatement is ir.ForStatement ||
+ targetStatement is ir.ForInStatement) {
+ // Currently these labels are set at resolution on the element itself.
+ // Once that gets updated, this logic can change downstream.
+ JumpTarget target = adapter.elements
+ .getTargetDefinition(adapter.getNode(targetStatement));
+ if (target != null) {
+ labels.addAll(target.labels);
+ isBreakTarget = target.isBreakTarget;
+ isContinueTarget = target.isContinueTarget;
+ }
+ } else if (targetStatement is ir.LabeledStatement) {
targetStatement = (targetStatement as ir.LabeledStatement).body;
labels.add(
new LabelDefinitionX(null, 'L${index++}', this)..setBreakTarget());
isBreakTarget = true;
- } else if (makeContinueLabel) {
+ }
+
+ if (makeContinueLabel) {
labels.add(
new LabelDefinitionX(null, 'L${index++}', this)..setContinueTarget());
isContinueTarget = true;
« no previous file with comments | « pkg/compiler/lib/src/kernel/kernel_visitor.dart ('k') | tests/compiler/dart2js/kernel/loops_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698