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

Side by Side Diff: pkg/compiler/lib/src/js_model/locals.dart

Issue 3007783004: Handle switch continue (Closed)
Patch Set: Updated cf. comment Created 3 years, 3 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 unified diff | Download patch
« no previous file with comments | « no previous file | pkg/compiler/lib/src/ssa/jump_handler.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library dart2js.js_model.locals; 5 library dart2js.js_model.locals;
6 6
7 import 'package:kernel/ast.dart' as ir; 7 import 'package:kernel/ast.dart' as ir;
8 8
9 import '../closure.dart'; 9 import '../closure.dart';
10 import '../common.dart'; 10 import '../common.dart';
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 } 81 }
82 82
83 @override 83 @override
84 bool generateContinueForBreak(ir.BreakStatement node) { 84 bool generateContinueForBreak(ir.BreakStatement node) {
85 return _breaksAsContinue.contains(node); 85 return _breaksAsContinue.contains(node);
86 } 86 }
87 87
88 @override 88 @override
89 JumpTarget getJumpTargetForContinueSwitch(ir.ContinueSwitchStatement node) { 89 JumpTarget getJumpTargetForContinueSwitch(ir.ContinueSwitchStatement node) {
90 _ensureJumpMap(node.target); 90 _ensureJumpMap(node.target);
91 throw new UnimplementedError( 91 JumpTarget target = _jumpTargetMap[node];
92 'KernelToLocalsMapImpl.getJumpTargetForContinueSwitch'); 92 assert(target != null, failedAt(currentMember, 'No target for $node.'));
93 return target;
93 } 94 }
94 95
95 @override 96 @override
96 JumpTarget getJumpTargetForSwitchCase(ir.SwitchCase node) { 97 JumpTarget getJumpTargetForSwitchCase(ir.SwitchCase node) {
97 _ensureJumpMap(node); 98 _ensureJumpMap(node);
98 throw new UnimplementedError( 99 return _jumpTargetMap[node];
99 'KernelToLocalsMapImpl.getJumpTargetForSwitchCase');
100 } 100 }
101 101
102 @override 102 @override
103 JumpTarget getJumpTargetForDo(ir.DoStatement node) { 103 JumpTarget getJumpTargetForDo(ir.DoStatement node) {
104 _ensureJumpMap(node); 104 _ensureJumpMap(node);
105 return _jumpTargetMap[node]; 105 return _jumpTargetMap[node];
106 } 106 }
107 107
108 @override 108 @override
109 JumpTarget getJumpTargetForLabel(ir.LabeledStatement node) { 109 JumpTarget getJumpTargetForLabel(ir.LabeledStatement node) {
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
176 int labelIndex = 0; 176 int labelIndex = 0;
177 final MemberEntity member; 177 final MemberEntity member;
178 final Map<ir.TreeNode, JJumpTarget> jumpTargetMap = 178 final Map<ir.TreeNode, JJumpTarget> jumpTargetMap =
179 <ir.TreeNode, JJumpTarget>{}; 179 <ir.TreeNode, JJumpTarget>{};
180 final Set<ir.BreakStatement> breaksAsContinue = new Set<ir.BreakStatement>(); 180 final Set<ir.BreakStatement> breaksAsContinue = new Set<ir.BreakStatement>();
181 181
182 JumpVisitor(this.member); 182 JumpVisitor(this.member);
183 183
184 JJumpTarget _getJumpTarget(ir.TreeNode node) { 184 JJumpTarget _getJumpTarget(ir.TreeNode node) {
185 return jumpTargetMap.putIfAbsent(node, () { 185 return jumpTargetMap.putIfAbsent(node, () {
186 return new JJumpTarget(member, jumpIndex++); 186 return new JJumpTarget(member, jumpIndex++,
187 isSwitch: node is ir.SwitchStatement,
188 isSwitchCase: node is ir.SwitchCase);
187 }); 189 });
188 } 190 }
189 191
190 JLabelDefinition _getOrCreateLabel(JJumpTarget target, ir.Node node) { 192 JLabelDefinition _getOrCreateLabel(JJumpTarget target, ir.Node node) {
191 if (target.labels.isEmpty) { 193 if (target.labels.isEmpty) {
192 return target.addLabel(node, 'label${labelIndex++}'); 194 return target.addLabel(node, 'label${labelIndex++}');
193 } else { 195 } else {
194 return target.labels.single; 196 return target.labels.single;
195 } 197 }
196 } 198 }
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
268 JLabelDefinition label = _getOrCreateLabel(target, node.target); 270 JLabelDefinition label = _getOrCreateLabel(target, node.target);
269 label.isContinueTarget = true; 271 label.isContinueTarget = true;
270 } 272 }
271 } else { 273 } else {
272 target = _getJumpTarget(node.target); 274 target = _getJumpTarget(node.target);
273 target.isBreakTarget = true; 275 target.isBreakTarget = true;
274 } 276 }
275 jumpTargetMap[node] = target; 277 jumpTargetMap[node] = target;
276 super.visitBreakStatement(node); 278 super.visitBreakStatement(node);
277 } 279 }
280
281 @override
282 visitContinueSwitchStatement(ir.ContinueSwitchStatement node) {
283 JJumpTarget target = _getJumpTarget(node.target);
284 target.isContinueTarget = true;
285 jumpTargetMap[node] = target;
286 JLabelDefinition label = _getOrCreateLabel(target, node.target);
287 label.isContinueTarget = true;
288 super.visitContinueSwitchStatement(node);
289 }
278 } 290 }
279 291
280 class JJumpTarget extends JumpTarget<ir.Node> { 292 class JJumpTarget extends JumpTarget<ir.Node> {
281 final MemberEntity memberContext; 293 final MemberEntity memberContext;
282 final int nestingLevel; 294 final int nestingLevel;
283 List<LabelDefinition<ir.Node>> _labels; 295 List<LabelDefinition<ir.Node>> _labels;
284 final bool isSwitch; 296 final bool isSwitch;
285 final bool isSwitchCase; 297 final bool isSwitchCase;
286 298
287 JJumpTarget(this.memberContext, this.nestingLevel, 299 JJumpTarget(this.memberContext, this.nestingLevel,
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
391 class JParameter extends JLocal { 403 class JParameter extends JLocal {
392 final int parameterIndex; 404 final int parameterIndex;
393 405
394 JParameter(this.parameterIndex, String name, MemberEntity memberContext) 406 JParameter(this.parameterIndex, String name, MemberEntity memberContext)
395 : super(name, memberContext); 407 : super(name, memberContext);
396 408
397 bool get isRegularParameter => true; 409 bool get isRegularParameter => true;
398 410
399 String get _kind => 'parameter'; 411 String get _kind => 'parameter';
400 } 412 }
OLDNEW
« no previous file with comments | « no previous file | pkg/compiler/lib/src/ssa/jump_handler.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698