Index: pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart |
diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart |
index e44b840787f4c6d0e16187eab1687581a235ec73..1afb9d3ac23da303625ba9ada545a4f5f58ddbd5 100644 |
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart |
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart |
@@ -135,7 +135,8 @@ class IrBuilderVisitor extends ast.Visitor<ir.Primitive> |
BaseImplementationOfNewMixin<ir.Primitive, dynamic>, |
BaseImplementationOfCompoundsMixin<ir.Primitive, dynamic>, |
BaseImplementationOfSetIfNullsMixin<ir.Primitive, dynamic>, |
- BaseImplementationOfIndexCompoundsMixin<ir.Primitive, dynamic> |
+ BaseImplementationOfIndexCompoundsMixin<ir.Primitive, dynamic>, |
+ BaseImplementationOfSuperIndexSetIfNullMixin<ir.Primitive, dynamic> |
implements SemanticSendVisitor<ir.Primitive, dynamic> { |
final TreeElements elements; |
final Compiler compiler; |
@@ -2717,6 +2718,22 @@ class IrBuilderVisitor extends ast.Visitor<ir.Primitive> |
sourceInformationBuilder.buildIndexSet(node)); |
} |
+ ir.Primitive translateIfNull( |
+ ast.SendSet node, |
+ ir.Primitive getValue(), |
+ ast.Node rhs, |
+ void setValue(ir.Primitive value)) { |
+ ir.Primitive value = getValue(); |
+ // Unlike other compound operators if-null conditionally will not do the |
+ // assignment operation. |
+ return irBuilder.buildIfNull(value, nested(() { |
+ ir.Primitive newValue = build(rhs); |
+ setValue(newValue); |
+ return newValue; |
+ }), |
+ sourceInformationBuilder.buildIf(node)); |
+ } |
+ |
ir.Primitive translateCompounds( |
ast.SendSet node, |
ir.Primitive getValue(), |
@@ -2724,16 +2741,7 @@ class IrBuilderVisitor extends ast.Visitor<ir.Primitive> |
void setValue(ir.Primitive value)) { |
ir.Primitive value = getValue(); |
op.BinaryOperator operator = rhs.operator; |
- if (operator.kind == op.BinaryOperatorKind.IF_NULL) { |
- // Unlike other compound operators if-null conditionally will not do the |
- // assignment operation. |
- return irBuilder.buildIfNull(value, nested(() { |
- ir.Primitive newValue = build(rhs.rhs); |
- setValue(newValue); |
- return newValue; |
- }), |
- sourceInformationBuilder.buildIf(node)); |
- } |
+ assert(operator.kind != op.BinaryOperatorKind.IF_NULL); |
Selector operatorSelector = |
new Selector.binaryOperator(operator.selectorName); |
@@ -2778,6 +2786,68 @@ class IrBuilderVisitor extends ast.Visitor<ir.Primitive> |
} |
@override |
+ ir.Primitive handleSuperIndexSetIfNull( |
+ ast.SendSet node, |
+ Element indexFunction, |
+ Element indexSetFunction, |
+ ast.Node index, |
+ ast.Node rhs, |
+ arg, |
+ {bool isGetterValid, |
+ bool isSetterValid}) { |
+ return translateSetIfNull(node, () { |
+ if (isGetterValid) { |
+ return irBuilder.buildSuperMethodGet( |
+ indexFunction, sourceInformationBuilder.buildIndex(node)); |
+ } else { |
+ return buildSuperNoSuchGetter( |
+ indexFunction, |
+ elements.getGetterTypeMaskInComplexSendSet(node), |
+ sourceInformationBuilder.buildIndex(node)); |
+ } |
+ }, rhs, (ir.Primitive result) { |
+ if (isSetterValid) { |
+ return irBuilder.buildSuperMethodGet( |
+ indexSetFunction, sourceInformationBuilder.buildIndexSet(node)); |
+ } else { |
+ return buildSuperNoSuchSetter( |
+ indexSetFunction, elements.getTypeMask(node), result, |
+ sourceInformationBuilder.buildIndexSet(node)); |
+ } |
+ }); |
+ } |
+ |
+ @override |
+ ir.Primitive visitIndexSetIfNull( |
+ ast.SendSet node, |
+ ast.Node receiver, |
+ ast.Node index, |
+ ast.Node rhs, |
+ arg) { |
+ ir.Primitive target = visit(receiver); |
+ ir.Primitive indexValue = visit(index); |
+ return translateSetIfNull(node, () { |
+ Selector selector = new Selector.index(); |
+ List<ir.Primitive> arguments = <ir.Primitive>[indexValue]; |
+ CallStructure callStructure = |
+ normalizeDynamicArguments(selector.callStructure, arguments); |
+ return irBuilder.buildDynamicInvocation( |
+ target, |
+ new Selector(selector.kind, selector.memberName, callStructure), |
+ elements.getGetterTypeMaskInComplexSendSet(node), |
+ arguments, |
+ sourceInformationBuilder.buildCall(receiver, node)); |
+ }, rhs, (ir.Primitive result) { |
+ irBuilder.buildDynamicIndexSet( |
+ target, |
+ elements.getTypeMask(node), |
+ indexValue, |
+ result, |
+ sourceInformationBuilder.buildIndexSet(node)); |
+ }); |
+ } |
+ |
+ @override |
ir.Primitive handleDynamicSet( |
ast.SendSet node, |
ast.Node receiver, |