| 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 |