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

Unified Diff: pkg/compiler/lib/src/ssa/kernel_impact.dart

Issue 2890153002: Handle super accesses loaded from .dill (Closed)
Patch Set: Created 3 years, 7 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
Index: pkg/compiler/lib/src/ssa/kernel_impact.dart
diff --git a/pkg/compiler/lib/src/ssa/kernel_impact.dart b/pkg/compiler/lib/src/ssa/kernel_impact.dart
index 22b055312868c760264cd19857a4428214e7d727..de794a45e69829088c7af774f79a8663cf0a76ac 100644
--- a/pkg/compiler/lib/src/ssa/kernel_impact.dart
+++ b/pkg/compiler/lib/src/ssa/kernel_impact.dart
@@ -64,8 +64,7 @@ ir.Member getIrMember(Compiler compiler, ResolvedAst resolvedAst) {
ResolutionImpact buildKernelImpact(
ir.Member member, KernelToElementMap elementAdapter) {
- KernelImpactBuilder builder =
- new KernelImpactBuilder('${member.name}', elementAdapter);
+ KernelImpactBuilder builder = new KernelImpactBuilder(elementAdapter, member);
if (member is ir.Procedure) {
return builder.buildProcedure(member);
} else if (member is ir.Constructor) {
@@ -79,9 +78,11 @@ ResolutionImpact buildKernelImpact(
class KernelImpactBuilder extends ir.Visitor {
final ResolutionWorldImpactBuilder impactBuilder;
final KernelToElementMap elementAdapter;
+ final ir.Member currentMember;
- KernelImpactBuilder(String name, this.elementAdapter)
- : this.impactBuilder = new ResolutionWorldImpactBuilder(name);
+ KernelImpactBuilder(this.elementAdapter, this.currentMember)
+ : this.impactBuilder =
+ new ResolutionWorldImpactBuilder('${currentMember.name}');
CommonElements get commonElements => elementAdapter.commonElements;
@@ -389,8 +390,9 @@ class KernelImpactBuilder extends ir.Visitor {
impactBuilder.registerStaticUse(new StaticUse.staticSet(member));
}
- void handleSuperInvocation(ir.Node target, ir.Node arguments) {
- FunctionEntity method = elementAdapter.getMethod(target);
+ void handleSuperInvocation(ir.Name name, ir.Node target, ir.Node arguments) {
+ FunctionEntity method = elementAdapter
+ .getSuperMember(currentMember, name, target, setter: false);
_visitArguments(arguments);
impactBuilder.registerStaticUse(new StaticUse.superInvoke(
method, elementAdapter.getCallStructure(arguments)));
@@ -398,55 +400,55 @@ class KernelImpactBuilder extends ir.Visitor {
@override
void visitDirectMethodInvocation(ir.DirectMethodInvocation node) {
- handleSuperInvocation(node.target, node.arguments);
+ handleSuperInvocation(node.name, node.target, node.arguments);
}
@override
void visitSuperMethodInvocation(ir.SuperMethodInvocation node) {
// TODO(johnniwinther): Should we support this or always use the
// [MixinFullResolution] transformer?
- handleSuperInvocation(node.interfaceTarget, node.arguments);
+ handleSuperInvocation(node.name, node.interfaceTarget, node.arguments);
}
- void handleSuperGet(ir.Member target) {
- if (target is ir.Procedure && target.kind == ir.ProcedureKind.Method) {
- FunctionEntity method = elementAdapter.getMethod(target);
- impactBuilder.registerStaticUse(new StaticUse.superTearOff(method));
+ void handleSuperGet(ir.Name name, ir.Member target) {
+ MemberEntity member = elementAdapter
+ .getSuperMember(currentMember, name, target, setter: false);
+ if (member.isFunction) {
+ impactBuilder.registerStaticUse(new StaticUse.superTearOff(member));
} else {
- MemberEntity member = elementAdapter.getMember(target);
impactBuilder.registerStaticUse(new StaticUse.superGet(member));
}
}
@override
void visitDirectPropertyGet(ir.DirectPropertyGet node) {
- handleSuperGet(node.target);
+ handleSuperGet(null, node.target);
}
@override
void visitSuperPropertyGet(ir.SuperPropertyGet node) {
- handleSuperGet(node.interfaceTarget);
+ handleSuperGet(node.name, node.interfaceTarget);
}
- void handleSuperSet(ir.Node target, ir.Node value) {
+ void handleSuperSet(ir.Name name, ir.Node target, ir.Node value) {
visitNode(value);
- if (target is ir.Field) {
- FieldEntity field = elementAdapter.getField(target);
- impactBuilder.registerStaticUse(new StaticUse.superFieldSet(field));
+ MemberEntity member = elementAdapter
+ .getSuperMember(currentMember, name, target, setter: true);
+ if (member.isField) {
+ impactBuilder.registerStaticUse(new StaticUse.superFieldSet(member));
} else {
- FunctionEntity method = elementAdapter.getMethod(target);
- impactBuilder.registerStaticUse(new StaticUse.superSetterSet(method));
+ impactBuilder.registerStaticUse(new StaticUse.superSetterSet(member));
}
}
@override
void visitDirectPropertySet(ir.DirectPropertySet node) {
- handleSuperSet(node.target, node.value);
+ handleSuperSet(null, node.target, node.value);
}
@override
void visitSuperPropertySet(ir.SuperPropertySet node) {
- handleSuperSet(node.interfaceTarget, node.value);
+ handleSuperSet(node.name, node.interfaceTarget, node.value);
}
@override
« no previous file with comments | « pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart ('k') | tests/compiler/dart2js/kernel/closed_world_from_dill_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698