| OLD | NEW |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 import 'package:js_runtime/shared/embedded_names.dart'; | 5 import 'package:js_runtime/shared/embedded_names.dart'; |
| 6 import 'package:kernel/ast.dart' as ir; | 6 import 'package:kernel/ast.dart' as ir; |
| 7 | 7 |
| 8 import '../common.dart'; | 8 import '../common.dart'; |
| 9 import '../common/names.dart'; | 9 import '../common/names.dart'; |
| 10 import '../compiler.dart'; | 10 import '../compiler.dart'; |
| (...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 370 if (member is ir.Field) { | 370 if (member is ir.Field) { |
| 371 FieldElement field = _nodeToElement[member]; | 371 FieldElement field = _nodeToElement[member]; |
| 372 return field.constant == null; | 372 return field.constant == null; |
| 373 } | 373 } |
| 374 return false; | 374 return false; |
| 375 } | 375 } |
| 376 | 376 |
| 377 LibraryElement get jsHelperLibrary => _backend.helpers.jsHelperLibrary; | 377 LibraryElement get jsHelperLibrary => _backend.helpers.jsHelperLibrary; |
| 378 | 378 |
| 379 KernelJumpTarget getJumpTarget(ir.TreeNode node, | 379 KernelJumpTarget getJumpTarget(ir.TreeNode node, |
| 380 {bool isContinueTarget: false}) => | 380 {bool isContinueTarget: false}) { |
| 381 _jumpTargets.putIfAbsent(node, () { | 381 return _jumpTargets.putIfAbsent(node, () { |
| 382 if (node is ir.LabeledStatement && | 382 if (node is ir.LabeledStatement && |
| 383 _jumpTargets.containsKey((node as ir.LabeledStatement).body)) { | 383 _jumpTargets.containsKey((node as ir.LabeledStatement).body)) { |
| 384 return _jumpTargets[(node as ir.LabeledStatement).body]; | 384 return _jumpTargets[(node as ir.LabeledStatement).body]; |
| 385 } | 385 } |
| 386 return new KernelJumpTarget(node, makeContinueLabel: isContinueTarget); | 386 return new KernelJumpTarget(node, this, |
| 387 }); | 387 makeContinueLabel: isContinueTarget); |
| 388 | 388 }); |
| 389 LabelDefinition getTargetLabel(ir.Node node) => | 389 } |
| 390 elements.getTargetLabel(getNode(node)); | |
| 391 | 390 |
| 392 ir.Class get mapLiteralClass => | 391 ir.Class get mapLiteralClass => |
| 393 kernel.classes[_backend.helpers.mapLiteralClass]; | 392 kernel.classes[_backend.helpers.mapLiteralClass]; |
| 394 | 393 |
| 395 ir.Procedure get mapLiteralConstructor => | 394 ir.Procedure get mapLiteralConstructor => |
| 396 kernel.functions[_backend.helpers.mapLiteralConstructor]; | 395 kernel.functions[_backend.helpers.mapLiteralConstructor]; |
| 397 | 396 |
| 398 ir.Procedure get mapLiteralConstructorEmpty => | 397 ir.Procedure get mapLiteralConstructorEmpty => |
| 399 kernel.functions[_backend.helpers.mapLiteralConstructorEmpty]; | 398 kernel.functions[_backend.helpers.mapLiteralConstructorEmpty]; |
| 400 | 399 |
| (...skipping 598 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 999 /// If this jump target was not initially constructed with a LabeledStatement, | 998 /// If this jump target was not initially constructed with a LabeledStatement, |
| 1000 /// this value is identical to targetStatement. | 999 /// this value is identical to targetStatement. |
| 1001 ir.Node originalStatement; | 1000 ir.Node originalStatement; |
| 1002 | 1001 |
| 1003 @override | 1002 @override |
| 1004 bool isBreakTarget = false; | 1003 bool isBreakTarget = false; |
| 1005 | 1004 |
| 1006 @override | 1005 @override |
| 1007 bool isContinueTarget = false; | 1006 bool isContinueTarget = false; |
| 1008 | 1007 |
| 1009 KernelJumpTarget(this.targetStatement, {bool makeContinueLabel = false}) { | 1008 KernelJumpTarget(this.targetStatement, KernelAstAdapter adapter, |
| 1010 labels = <LabelDefinition>[]; | 1009 {bool makeContinueLabel = false}) { |
| 1011 originalStatement = targetStatement; | 1010 originalStatement = targetStatement; |
| 1012 if (targetStatement is ir.LabeledStatement) { | 1011 this.labels = <LabelDefinition>[]; |
| 1012 if (targetStatement is ir.WhileStatement || |
| 1013 targetStatement is ir.DoStatement || |
| 1014 targetStatement is ir.ForStatement || |
| 1015 targetStatement is ir.ForInStatement) { |
| 1016 // Currently these labels are set at resolution on the element itself. |
| 1017 // Once that gets updated, this logic can change downstream. |
| 1018 JumpTarget target = adapter.elements |
| 1019 .getTargetDefinition(adapter.getNode(targetStatement)); |
| 1020 if (target != null) { |
| 1021 labels.addAll(target.labels); |
| 1022 isBreakTarget = target.isBreakTarget; |
| 1023 isContinueTarget = target.isContinueTarget; |
| 1024 } |
| 1025 } else if (targetStatement is ir.LabeledStatement) { |
| 1013 targetStatement = (targetStatement as ir.LabeledStatement).body; | 1026 targetStatement = (targetStatement as ir.LabeledStatement).body; |
| 1014 labels.add( | 1027 labels.add( |
| 1015 new LabelDefinitionX(null, 'L${index++}', this)..setBreakTarget()); | 1028 new LabelDefinitionX(null, 'L${index++}', this)..setBreakTarget()); |
| 1016 isBreakTarget = true; | 1029 isBreakTarget = true; |
| 1017 } else if (makeContinueLabel) { | 1030 } |
| 1031 |
| 1032 if (makeContinueLabel) { |
| 1018 labels.add( | 1033 labels.add( |
| 1019 new LabelDefinitionX(null, 'L${index++}', this)..setContinueTarget()); | 1034 new LabelDefinitionX(null, 'L${index++}', this)..setContinueTarget()); |
| 1020 isContinueTarget = true; | 1035 isContinueTarget = true; |
| 1021 } | 1036 } |
| 1022 } | 1037 } |
| 1023 | 1038 |
| 1024 @override | 1039 @override |
| 1025 LabelDefinition addLabel(ast.Label label, String labelName) { | 1040 LabelDefinition addLabel(ast.Label label, String labelName) { |
| 1026 LabelDefinition result = new LabelDefinitionX(label, labelName, this); | 1041 LabelDefinition result = new LabelDefinitionX(label, labelName, this); |
| 1027 labels.add(result); | 1042 labels.add(result); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1073 JumpTarget continueTarget = | 1088 JumpTarget continueTarget = |
| 1074 astAdapter.getJumpTarget(switchCase, isContinueTarget: true); | 1089 astAdapter.getJumpTarget(switchCase, isContinueTarget: true); |
| 1075 assert(continueTarget is KernelJumpTarget); | 1090 assert(continueTarget is KernelJumpTarget); |
| 1076 targetIndexMap[continueTarget] = switchIndex; | 1091 targetIndexMap[continueTarget] = switchIndex; |
| 1077 assert(builder.jumpTargets[continueTarget] == null); | 1092 assert(builder.jumpTargets[continueTarget] == null); |
| 1078 builder.jumpTargets[continueTarget] = this; | 1093 builder.jumpTargets[continueTarget] = this; |
| 1079 switchIndex++; | 1094 switchIndex++; |
| 1080 } | 1095 } |
| 1081 } | 1096 } |
| 1082 } | 1097 } |
| OLD | NEW |