Rewrite Objects.hash(Object...) to Arrays.hashCode(Object[])
Test: tools/test.py --no-internal -v *Backport*Test*
Change-Id: Idbe05bd785ae2442a4e08b869e39296bda512691
diff --git a/src/main/java/com/android/tools/r8/graph/DexItemFactory.java b/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
index 7b5344b..d3afa6c 100644
--- a/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
+++ b/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
@@ -219,6 +219,7 @@
public final DexString supplierDescriptor = createString("Ljava/util/function/Supplier;");
public final DexString consumerDescriptor = createString("Ljava/util/function/Consumer;");
public final DexString runnableDescriptor = createString("Ljava/lang/Runnable;");
+ public final DexString arraysDescriptor = createString("Ljava/util/Arrays;");
public final DexString throwableDescriptor = createString(throwableDescriptorString);
public final DexString illegalAccessErrorDescriptor =
@@ -561,7 +562,7 @@
private JavaUtilArraysMethods() {
asList =
createMethod(
- createString("Ljava/util/Arrays;"),
+ arraysDescriptor,
createString("asList"),
listDescriptor,
new DexString[] {objectArrayDescriptor});
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
index 84ca11d..c424e06 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
@@ -343,7 +343,7 @@
name = factory.createString("hash");
proto = factory.createProto(factory.intType, factory.objectArrayType);
method = factory.createMethod(type, proto, name);
- addProvider(new MethodGenerator(method, ObjectsMethods::new));
+ addProvider(new InvokeRewriter(method, ObjectsMethods::rewriteToArraysHashCode));
// int Objects.hashCode(Object o)
name = factory.createString("hashCode");
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/backports/ObjectsMethods.java b/src/main/java/com/android/tools/r8/ir/desugar/backports/ObjectsMethods.java
index 6ac64e9..a4ea1b5 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/backports/ObjectsMethods.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/backports/ObjectsMethods.java
@@ -6,8 +6,10 @@
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.code.InstructionListIterator;
import com.android.tools.r8.ir.code.InvokeMethod;
+import com.android.tools.r8.ir.code.InvokeStatic;
import com.android.tools.r8.ir.code.InvokeVirtual;
import com.android.tools.r8.ir.synthetic.TemplateMethodCode;
import com.android.tools.r8.utils.InternalOptions;
@@ -62,8 +64,14 @@
return a == b || (a != null && a.equals(b));
}
- public static int hash(Object[] o) {
- return Arrays.hashCode(o);
+ public static void rewriteToArraysHashCode(InvokeMethod invoke, InstructionListIterator iterator,
+ DexItemFactory factory) {
+ DexType arraysType = factory.createType(factory.arraysDescriptor);
+ DexMethod hashCodeMethod =
+ factory.createMethod(arraysType, invoke.getInvokedMethod().proto, "hashCode");
+ InvokeStatic arraysHashCode =
+ new InvokeStatic(hashCodeMethod, invoke.outValue(), invoke.inValues(), false);
+ iterator.replaceCurrentInstruction(arraysHashCode);
}
public static int hashCode(Object o) {