| 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:kernel/ast.dart' as ir; | 5 import 'package:kernel/ast.dart' as ir; |
| 6 | 6 |
| 7 import '../closure.dart'; | 7 import '../closure.dart'; |
| 8 import '../common.dart'; | 8 import '../common.dart'; |
| 9 import '../common/codegen.dart' show CodegenRegistry; | 9 import '../common/codegen.dart' show CodegenRegistry; |
| 10 import '../common/names.dart'; | 10 import '../common/names.dart'; |
| (...skipping 701 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 712 // `sourceInformationBuilder.buildIf(?)`. | 712 // `sourceInformationBuilder.buildIf(?)`. |
| 713 ); | 713 ); |
| 714 } | 714 } |
| 715 } | 715 } |
| 716 functionNode.body.accept(this); | 716 functionNode.body.accept(this); |
| 717 closeFunction(); | 717 closeFunction(); |
| 718 } | 718 } |
| 719 | 719 |
| 720 /// Builds a SSA graph for FunctionNodes of external methods. | 720 /// Builds a SSA graph for FunctionNodes of external methods. |
| 721 void buildExternalFunctionNode(ir.FunctionNode functionNode) { | 721 void buildExternalFunctionNode(ir.FunctionNode functionNode) { |
| 722 assert(functionNode.body == null); |
| 722 openFunction(functionNode); | 723 openFunction(functionNode); |
| 723 ir.TreeNode parent = functionNode.parent; | 724 ir.TreeNode parent = functionNode.parent; |
| 724 if (parent is ir.Procedure && parent.kind == ir.ProcedureKind.Factory) { | 725 if (parent is ir.Procedure && parent.kind == ir.ProcedureKind.Factory) { |
| 725 _addClassTypeVariablesIfNeeded(parent); | 726 _addClassTypeVariablesIfNeeded(parent); |
| 726 } | 727 } |
| 727 // TODO(sra): Generate conversion of Function typed arguments to JavaScript | 728 |
| 728 // functions. | 729 if (closedWorld.nativeData.isNativeMember(targetElement)) { |
| 729 // TODO(sra): Invoke native method. | 730 String nativeName; |
| 730 assert(functionNode.body == null); | 731 if (closedWorld.nativeData.hasFixedBackendName(targetElement)) { |
| 732 nativeName = closedWorld.nativeData.getFixedBackendName(targetElement); |
| 733 } else { |
| 734 nativeName = targetElement.name; |
| 735 } |
| 736 |
| 737 String templateReceiver = ''; |
| 738 List<String> templateArguments = <String>[]; |
| 739 List<HInstruction> inputs = <HInstruction>[]; |
| 740 if (targetElement.isInstanceMember) { |
| 741 templateReceiver = '#.'; |
| 742 inputs.add(localsHandler.readThis()); |
| 743 } |
| 744 |
| 745 for (ir.VariableDeclaration param in functionNode.positionalParameters) { |
| 746 templateArguments.add('#'); |
| 747 Local local = localsMap.getLocalVariable(param); |
| 748 // Convert Dart function to JavaScript function. |
| 749 HInstruction argument = localsHandler.readLocal(local); |
| 750 ir.DartType type = param.type; |
| 751 if (type is ir.FunctionType) { |
| 752 int arity = type.positionalParameters.length; |
| 753 _pushStaticInvocation( |
| 754 _commonElements.closureConverter, |
| 755 [argument, graph.addConstantInt(arity, closedWorld)], |
| 756 commonMasks.dynamicType); |
| 757 argument = pop(); |
| 758 } |
| 759 inputs.add(argument); |
| 760 } |
| 761 |
| 762 String arguments = templateArguments.join(','); |
| 763 |
| 764 // TODO(sra): Use declared type or NativeBehavior type. |
| 765 TypeMask typeMask = commonMasks.dynamicType; |
| 766 String template; |
| 767 if (targetElement.isGetter) { |
| 768 template = '${templateReceiver}$nativeName'; |
| 769 } else if (targetElement.isSetter) { |
| 770 template = '${templateReceiver}$nativeName = ${arguments}'; |
| 771 } else { |
| 772 template = '${templateReceiver}$nativeName(${arguments})'; |
| 773 } |
| 774 |
| 775 push(new HForeignCode( |
| 776 js.js.uncachedExpressionTemplate(template), typeMask, inputs, |
| 777 effects: new SideEffects())); |
| 778 // TODO(johnniwinther): Provide source information. |
| 779 HInstruction value = pop(); |
| 780 if (targetElement.isSetter) { |
| 781 value = graph.addConstantNull(closedWorld); |
| 782 } |
| 783 close(new HReturn(value, null)).addSuccessor(graph.exit); |
| 784 } |
| 785 // TODO(sra): Handle JS-interop methods. |
| 731 closeFunction(); | 786 closeFunction(); |
| 732 } | 787 } |
| 733 | 788 |
| 734 void addImplicitInstantiation(DartType type) { | 789 void addImplicitInstantiation(DartType type) { |
| 735 if (type != null) { | 790 if (type != null) { |
| 736 currentImplicitInstantiations.add(type); | 791 currentImplicitInstantiations.add(type); |
| 737 } | 792 } |
| 738 } | 793 } |
| 739 | 794 |
| 740 void removeImplicitInstantiation(DartType type) { | 795 void removeImplicitInstantiation(DartType type) { |
| (...skipping 2939 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3680 enterBlock.setBlockFlow( | 3735 enterBlock.setBlockFlow( |
| 3681 new HTryBlockInformation( | 3736 new HTryBlockInformation( |
| 3682 kernelBuilder.wrapStatementGraph(bodyGraph), | 3737 kernelBuilder.wrapStatementGraph(bodyGraph), |
| 3683 exception, | 3738 exception, |
| 3684 kernelBuilder.wrapStatementGraph(catchGraph), | 3739 kernelBuilder.wrapStatementGraph(catchGraph), |
| 3685 kernelBuilder.wrapStatementGraph(finallyGraph)), | 3740 kernelBuilder.wrapStatementGraph(finallyGraph)), |
| 3686 exitBlock); | 3741 exitBlock); |
| 3687 kernelBuilder.inTryStatement = previouslyInTryStatement; | 3742 kernelBuilder.inTryStatement = previouslyInTryStatement; |
| 3688 } | 3743 } |
| 3689 } | 3744 } |
| OLD | NEW |