Account for multiple holders for direct method calls
Bug: b/234833465
Change-Id: I9fe61fadd2d878c75f630017e39b8eb5297adbb6
diff --git a/src/main/java/com/android/tools/r8/tracereferences/Tracer.java b/src/main/java/com/android/tools/r8/tracereferences/Tracer.java
index 4b98b5f..0cbbfed 100644
--- a/src/main/java/com/android/tools/r8/tracereferences/Tracer.java
+++ b/src/main/java/com/android/tools/r8/tracereferences/Tracer.java
@@ -48,6 +48,7 @@
import com.android.tools.r8.tracereferences.internal.TracedFieldImpl;
import com.android.tools.r8.tracereferences.internal.TracedMethodImpl;
import com.android.tools.r8.utils.AndroidApp;
+import com.android.tools.r8.utils.BooleanBox;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.Timing;
import java.io.IOException;
@@ -300,9 +301,20 @@
MethodLookupResult lookupResult = graphLens().lookupInvokeDirect(method, getContext());
assert lookupResult.getType().isDirect();
DexMethod rewrittenMethod = lookupResult.getReference();
- DexClass holder = appView.definitionFor(rewrittenMethod.getHolderType());
- handleRewrittenMethodReference(
- rewrittenMethod, rewrittenMethod.lookupMemberOnClass(holder));
+ BooleanBox seenMethod = new BooleanBox();
+ appView
+ .contextIndependentDefinitionForWithResolutionResult(rewrittenMethod.getHolderType())
+ .forEachClassResolutionResult(
+ holder -> {
+ DexClassAndMethod target = rewrittenMethod.lookupMemberOnClass(holder);
+ if (target != null) {
+ handleRewrittenMethodReference(rewrittenMethod, target);
+ seenMethod.set();
+ }
+ });
+ if (seenMethod.isFalse()) {
+ handleRewrittenMethodReference(rewrittenMethod, (DexClassAndMethod) null);
+ }
}
@Override