OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 library dart2js.ir_builder_task; | 5 library dart2js.ir_builder_task; |
6 | 6 |
7 import '../closure.dart' as closure; | 7 import '../closure.dart' as closure; |
8 import '../common.dart'; | 8 import '../common.dart'; |
9 import '../common/names.dart' show | 9 import '../common/names.dart' show |
10 Identifiers, | 10 Identifiers, |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
128 with IrBuilderMixin<ast.Node>, | 128 with IrBuilderMixin<ast.Node>, |
129 SemanticSendResolvedMixin<ir.Primitive, dynamic>, | 129 SemanticSendResolvedMixin<ir.Primitive, dynamic>, |
130 ErrorBulkMixin<ir.Primitive, dynamic>, | 130 ErrorBulkMixin<ir.Primitive, dynamic>, |
131 BaseImplementationOfStaticsMixin<ir.Primitive, dynamic>, | 131 BaseImplementationOfStaticsMixin<ir.Primitive, dynamic>, |
132 BaseImplementationOfLocalsMixin<ir.Primitive, dynamic>, | 132 BaseImplementationOfLocalsMixin<ir.Primitive, dynamic>, |
133 BaseImplementationOfDynamicsMixin<ir.Primitive, dynamic>, | 133 BaseImplementationOfDynamicsMixin<ir.Primitive, dynamic>, |
134 BaseImplementationOfConstantsMixin<ir.Primitive, dynamic>, | 134 BaseImplementationOfConstantsMixin<ir.Primitive, dynamic>, |
135 BaseImplementationOfNewMixin<ir.Primitive, dynamic>, | 135 BaseImplementationOfNewMixin<ir.Primitive, dynamic>, |
136 BaseImplementationOfCompoundsMixin<ir.Primitive, dynamic>, | 136 BaseImplementationOfCompoundsMixin<ir.Primitive, dynamic>, |
137 BaseImplementationOfSetIfNullsMixin<ir.Primitive, dynamic>, | 137 BaseImplementationOfSetIfNullsMixin<ir.Primitive, dynamic>, |
138 BaseImplementationOfIndexCompoundsMixin<ir.Primitive, dynamic> | 138 BaseImplementationOfIndexCompoundsMixin<ir.Primitive, dynamic>, |
| 139 BaseImplementationOfSuperIndexSetIfNullMixin<ir.Primitive, dynamic> |
139 implements SemanticSendVisitor<ir.Primitive, dynamic> { | 140 implements SemanticSendVisitor<ir.Primitive, dynamic> { |
140 final TreeElements elements; | 141 final TreeElements elements; |
141 final Compiler compiler; | 142 final Compiler compiler; |
142 final SourceInformationBuilder sourceInformationBuilder; | 143 final SourceInformationBuilder sourceInformationBuilder; |
143 final TypeMaskSystem typeMaskSystem; | 144 final TypeMaskSystem typeMaskSystem; |
144 | 145 |
145 /// A map from try statements in the source to analysis information about | 146 /// A map from try statements in the source to analysis information about |
146 /// them. | 147 /// them. |
147 /// | 148 /// |
148 /// The analysis information includes the set of variables that must be | 149 /// The analysis information includes the set of variables that must be |
(...skipping 2561 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2710 ast.Node index, | 2711 ast.Node index, |
2711 ast.Node rhs, | 2712 ast.Node rhs, |
2712 _) { | 2713 _) { |
2713 return irBuilder.buildSuperIndexSet( | 2714 return irBuilder.buildSuperIndexSet( |
2714 function, | 2715 function, |
2715 visit(index), | 2716 visit(index), |
2716 visit(rhs), | 2717 visit(rhs), |
2717 sourceInformationBuilder.buildIndexSet(node)); | 2718 sourceInformationBuilder.buildIndexSet(node)); |
2718 } | 2719 } |
2719 | 2720 |
| 2721 ir.Primitive translateIfNull( |
| 2722 ast.SendSet node, |
| 2723 ir.Primitive getValue(), |
| 2724 ast.Node rhs, |
| 2725 void setValue(ir.Primitive value)) { |
| 2726 ir.Primitive value = getValue(); |
| 2727 // Unlike other compound operators if-null conditionally will not do the |
| 2728 // assignment operation. |
| 2729 return irBuilder.buildIfNull(value, nested(() { |
| 2730 ir.Primitive newValue = build(rhs); |
| 2731 setValue(newValue); |
| 2732 return newValue; |
| 2733 }), |
| 2734 sourceInformationBuilder.buildIf(node)); |
| 2735 } |
| 2736 |
2720 ir.Primitive translateCompounds( | 2737 ir.Primitive translateCompounds( |
2721 ast.SendSet node, | 2738 ast.SendSet node, |
2722 ir.Primitive getValue(), | 2739 ir.Primitive getValue(), |
2723 CompoundRhs rhs, | 2740 CompoundRhs rhs, |
2724 void setValue(ir.Primitive value)) { | 2741 void setValue(ir.Primitive value)) { |
2725 ir.Primitive value = getValue(); | 2742 ir.Primitive value = getValue(); |
2726 op.BinaryOperator operator = rhs.operator; | 2743 op.BinaryOperator operator = rhs.operator; |
2727 if (operator.kind == op.BinaryOperatorKind.IF_NULL) { | 2744 assert(operator.kind != op.BinaryOperatorKind.IF_NULL); |
2728 // Unlike other compound operators if-null conditionally will not do the | |
2729 // assignment operation. | |
2730 return irBuilder.buildIfNull(value, nested(() { | |
2731 ir.Primitive newValue = build(rhs.rhs); | |
2732 setValue(newValue); | |
2733 return newValue; | |
2734 }), | |
2735 sourceInformationBuilder.buildIf(node)); | |
2736 } | |
2737 | 2745 |
2738 Selector operatorSelector = | 2746 Selector operatorSelector = |
2739 new Selector.binaryOperator(operator.selectorName); | 2747 new Selector.binaryOperator(operator.selectorName); |
2740 ir.Primitive rhsValue; | 2748 ir.Primitive rhsValue; |
2741 if (rhs.kind == CompoundKind.ASSIGNMENT) { | 2749 if (rhs.kind == CompoundKind.ASSIGNMENT) { |
2742 rhsValue = visit(rhs.rhs); | 2750 rhsValue = visit(rhs.rhs); |
2743 } else { | 2751 } else { |
2744 rhsValue = irBuilder.buildIntegerConstant(1); | 2752 rhsValue = irBuilder.buildIntegerConstant(1); |
2745 } | 2753 } |
2746 List<ir.Primitive> arguments = <ir.Primitive>[rhsValue]; | 2754 List<ir.Primitive> arguments = <ir.Primitive>[rhsValue]; |
(...skipping 24 matching lines...) Expand all Loading... |
2771 // assignment operation. | 2779 // assignment operation. |
2772 return irBuilder.buildIfNull(value, nested(() { | 2780 return irBuilder.buildIfNull(value, nested(() { |
2773 ir.Primitive newValue = build(rhs); | 2781 ir.Primitive newValue = build(rhs); |
2774 setValue(newValue); | 2782 setValue(newValue); |
2775 return newValue; | 2783 return newValue; |
2776 }), | 2784 }), |
2777 sourceInformationBuilder.buildIf(node)); | 2785 sourceInformationBuilder.buildIf(node)); |
2778 } | 2786 } |
2779 | 2787 |
2780 @override | 2788 @override |
| 2789 ir.Primitive handleSuperIndexSetIfNull( |
| 2790 ast.SendSet node, |
| 2791 Element indexFunction, |
| 2792 Element indexSetFunction, |
| 2793 ast.Node index, |
| 2794 ast.Node rhs, |
| 2795 arg, |
| 2796 {bool isGetterValid, |
| 2797 bool isSetterValid}) { |
| 2798 return translateSetIfNull(node, () { |
| 2799 if (isGetterValid) { |
| 2800 return irBuilder.buildSuperMethodGet( |
| 2801 indexFunction, sourceInformationBuilder.buildIndex(node)); |
| 2802 } else { |
| 2803 return buildSuperNoSuchGetter( |
| 2804 indexFunction, |
| 2805 elements.getGetterTypeMaskInComplexSendSet(node), |
| 2806 sourceInformationBuilder.buildIndex(node)); |
| 2807 } |
| 2808 }, rhs, (ir.Primitive result) { |
| 2809 if (isSetterValid) { |
| 2810 return irBuilder.buildSuperMethodGet( |
| 2811 indexSetFunction, sourceInformationBuilder.buildIndexSet(node)); |
| 2812 } else { |
| 2813 return buildSuperNoSuchSetter( |
| 2814 indexSetFunction, elements.getTypeMask(node), result, |
| 2815 sourceInformationBuilder.buildIndexSet(node)); |
| 2816 } |
| 2817 }); |
| 2818 } |
| 2819 |
| 2820 @override |
| 2821 ir.Primitive visitIndexSetIfNull( |
| 2822 ast.SendSet node, |
| 2823 ast.Node receiver, |
| 2824 ast.Node index, |
| 2825 ast.Node rhs, |
| 2826 arg) { |
| 2827 ir.Primitive target = visit(receiver); |
| 2828 ir.Primitive indexValue = visit(index); |
| 2829 return translateSetIfNull(node, () { |
| 2830 Selector selector = new Selector.index(); |
| 2831 List<ir.Primitive> arguments = <ir.Primitive>[indexValue]; |
| 2832 CallStructure callStructure = |
| 2833 normalizeDynamicArguments(selector.callStructure, arguments); |
| 2834 return irBuilder.buildDynamicInvocation( |
| 2835 target, |
| 2836 new Selector(selector.kind, selector.memberName, callStructure), |
| 2837 elements.getGetterTypeMaskInComplexSendSet(node), |
| 2838 arguments, |
| 2839 sourceInformationBuilder.buildCall(receiver, node)); |
| 2840 }, rhs, (ir.Primitive result) { |
| 2841 irBuilder.buildDynamicIndexSet( |
| 2842 target, |
| 2843 elements.getTypeMask(node), |
| 2844 indexValue, |
| 2845 result, |
| 2846 sourceInformationBuilder.buildIndexSet(node)); |
| 2847 }); |
| 2848 } |
| 2849 |
| 2850 @override |
2781 ir.Primitive handleDynamicSet( | 2851 ir.Primitive handleDynamicSet( |
2782 ast.SendSet node, | 2852 ast.SendSet node, |
2783 ast.Node receiver, | 2853 ast.Node receiver, |
2784 Name name, | 2854 Name name, |
2785 ast.Node rhs, | 2855 ast.Node rhs, |
2786 _) { | 2856 _) { |
2787 return irBuilder.buildDynamicSet( | 2857 return irBuilder.buildDynamicSet( |
2788 translateReceiver(receiver), | 2858 translateReceiver(receiver), |
2789 new Selector.setter(name), | 2859 new Selector.setter(name), |
2790 elements.getTypeMask(node), | 2860 elements.getTypeMask(node), |
(...skipping 1466 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4257 _backend.jsInteropAnalysis.hasAnonymousAnnotation(element.contextClass); | 4327 _backend.jsInteropAnalysis.hasAnonymousAnnotation(element.contextClass); |
4258 | 4328 |
4259 String getJsInteropTargetPath(FunctionElement element) { | 4329 String getJsInteropTargetPath(FunctionElement element) { |
4260 return '${_backend.namer.fixedBackendPath(element)}.' | 4330 return '${_backend.namer.fixedBackendPath(element)}.' |
4261 '${_backend.nativeData.getFixedBackendName(element)}'; | 4331 '${_backend.nativeData.getFixedBackendName(element)}'; |
4262 } | 4332 } |
4263 | 4333 |
4264 DartType get jsJavascriptObjectType => | 4334 DartType get jsJavascriptObjectType => |
4265 _backend.helpers.jsJavaScriptObjectClass.thisType; | 4335 _backend.helpers.jsJavaScriptObjectClass.thisType; |
4266 } | 4336 } |
OLD | NEW |