| 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 '../constants/expressions.dart'; | |
| 9 import '../common.dart'; | 8 import '../common.dart'; |
| 10 import '../common/names.dart'; | 9 import '../common/names.dart'; |
| 11 import '../compiler.dart'; | 10 import '../compiler.dart'; |
| 11 import '../constants/expressions.dart'; |
| 12 import '../constants/values.dart'; | 12 import '../constants/values.dart'; |
| 13 import '../dart_types.dart'; | 13 import '../dart_types.dart'; |
| 14 import '../elements/elements.dart'; | 14 import '../elements/elements.dart'; |
| 15 import '../elements/modelx.dart'; |
| 15 import '../js/js.dart' as js; | 16 import '../js/js.dart' as js; |
| 16 import '../js_backend/backend_helpers.dart'; | 17 import '../js_backend/backend_helpers.dart'; |
| 17 import '../js_backend/js_backend.dart'; | 18 import '../js_backend/js_backend.dart'; |
| 18 import '../kernel/kernel.dart'; | 19 import '../kernel/kernel.dart'; |
| 19 import '../kernel/kernel_debug.dart'; | 20 import '../kernel/kernel_debug.dart'; |
| 20 import '../native/native.dart' as native; | 21 import '../native/native.dart' as native; |
| 21 import '../resolution/tree_elements.dart'; | 22 import '../resolution/tree_elements.dart'; |
| 22 import '../tree/tree.dart' as ast; | 23 import '../tree/tree.dart' as ast; |
| 23 import '../types/masks.dart'; | 24 import '../types/masks.dart'; |
| 24 import '../types/types.dart'; | 25 import '../types/types.dart'; |
| 25 import '../universe/call_structure.dart'; | 26 import '../universe/call_structure.dart'; |
| 26 import '../universe/selector.dart'; | 27 import '../universe/selector.dart'; |
| 27 import '../universe/side_effects.dart'; | 28 import '../universe/side_effects.dart'; |
| 28 import '../world.dart'; | 29 import '../world.dart'; |
| 29 import 'locals_handler.dart'; | 30 import 'locals_handler.dart'; |
| 30 import 'types.dart'; | 31 import 'types.dart'; |
| 31 | 32 |
| 32 /// A helper class that abstracts all accesses of the AST from Kernel nodes. | 33 /// A helper class that abstracts all accesses of the AST from Kernel nodes. |
| 33 /// | 34 /// |
| 34 /// The goal is to remove all need for the AST from the Kernel SSA builder. | 35 /// The goal is to remove all need for the AST from the Kernel SSA builder. |
| 35 class KernelAstAdapter { | 36 class KernelAstAdapter { |
| 36 final Kernel kernel; | 37 final Kernel kernel; |
| 37 final JavaScriptBackend _backend; | 38 final JavaScriptBackend _backend; |
| 38 final ResolvedAst _resolvedAst; | 39 final ResolvedAst _resolvedAst; |
| 39 final Map<ir.Node, ast.Node> _nodeToAst; | 40 final Map<ir.Node, ast.Node> _nodeToAst; |
| 40 final Map<ir.Node, Element> _nodeToElement; | 41 final Map<ir.Node, Element> _nodeToElement; |
| 41 final Map<ir.VariableDeclaration, SyntheticLocal> _syntheticLocals = | 42 final Map<ir.VariableDeclaration, SyntheticLocal> _syntheticLocals = |
| 42 <ir.VariableDeclaration, SyntheticLocal>{}; | 43 <ir.VariableDeclaration, SyntheticLocal>{}; |
| 44 final Map<ir.LabeledStatement, KernelJumpTarget> _jumpTargets = |
| 45 <ir.LabeledStatement, KernelJumpTarget>{}; |
| 43 DartTypeConverter _typeConverter; | 46 DartTypeConverter _typeConverter; |
| 44 | 47 |
| 45 KernelAstAdapter(this.kernel, this._backend, this._resolvedAst, | 48 KernelAstAdapter(this.kernel, this._backend, this._resolvedAst, |
| 46 this._nodeToAst, this._nodeToElement) { | 49 this._nodeToAst, this._nodeToElement) { |
| 47 // TODO(het): Maybe just use all of the kernel maps directly? | 50 // TODO(het): Maybe just use all of the kernel maps directly? |
| 48 for (FieldElement fieldElement in kernel.fields.keys) { | 51 for (FieldElement fieldElement in kernel.fields.keys) { |
| 49 _nodeToElement[kernel.fields[fieldElement]] = fieldElement; | 52 _nodeToElement[kernel.fields[fieldElement]] = fieldElement; |
| 50 } | 53 } |
| 51 for (FunctionElement functionElement in kernel.functions.keys) { | 54 for (FunctionElement functionElement in kernel.functions.keys) { |
| 52 _nodeToElement[kernel.functions[functionElement]] = functionElement; | 55 _nodeToElement[kernel.functions[functionElement]] = functionElement; |
| (...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 334 return field.constant == null; | 337 return field.constant == null; |
| 335 } | 338 } |
| 336 return false; | 339 return false; |
| 337 } | 340 } |
| 338 | 341 |
| 339 LibraryElement get jsHelperLibrary => _backend.helpers.jsHelperLibrary; | 342 LibraryElement get jsHelperLibrary => _backend.helpers.jsHelperLibrary; |
| 340 | 343 |
| 341 JumpTarget getTargetDefinition(ir.Node node) => | 344 JumpTarget getTargetDefinition(ir.Node node) => |
| 342 elements.getTargetDefinition(getNode(node)); | 345 elements.getTargetDefinition(getNode(node)); |
| 343 | 346 |
| 347 JumpTarget getTargetOf(ir.Node node) => elements.getTargetOf(getNode(node)); |
| 348 |
| 349 KernelJumpTarget getJumpTarget(ir.LabeledStatement labeledStatement) => |
| 350 _jumpTargets.putIfAbsent(labeledStatement, () { |
| 351 return new KernelJumpTarget(); |
| 352 }); |
| 353 |
| 354 LabelDefinition getTargetLabel(ir.Node node) => |
| 355 elements.getTargetLabel(getNode(node)); |
| 356 |
| 344 ir.Class get mapLiteralClass => | 357 ir.Class get mapLiteralClass => |
| 345 kernel.classes[_backend.helpers.mapLiteralClass]; | 358 kernel.classes[_backend.helpers.mapLiteralClass]; |
| 346 | 359 |
| 347 ir.Procedure get mapLiteralConstructor => | 360 ir.Procedure get mapLiteralConstructor => |
| 348 kernel.functions[_backend.helpers.mapLiteralConstructor]; | 361 kernel.functions[_backend.helpers.mapLiteralConstructor]; |
| 349 | 362 |
| 350 ir.Procedure get mapLiteralConstructorEmpty => | 363 ir.Procedure get mapLiteralConstructorEmpty => |
| 351 kernel.functions[_backend.helpers.mapLiteralConstructorEmpty]; | 364 kernel.functions[_backend.helpers.mapLiteralConstructorEmpty]; |
| 352 | 365 |
| 353 ir.Procedure get mapLiteralUntypedEmptyMaker => | 366 ir.Procedure get mapLiteralUntypedEmptyMaker => |
| (...skipping 518 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 872 astAdapter.reporter.internalError( | 885 astAdapter.reporter.internalError( |
| 873 CURRENT_ELEMENT_SPANNABLE, "Unexpected constant target: $element."); | 886 CURRENT_ELEMENT_SPANNABLE, "Unexpected constant target: $element."); |
| 874 return null; | 887 return null; |
| 875 } | 888 } |
| 876 | 889 |
| 877 @override | 890 @override |
| 878 ConstantExpression visitStringLiteral(ir.StringLiteral node) { | 891 ConstantExpression visitStringLiteral(ir.StringLiteral node) { |
| 879 return new StringConstantExpression(node.value); | 892 return new StringConstantExpression(node.value); |
| 880 } | 893 } |
| 881 } | 894 } |
| 895 |
| 896 class KernelJumpTarget extends JumpTarget { |
| 897 static int index = 0; |
| 898 |
| 899 KernelJumpTarget() { |
| 900 labels = <LabelDefinition>[ |
| 901 new LabelDefinitionX(null, 'l${index++}', this)..setBreakTarget() |
| 902 ]; |
| 903 } |
| 904 |
| 905 @override |
| 906 bool get isBreakTarget => true; |
| 907 |
| 908 set isBreakTarget(bool x) { |
| 909 // do nothing, these are always break targets |
| 910 } |
| 911 |
| 912 @override |
| 913 bool get isContinueTarget => false; |
| 914 |
| 915 set isContinueTarget(bool x) { |
| 916 // do nothing, these are always break targets |
| 917 } |
| 918 |
| 919 @override |
| 920 LabelDefinition addLabel(ast.Label label, String labelName) { |
| 921 LabelDefinition result = new LabelDefinitionX(label, labelName, this); |
| 922 labels.add(result); |
| 923 return result; |
| 924 } |
| 925 |
| 926 @override |
| 927 ExecutableElement get executableContext => null; |
| 928 |
| 929 @override |
| 930 bool get isSwitch => false; |
| 931 |
| 932 @override |
| 933 bool get isTarget => true; |
| 934 |
| 935 @override |
| 936 List<LabelDefinition> labels; |
| 937 |
| 938 @override |
| 939 String get name => null; |
| 940 |
| 941 @override |
| 942 int get nestingLevel => 1; |
| 943 |
| 944 @override |
| 945 ast.Node get statement => null; |
| 946 } |
| OLD | NEW |