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

Unified Diff: pkg/compiler/lib/src/js_model/locals.dart

Issue 3009463002: Handle labelled continue statements (Closed)
Patch Set: Update comment Created 3 years, 4 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/elements/modelx.dart ('k') | pkg/compiler/lib/src/resolution/members.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/js_model/locals.dart
diff --git a/pkg/compiler/lib/src/js_model/locals.dart b/pkg/compiler/lib/src/js_model/locals.dart
index 5f1029f262b5aae6a05f93745133245b7b4a707c..d72ce2e6dec8df71eb0ca1c57afafd28c1bd17b9 100644
--- a/pkg/compiler/lib/src/js_model/locals.dart
+++ b/pkg/compiler/lib/src/js_model/locals.dart
@@ -217,8 +217,13 @@ class JumpVisitor extends ir.Visitor {
search = search.parent;
}
if (needsLabel) {
- target.addLabel(node.target, 'label${labelIndex++}',
- isBreakTarget: true);
+ if (target.labels.isEmpty) {
Siggi Cherem (dart-lang) 2017/08/25 00:38:50 nit: consider adding a helper function instead to
Johnni Winther 2017/08/25 07:11:51 Done.
+ target.addLabel(node.target, 'label${labelIndex++}',
+ isBreakTarget: true);
+ } else {
+ JLabelDefinition label = target.labels.single;
+ label.isBreakTarget = true;
+ }
}
} else if (_canBeContinueTarget(parent)) {
// We have code like
@@ -231,6 +236,24 @@ class JumpVisitor extends ir.Visitor {
target = _getJumpTarget(parent);
target.isContinueTarget = true;
breaksAsContinue.add(node);
+ ir.TreeNode search = node;
+ bool needsLabel = false;
+ while (search != node.target) {
+ if (_canBeContinueTarget(search)) {
+ needsLabel = search != body;
+ break;
+ }
+ search = search.parent;
+ }
+ if (needsLabel) {
+ if (target.labels.isEmpty) {
+ target.addLabel(node.target, 'label${labelIndex++}',
+ isContinueTarget: true);
+ } else {
+ JLabelDefinition label = target.labels.single;
+ label.isContinueTarget = true;
+ }
+ }
} else {
target = _getJumpTarget(node.target);
target.isBreakTarget = true;
@@ -244,23 +267,25 @@ class JJumpTarget extends JumpTarget<ir.Node> {
final MemberEntity memberContext;
final int nestingLevel;
List<LabelDefinition<ir.Node>> _labels;
+ final bool isSwitch;
+ final bool isSwitchCase;
- JJumpTarget(this.memberContext, this.nestingLevel);
+ JJumpTarget(this.memberContext, this.nestingLevel,
+ {this.isSwitch: false, this.isSwitchCase: false});
bool isBreakTarget = false;
bool isContinueTarget = false;
- bool isSwitch = false;
@override
Entity get executableContext => memberContext;
@override
LabelDefinition<ir.Node> addLabel(ir.Node label, String labelName,
- {bool isBreakTarget: false}) {
+ {bool isBreakTarget: false, bool isContinueTarget: false}) {
_labels ??= <LabelDefinition<ir.Node>>[];
LabelDefinition<ir.Node> labelDefinition = new JLabelDefinition(
- this, label, labelName,
- isBreakTarget: isBreakTarget);
+ this, labelName,
+ isBreakTarget: isBreakTarget, isContinueTarget: isContinueTarget);
_labels.add(labelDefinition);
return labelDefinition;
}
@@ -297,12 +322,11 @@ class JJumpTarget extends JumpTarget<ir.Node> {
class JLabelDefinition extends LabelDefinition<ir.Node> {
final JumpTarget<ir.Node> target;
- final ir.Node label;
final String labelName;
- final bool isBreakTarget;
- final bool isContinueTarget;
+ bool isBreakTarget;
+ bool isContinueTarget;
- JLabelDefinition(this.target, this.label, this.labelName,
+ JLabelDefinition(this.target, this.labelName,
{this.isBreakTarget: false, this.isContinueTarget: false});
@override
@@ -310,8 +334,6 @@ class JLabelDefinition extends LabelDefinition<ir.Node> {
String toString() {
StringBuffer sb = new StringBuffer();
sb.write('JLabelDefinition(');
- sb.write('label=');
- sb.write(label);
sb.write(',labelName=');
sb.write(labelName);
sb.write(',isBreakTarget=');
« no previous file with comments | « pkg/compiler/lib/src/elements/modelx.dart ('k') | pkg/compiler/lib/src/resolution/members.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698