Correctly synthesize references
Bug: b/378780054
Change-Id: Id5db5d28c0e507ac9f4cd3a42f55a5ebb65bb677
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordCfMethods.java b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordCfMethods.java
index 3743f0c..2084f67 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordCfMethods.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordCfMethods.java
@@ -42,45 +42,9 @@
public final class RecordCfMethods {
public static void registerSynthesizedCodeReferences(DexItemFactory factory) {
- factory.createSynthesizedType("Ljava/util/Arrays;");
factory.createSynthesizedType("[Ljava/lang/Object;");
factory.createSynthesizedType("[Ljava/lang/String;");
}
-
- public static CfCode RecordMethods_hashCode(DexItemFactory factory, DexMethod method) {
- CfLabel label0 = new CfLabel();
- CfLabel label1 = new CfLabel();
- return new CfCode(
- method.holder,
- 2,
- 2,
- ImmutableList.of(
- label0,
- new CfConstNumber(31, ValueType.INT),
- new CfLoad(ValueType.OBJECT, 1),
- new CfInvoke(
- 184,
- factory.createMethod(
- factory.createType("Ljava/util/Arrays;"),
- factory.createProto(factory.intType, factory.createType("[Ljava/lang/Object;")),
- factory.createString("hashCode")),
- false),
- new CfArithmeticBinop(CfArithmeticBinop.Opcode.Mul, NumericType.INT),
- new CfLoad(ValueType.OBJECT, 0),
- new CfInvoke(
- 182,
- factory.createMethod(
- factory.objectType,
- factory.createProto(factory.intType),
- factory.createString("hashCode")),
- false),
- new CfArithmeticBinop(CfArithmeticBinop.Opcode.Add, NumericType.INT),
- new CfReturn(ValueType.INT),
- label1),
- ImmutableList.of(),
- ImmutableList.of());
- }
-
public static CfCode RecordMethods_toString(DexItemFactory factory, DexMethod method) {
CfLabel label0 = new CfLabel();
CfLabel label1 = new CfLabel();
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordInstructionDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordInstructionDesugaring.java
index f484a69..aae2fe6 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordInstructionDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordInstructionDesugaring.java
@@ -45,7 +45,6 @@
import com.android.tools.r8.ir.desugar.records.RecordDesugaringEventConsumer.RecordInstructionDesugaringEventConsumer;
import com.android.tools.r8.ir.desugar.records.RecordRewriterHelper.RecordInvokeDynamic;
import com.android.tools.r8.ir.synthetic.RecordCfCodeProvider.RecordEqCfCodeProvider;
-import com.android.tools.r8.ir.synthetic.RecordCfCodeProvider.RecordEqualsCfCodeProvider;
import com.android.tools.r8.ir.synthetic.RecordCfCodeProvider.RecordGetFieldsAsObjectsCfCodeProvider;
import com.android.tools.r8.ir.synthetic.RecordCfCodeProvider.RecordHashCfCodeProvider;
import com.android.tools.r8.ir.synthetic.SyntheticCfCodeProvider;
@@ -103,8 +102,8 @@
public static void registerSynthesizedCodeReferences(DexItemFactory factory) {
RecordCfMethods.registerSynthesizedCodeReferences(factory);
RecordGetFieldsAsObjectsCfCodeProvider.registerSynthesizedCodeReferences(factory);
- RecordEqualsCfCodeProvider.registerSynthesizedCodeReferences(factory);
- factory.createSynthesizedType("Ljava/lang/Objects;");
+ RecordEqCfCodeProvider.registerSynthesizedCodeReferences(factory);
+ RecordHashCfCodeProvider.registerSynthesizedCodeReferences(factory);
}
@Override
diff --git a/src/main/java/com/android/tools/r8/ir/synthetic/RecordCfCodeProvider.java b/src/main/java/com/android/tools/r8/ir/synthetic/RecordCfCodeProvider.java
index 8ba50fe..c4bb758 100644
--- a/src/main/java/com/android/tools/r8/ir/synthetic/RecordCfCodeProvider.java
+++ b/src/main/java/com/android/tools/r8/ir/synthetic/RecordCfCodeProvider.java
@@ -293,75 +293,4 @@
}
}
}
-
- public static class RecordEqualsCfCodeProvider extends SyntheticCfCodeProvider {
-
- private final DexMethod getFieldsAsObjects;
-
- public RecordEqualsCfCodeProvider(
- AppView<?> appView, DexType holder, DexMethod getFieldsAsObjects) {
- super(appView, holder);
- this.getFieldsAsObjects = getFieldsAsObjects;
- }
-
- public static void registerSynthesizedCodeReferences(DexItemFactory factory) {
- factory.createSynthesizedType("[Ljava/lang/Object;");
- factory.createSynthesizedType("[Ljava/util/Arrays;");
- }
-
- @Override
- public CfCode generateCfCode() {
- // This generates something along the lines of:
- // if (other == null) {
- // return false;
- // }
- // if (this.getClass() != other.getClass()) {
- // return false;
- // }
- // return Arrays.equals(
- // recordInstance.getFieldsAsObjects(),
- // ((RecordClass) other).getFieldsAsObjects());
- DexItemFactory factory = appView.dexItemFactory();
- int numberOfInstructions = 22;
- List<CfInstruction> instructions = new ArrayList<>(numberOfInstructions);
- CfLabel notNullLabel = new CfLabel();
- CfLabel fieldCmp = new CfLabel();
- ValueType recordType = ValueType.fromDexType(getHolder());
- ValueType objectType = ValueType.fromDexType(factory.objectType);
- instructions.add(new CfLoad(objectType, 1));
- instructions.add(new CfIf(IfType.NE, ValueType.OBJECT, notNullLabel));
- instructions.add(new CfConstNumber(0, ValueType.INT));
- instructions.add(new CfReturn(ValueType.INT));
- instructions.add(notNullLabel);
- instructions.add(
- CfFrame.builder()
- .appendLocal(FrameType.initialized(getHolder()))
- .appendLocal(FrameType.initialized(appView.dexItemFactory().objectType))
- .build());
- instructions.add(new CfLoad(recordType, 0));
- instructions.add(new CfInvoke(Opcodes.INVOKEVIRTUAL, factory.objectMembers.getClass, false));
- instructions.add(new CfLoad(objectType, 1));
- instructions.add(new CfInvoke(Opcodes.INVOKEVIRTUAL, factory.objectMembers.getClass, false));
- instructions.add(new CfIfCmp(IfType.EQ, ValueType.OBJECT, fieldCmp));
- instructions.add(new CfConstNumber(0, ValueType.INT));
- instructions.add(new CfReturn(ValueType.INT));
- instructions.add(fieldCmp);
- instructions.add(
- CfFrame.builder()
- .appendLocal(FrameType.initialized(getHolder()))
- .appendLocal(FrameType.initialized(appView.dexItemFactory().objectType))
- .build());
- instructions.add(new CfLoad(recordType, 0));
- instructions.add(new CfInvoke(Opcodes.INVOKESPECIAL, getFieldsAsObjects, false));
- instructions.add(new CfLoad(objectType, 1));
- instructions.add(new CfCheckCast(getHolder(), true));
- instructions.add(new CfInvoke(Opcodes.INVOKESPECIAL, getFieldsAsObjects, false));
- instructions.add(
- new CfInvoke(
- Opcodes.INVOKESTATIC, factory.javaUtilArraysMethods.equalsObjectArray, false));
- instructions.add(new CfReturn(ValueType.INT));
- assert instructions.size() == numberOfInstructions;
- return standardCfCodeFromInstructions(instructions);
- }
- }
}
diff --git a/src/test/java/com/android/tools/r8/desugar/records/RecordMethods.java b/src/test/java/com/android/tools/r8/desugar/records/RecordMethods.java
index f00657c..5ec2331 100644
--- a/src/test/java/com/android/tools/r8/desugar/records/RecordMethods.java
+++ b/src/test/java/com/android/tools/r8/desugar/records/RecordMethods.java
@@ -4,8 +4,6 @@
package com.android.tools.r8.desugar.records;
-import java.util.Arrays;
-
// This class implements support methods for record desugaring. The RecordRewriter
// rewrites relevant calls to one of the following methods.
public class RecordMethods {
@@ -25,8 +23,4 @@
builder.append("]");
return builder.toString();
}
-
- public static int hashCode(Class<?> recordClass, Object[] recordFieldsAsObjects) {
- return 31 * Arrays.hashCode(recordFieldsAsObjects) + recordClass.hashCode();
- }
}