Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(63)

Unified Diff: pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart

Issue 1227543008: dart2js cps: Generate direct field accesses a build-time. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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));
}
« no previous file with comments | « no previous file | pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698