Add method resolution overloads taking DexMethodSignature
Change-Id: Ib644b47fd611bd10e86159678723ae40dd5746dc
diff --git a/src/main/java/com/android/tools/r8/graph/AppInfoWithClassHierarchy.java b/src/main/java/com/android/tools/r8/graph/AppInfoWithClassHierarchy.java
index a8aae4e..c8b99a4 100644
--- a/src/main/java/com/android/tools/r8/graph/AppInfoWithClassHierarchy.java
+++ b/src/main/java/com/android/tools/r8/graph/AppInfoWithClassHierarchy.java
@@ -599,7 +599,7 @@
assert checkIfObsolete();
DexType holder = method.holder;
if (holder.isArrayType()) {
- return resolveMethodOnArray(holder, method);
+ return resolveMethodOnArray(holder, method.getProto(), method.getName());
}
DexClass definition = definitionFor(holder);
if (definition == null) {
@@ -615,9 +615,18 @@
}
public MethodResolutionResult resolveMethodOn(DexClass holder, DexMethod method) {
+ return resolveMethodOn(holder, method.getProto(), method.getName());
+ }
+
+ public MethodResolutionResult resolveMethodOn(DexClass holder, DexMethodSignature method) {
+ return resolveMethodOn(holder, method.getProto(), method.getName());
+ }
+
+ public MethodResolutionResult resolveMethodOn(
+ DexClass holder, DexProto methodProto, DexString methodName) {
return holder.isInterface()
- ? resolveMethodOnInterface(holder, method)
- : resolveMethodOnClass(method, holder);
+ ? resolveMethodOnInterface(holder, methodProto, methodName)
+ : resolveMethodOnClass(methodProto, methodName, holder);
}
/**
@@ -646,18 +655,23 @@
* 10.7 of the Java Language Specification</a>. All invokations will have target java.lang.Object
* except clone which has no target.
*/
- private MethodResolutionResult resolveMethodOnArray(DexType holder, DexMethod method) {
+ private MethodResolutionResult resolveMethodOnArray(
+ DexType holder, DexProto methodProto, DexString methodName) {
assert checkIfObsolete();
assert holder.isArrayType();
- if (method.name == dexItemFactory().cloneMethodName) {
+ if (methodName == dexItemFactory().cloneMethodName) {
return ArrayCloneMethodResult.INSTANCE;
} else {
- return resolveMethodOnClass(method, dexItemFactory().objectType);
+ return resolveMethodOnClass(methodProto, methodName, dexItemFactory().objectType);
}
}
public MethodResolutionResult resolveMethodOnClass(DexMethod method) {
- return resolveMethodOnClass(method, method.holder);
+ return resolveMethodOnClass(method.getProto(), method.getName(), method.getHolderType());
+ }
+
+ public MethodResolutionResult resolveMethodOnClass(DexMethod method, DexType holder) {
+ return resolveMethodOnClass(method.getProto(), method.getName(), holder);
}
/**
@@ -671,10 +685,27 @@
* invoke on the given descriptor to a corresponding invoke on the resolved descriptor, as the
* resolved method is used as basis for dispatch.
*/
- public MethodResolutionResult resolveMethodOnClass(DexMethod method, DexType holder) {
+ public MethodResolutionResult resolveMethodOnClass(
+ DexProto methodProto, DexString methodName, DexType holder) {
assert checkIfObsolete();
if (holder.isArrayType()) {
- return resolveMethodOnArray(holder, method);
+ return resolveMethodOnArray(holder, methodProto, methodName);
+ }
+ DexClass clazz = definitionFor(holder);
+ if (clazz == null) {
+ return ClassNotFoundResult.INSTANCE;
+ }
+ // Step 1: If holder is an interface, resolution fails with an ICCE. We return null.
+ if (clazz.isInterface()) {
+ return IncompatibleClassResult.INSTANCE;
+ }
+ return resolveMethodOnClass(methodProto, methodName, clazz);
+ }
+
+ public MethodResolutionResult resolveMethodOnClass(DexMethodSignature method, DexType holder) {
+ assert checkIfObsolete();
+ if (holder.isArrayType()) {
+ return resolveMethodOnArray(holder, method.getProto(), method.getName());
}
DexClass clazz = definitionFor(holder);
if (clazz == null) {
@@ -688,15 +719,15 @@
}
public MethodResolutionResult resolveMethodOnClass(DexMethod method, DexClass clazz) {
- return resolveMethodOnClass(clazz, method.getProto(), method.getName());
+ return resolveMethodOnClass(method.getProto(), method.getName(), clazz);
}
public MethodResolutionResult resolveMethodOnClass(DexMethodSignature method, DexClass clazz) {
- return resolveMethodOnClass(clazz, method.getProto(), method.getName());
+ return resolveMethodOnClass(method.getProto(), method.getName(), clazz);
}
public MethodResolutionResult resolveMethodOnClass(
- DexClass clazz, DexProto methodProto, DexString methodName) {
+ DexProto methodProto, DexString methodName, DexClass clazz) {
assert checkIfObsolete();
assert !clazz.isInterface();
// Step 2:
@@ -866,10 +897,15 @@
}
public MethodResolutionResult resolveMethodOnInterface(DexClass definition, DexMethod desc) {
+ return resolveMethodOnInterface(definition, desc.getProto(), desc.getName());
+ }
+
+ public MethodResolutionResult resolveMethodOnInterface(
+ DexClass definition, DexProto methodProto, DexString methodName) {
assert checkIfObsolete();
assert definition.isInterface();
// Step 2: Look for exact method on interface.
- DexEncodedMethod result = definition.lookupMethod(desc);
+ DexEncodedMethod result = definition.lookupMethod(methodProto, methodName);
if (result != null) {
return new SingleResolutionResult(definition, definition, result);
}
@@ -878,13 +914,13 @@
if (objectClass == null) {
return ClassNotFoundResult.INSTANCE;
}
- result = objectClass.lookupMethod(desc);
+ result = objectClass.lookupMethod(methodProto, methodName);
if (result != null && result.accessFlags.isPublic() && !result.accessFlags.isAbstract()) {
return new SingleResolutionResult(definition, objectClass, result);
}
// Step 3: Look for maximally-specific superinterface methods or any interface definition.
// This is the same for classes and interfaces.
- return resolveMethodStep3(definition, desc.getProto(), desc.getName());
+ return resolveMethodStep3(definition, methodProto, methodName);
}
/**
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/propagation/VirtualDispatchMethodArgumentPropagator.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/propagation/VirtualDispatchMethodArgumentPropagator.java
index d463e56..43a5693 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/propagation/VirtualDispatchMethodArgumentPropagator.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/propagation/VirtualDispatchMethodArgumentPropagator.java
@@ -9,7 +9,6 @@
import static com.android.tools.r8.utils.MapUtils.ignoreKey;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.ImmediateProgramSubtypingInfo;
@@ -101,17 +100,8 @@
inactiveMethodStates.forEach(
(signature, methodState) -> {
- // TODO(b/190154391): Update resolution to take a signature.
- DexMethod methodFromSignature =
- appView
- .dexItemFactory()
- .createMethod(
- clazz.getType(), signature.getProto(), signature.getName());
SingleResolutionResult resolutionResult =
- appView
- .appInfo()
- .resolveMethodOn(clazz, methodFromSignature)
- .asSingleResolution();
+ appView.appInfo().resolveMethodOn(clazz, signature).asSingleResolution();
// Find the first virtual method in the super class hierarchy.
while (resolutionResult != null
@@ -119,10 +109,8 @@
resolutionResult =
appView
.appInfo()
- .resolveMethodOn(
- resolutionResult.getResolvedHolder().getSuperType(),
- methodFromSignature,
- false)
+ .resolveMethodOnClass(
+ signature, resolutionResult.getResolvedHolder().getSuperType())
.asSingleResolution();
}