| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 } |
| OLD | NEW |