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); | |
723 openFunction(functionNode); | 722 openFunction(functionNode); |
724 ir.TreeNode parent = functionNode.parent; | 723 ir.TreeNode parent = functionNode.parent; |
725 if (parent is ir.Procedure && parent.kind == ir.ProcedureKind.Factory) { | 724 if (parent is ir.Procedure && parent.kind == ir.ProcedureKind.Factory) { |
726 _addClassTypeVariablesIfNeeded(parent); | 725 _addClassTypeVariablesIfNeeded(parent); |
727 } | 726 } |
728 | 727 // TODO(sra): Generate conversion of Function typed arguments to JavaScript |
729 if (closedWorld.nativeData.isNativeMember(targetElement)) { | 728 // functions. |
730 String nativeName; | 729 // TODO(sra): Invoke native method. |
731 if (closedWorld.nativeData.hasFixedBackendName(targetElement)) { | 730 assert(functionNode.body == null); |
732 nativeName = closedWorld.nativeData.getFixedBackendName(targetElement); | |
733 } else { | |
734 nativeName = targetElement.name.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. | |
786 closeFunction(); | 731 closeFunction(); |
787 } | 732 } |
788 | 733 |
789 void addImplicitInstantiation(DartType type) { | 734 void addImplicitInstantiation(DartType type) { |
790 if (type != null) { | 735 if (type != null) { |
791 currentImplicitInstantiations.add(type); | 736 currentImplicitInstantiations.add(type); |
792 } | 737 } |
793 } | 738 } |
794 | 739 |
795 void removeImplicitInstantiation(DartType type) { | 740 void removeImplicitInstantiation(DartType type) { |
(...skipping 2943 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3739 enterBlock.setBlockFlow( | 3684 enterBlock.setBlockFlow( |
3740 new HTryBlockInformation( | 3685 new HTryBlockInformation( |
3741 kernelBuilder.wrapStatementGraph(bodyGraph), | 3686 kernelBuilder.wrapStatementGraph(bodyGraph), |
3742 exception, | 3687 exception, |
3743 kernelBuilder.wrapStatementGraph(catchGraph), | 3688 kernelBuilder.wrapStatementGraph(catchGraph), |
3744 kernelBuilder.wrapStatementGraph(finallyGraph)), | 3689 kernelBuilder.wrapStatementGraph(finallyGraph)), |
3745 exitBlock); | 3690 exitBlock); |
3746 kernelBuilder.inTryStatement = previouslyInTryStatement; | 3691 kernelBuilder.inTryStatement = previouslyInTryStatement; |
3747 } | 3692 } |
3748 } | 3693 } |
OLD | NEW |