Replace a few resolution usages with direct lookup.
Change-Id: I1310560c21c6761710e54079966383a8c42cd586
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java b/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
index 8d95888..9b31a58 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
@@ -15,6 +15,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DebugLocalInfo;
import com.android.tools.r8.graph.DexCallSite;
+import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexItem;
@@ -1377,10 +1378,16 @@
// therefore we use an invoke-direct instead. We need to do this as the Android Runtime
// will not allow invoke-virtual of a private method.
DexMethod invocationMethod = (DexMethod) item;
- if (invocationMethod.holder == method.method.holder) {
- DexEncodedMethod directTarget = appView.appInfo().lookupDirectTarget(invocationMethod);
- if (directTarget != null && invocationMethod.holder == directTarget.method.holder) {
- type = Type.DIRECT;
+ DexType holderType = method.method.holder;
+ if (invocationMethod.holder == holderType) {
+ DexClass holderClass = appView.definitionFor(holderType);
+ assert holderClass != null && holderClass.isProgramClass();
+ if (holderClass != null) {
+ DexEncodedMethod directTarget = holderClass.lookupDirectMethod(invocationMethod);
+ if (directTarget != null && !directTarget.isStatic()) {
+ assert invocationMethod.holder == directTarget.method.holder;
+ type = Type.DIRECT;
+ }
}
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/NonNullTracker.java b/src/main/java/com/android/tools/r8/ir/optimize/NonNullTracker.java
index 84247d0..8b57c10 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/NonNullTracker.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/NonNullTracker.java
@@ -6,6 +6,7 @@
import static com.android.tools.r8.ir.code.DominatorTree.Assumption.MAY_HAVE_UNREACHABLE_BLOCKS;
import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.ir.analysis.type.TypeAnalysis;
@@ -108,10 +109,15 @@
// invoked method is same as that of the method we are processing now.
DexMethod invokedMethod = current.asInvokeMethod().getInvokedMethod();
if (invokedMethod.holder == code.method.method.holder) {
- if (current.isInvokeDirect()) {
- singleTarget = appView.appInfo().lookupDirectTarget(invokedMethod);
- } else if (current.isInvokeStatic()) {
- singleTarget = appView.appInfo().lookupStaticTarget(invokedMethod);
+ DexClass clazz = appView.definitionFor(invokedMethod.holder);
+ assert clazz != null && clazz.isProgramClass();
+ if (clazz != null) {
+ DexEncodedMethod directMethod = clazz.lookupDirectMethod(invokedMethod);
+ if (current.isInvokeDirect() && !directMethod.isStatic()) {
+ singleTarget = directMethod;
+ } else if (current.isInvokeStatic() && directMethod.isStatic()) {
+ singleTarget = directMethod;
+ }
}
}
}