| Index: pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart
|
| diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart
|
| index b15088584e373cdd6b5b0795974986a696321ea5..6c324d898e1b3b6f195660e20a5192579e1eccfc 100644
|
| --- a/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart
|
| +++ b/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart
|
| @@ -869,8 +869,15 @@ class IrBuilder {
|
| Selector selector,
|
| TypeMask mask) {
|
| assert(selector.isGetter);
|
| - return _buildInvokeDynamic(
|
| - receiver, selector, mask, const <ir.Primitive>[]);
|
| + FieldElement field = program.locateSingleField(selector, mask);
|
| + if (field != null) {
|
| + // If the world says this resolves to a unique field, then it MUST be
|
| + // treated as a field access, since the getter might not be emitted.
|
| + return buildFieldGet(receiver, field);
|
| + } else {
|
| + return _buildInvokeDynamic(
|
| + receiver, selector, mask, const <ir.Primitive>[]);
|
| + }
|
| }
|
|
|
| /// Create a dynamic setter invocation on [receiver] where the setter name and
|
| @@ -880,7 +887,14 @@ class IrBuilder {
|
| TypeMask mask,
|
| ir.Primitive value) {
|
| assert(selector.isSetter);
|
| - _buildInvokeDynamic(receiver, selector, mask, <ir.Primitive>[value]);
|
| + FieldElement field = program.locateSingleField(selector, mask);
|
| + if (field != null) {
|
| + // If the world says this resolves to a unique field, then it MUST be
|
| + // treated as a field access, since the setter might not be emitted.
|
| + buildFieldSet(receiver, field, value);
|
| + } else {
|
| + _buildInvokeDynamic(receiver, selector, mask, <ir.Primitive>[value]);
|
| + }
|
| return value;
|
| }
|
|
|
| @@ -2395,6 +2409,16 @@ class IrBuilder {
|
| return state.thisParameter;
|
| }
|
|
|
| + ir.Primitive buildFieldGet(ir.Primitive receiver, FieldElement target) {
|
| + return addPrimitive(new ir.GetField(receiver, target));
|
| + }
|
| +
|
| + void buildFieldSet(ir.Primitive receiver,
|
| + FieldElement target,
|
| + ir.Primitive value) {
|
| + add(new ir.SetField(receiver, target, value));
|
| + }
|
| +
|
| ir.Primitive buildSuperFieldGet(FieldElement target) {
|
| return addPrimitive(new ir.GetField(buildThis(), target));
|
| }
|
|
|