Revert "Add implementation of hashCode and equals to desugared library wrappers"
This reverts commit 0ecfae9f587838a137ef74208366d6b9eb2ed1cb.
Reason for revert: Doesn't compile!!!
Change-Id: Iaa01c810ac254dfce92612013e0f3601d58baa03
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryConversionCfProvider.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryConversionCfProvider.java
index 29ecfd2..ea0f8c0 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryConversionCfProvider.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryConversionCfProvider.java
@@ -41,8 +41,6 @@
import com.android.tools.r8.ir.desugar.desugaredlibrary.apiconversion.DesugaredLibraryWrapperSynthesizerEventConsumer.DesugaredLibraryClasspathWrapperSynthesizeEventConsumer;
import com.android.tools.r8.ir.desugar.desugaredlibrary.apiconversion.DesugaredLibraryWrapperSynthesizerEventConsumer.DesugaredLibraryL8ProgramWrapperSynthesizerEventConsumer;
import com.android.tools.r8.ir.synthetic.apiconverter.APIConversionCfCodeProvider;
-import com.android.tools.r8.ir.synthetic.apiconverter.EqualsCfCodeProvider;
-import com.android.tools.r8.ir.synthetic.apiconverter.HashCodeCfCodeProvider;
import com.android.tools.r8.utils.OptionalBool;
import java.util.ArrayList;
import java.util.Collection;
@@ -99,33 +97,6 @@
return wrapperSynthesizer.newSynthesizedMethod(methodToInstall, cfCode);
}
- public DexEncodedMethod generateWrapperHashCode(DexField wrapperField) {
- return wrapperSynthesizer.newSynthesizedMethod(
- appView
- .dexItemFactory()
- .createMethod(
- wrapperField.getHolderType(),
- appView.dexItemFactory().createProto(appView.dexItemFactory().intType),
- appView.dexItemFactory().hashCodeMethodName),
- new HashCodeCfCodeProvider(appView, wrapperField.getHolderType(), wrapperField)
- .generateCfCode());
- }
-
- public DexEncodedMethod generateWrapperEquals(DexField wrapperField) {
- return wrapperSynthesizer.newSynthesizedMethod(
- appView
- .dexItemFactory()
- .createMethod(
- wrapperField.getHolderType(),
- appView
- .dexItemFactory()
- .createProto(
- appView.dexItemFactory().booleanType, appView.dexItemFactory().objectType),
- appView.dexItemFactory().equalsMethodName),
- new EqualsCfCodeProvider(appView, wrapperField.getHolderType(), wrapperField)
- .generateCfCode());
- }
-
public DexEncodedMethod generateVivifiedWrapperConversionWithoutCode(
DexMethod method, DexField wrapperField) {
DexMethod methodToInstall =
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizer.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizer.java
index a930b12..5a34df5 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizer.java
@@ -42,7 +42,6 @@
import com.android.tools.r8.synthesis.SyntheticItems.SyntheticKindSelector;
import com.android.tools.r8.synthesis.SyntheticMethodBuilder;
import com.android.tools.r8.utils.StringDiagnostic;
-import com.google.common.collect.ImmutableList;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -633,13 +632,6 @@
return generatedMethods;
}
- private Collection<DexEncodedMethod> synthesizeHashCodeAndEquals(
- DexProgramClass wrapper, DexEncodedField wrapperField) {
- return ImmutableList.of(
- conversionCfProvider.generateWrapperHashCode(wrapperField.getReference()),
- conversionCfProvider.generateWrapperEquals(wrapperField.getReference()));
- }
-
DexEncodedMethod newSynthesizedMethod(DexMethod methodToInstall, Code code) {
MethodAccessFlags newFlags =
MethodAccessFlags.fromSharedAccessFlags(
@@ -760,7 +752,6 @@
field,
eventConsumer,
() -> processingContext.createUniqueContext(wrapper))));
- wrapper.addVirtualMethods(synthesizeHashCodeAndEquals(wrapper, wrapperField));
DexProgramClass vivifiedWrapper =
getExistingProgramWrapper(context, kinds -> kinds.VIVIFIED_WRAPPER);
DexEncodedField vivifiedWrapperField = getWrapperUniqueEncodedField(vivifiedWrapper);
@@ -774,7 +765,5 @@
field,
eventConsumer,
() -> processingContext.createUniqueContext(wrapper))));
- vivifiedWrapper.addVirtualMethods(
- synthesizeHashCodeAndEquals(vivifiedWrapper, vivifiedWrapperField));
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineWrapperConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineWrapperConverter.java
index c0d9157..18147b5 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineWrapperConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineWrapperConverter.java
@@ -70,11 +70,7 @@
while (!workList.isEmpty()) {
DexClass dexClass = workList.removeFirst();
for (DexEncodedMethod virtualMethod : dexClass.virtualMethods()) {
- if (!virtualMethod.isPrivateMethod()
- // Don't include hashCode and equals overrides, as hashCode and equals are added to
- // all wrappers regardless.
- && (!appInfo.dexItemFactory().objectMembers.hashCode.match(virtualMethod))
- && (!appInfo.dexItemFactory().objectMembers.equals.match(virtualMethod))) {
+ if (!virtualMethod.isPrivateMethod()) {
assert virtualMethod.isProtectedMethod() || virtualMethod.isPublicMethod();
boolean alreadyAdded = wrappers.contains(equivalence.wrap(virtualMethod.getReference()));
// This looks quadratic but given the size of the collections met in practice for
diff --git a/src/main/java/com/android/tools/r8/ir/synthetic/apiconverter/EqualsCfCodeProvider.java b/src/main/java/com/android/tools/r8/ir/synthetic/apiconverter/EqualsCfCodeProvider.java
deleted file mode 100644
index d6d86ce..0000000
--- a/src/main/java/com/android/tools/r8/ir/synthetic/apiconverter/EqualsCfCodeProvider.java
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.ir.synthetic.apiconverter;
-
-import com.android.tools.r8.cf.code.CfCheckCast;
-import com.android.tools.r8.cf.code.CfFrame;
-import com.android.tools.r8.cf.code.CfFrame.FrameType;
-import com.android.tools.r8.cf.code.CfGoto;
-import com.android.tools.r8.cf.code.CfIf;
-import com.android.tools.r8.cf.code.CfInstanceFieldRead;
-import com.android.tools.r8.cf.code.CfInstanceOf;
-import com.android.tools.r8.cf.code.CfInstruction;
-import com.android.tools.r8.cf.code.CfInvoke;
-import com.android.tools.r8.cf.code.CfLabel;
-import com.android.tools.r8.cf.code.CfLoad;
-import com.android.tools.r8.cf.code.CfReturn;
-import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.CfCode;
-import com.android.tools.r8.graph.DexField;
-import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.ir.code.If;
-import com.android.tools.r8.ir.code.ValueType;
-import com.android.tools.r8.ir.synthetic.SyntheticCfCodeProvider;
-import it.unimi.dsi.fastutil.ints.Int2ObjectAVLTreeMap;
-import java.util.ArrayDeque;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import org.objectweb.asm.Opcodes;
-
-public class EqualsCfCodeProvider extends SyntheticCfCodeProvider {
-
- private final DexField wrapperField;
-
- public EqualsCfCodeProvider(AppView<?> appView, DexType holder, DexField wrapperField) {
- super(appView, holder);
- this.wrapperField = wrapperField;
- }
-
- @Override
- public CfCode generateCfCode() {
- // return wrapperField.equals(
- // other instanceof WrapperType ? ((WrapperType) other).wrapperField : other);
- CfLabel label1 = new CfLabel();
- CfLabel label2 = new CfLabel();
- List<CfInstruction> instructions = new ArrayList<>();
- instructions.add(new CfLoad(ValueType.OBJECT, 0));
- instructions.add(new CfInstanceFieldRead(wrapperField));
- instructions.add(new CfLoad(ValueType.OBJECT, 1));
- DexType wrapperType = wrapperField.getHolderType();
- instructions.add(new CfInstanceOf(wrapperType));
- instructions.add(new CfIf(If.Type.EQ, ValueType.INT, label1));
- instructions.add(new CfLoad(ValueType.OBJECT, 1));
- instructions.add(new CfCheckCast(wrapperType));
- instructions.add(new CfInstanceFieldRead(wrapperField));
- instructions.add(new CfGoto(label2));
- instructions.add(label1);
- instructions.add(
- new CfFrame(
- new Int2ObjectAVLTreeMap<>(
- new int[] {0, 1},
- new FrameType[] {
- FrameType.initialized(wrapperType),
- FrameType.initialized(appView.dexItemFactory().objectType)
- }),
- new ArrayDeque<>(Arrays.asList(FrameType.initialized(wrapperType)))));
- instructions.add(new CfLoad(ValueType.OBJECT, 1));
- instructions.add(label2);
- instructions.add(
- new CfFrame(
- new Int2ObjectAVLTreeMap<>(
- new int[] {0, 1},
- new FrameType[] {
- FrameType.initialized(wrapperType),
- FrameType.initialized(appView.dexItemFactory().objectType)
- }),
- new ArrayDeque<>(
- Arrays.asList(
- FrameType.initialized(wrapperType),
- FrameType.initialized(appView.dexItemFactory().objectType)))));
- instructions.add(
- new CfInvoke(Opcodes.INVOKEVIRTUAL, appView.dexItemFactory().objectMembers.equals, false));
- instructions.add(new CfReturn(ValueType.INT));
- return standardCfCodeFromInstructions(instructions);
- }
-}
diff --git a/src/main/java/com/android/tools/r8/ir/synthetic/apiconverter/HashCodeCfCodeProvider.java b/src/main/java/com/android/tools/r8/ir/synthetic/apiconverter/HashCodeCfCodeProvider.java
deleted file mode 100644
index 3c5f717..0000000
--- a/src/main/java/com/android/tools/r8/ir/synthetic/apiconverter/HashCodeCfCodeProvider.java
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.ir.synthetic.apiconverter;
-
-import com.android.tools.r8.cf.code.CfInstanceFieldRead;
-import com.android.tools.r8.cf.code.CfInstruction;
-import com.android.tools.r8.cf.code.CfInvoke;
-import com.android.tools.r8.cf.code.CfLoad;
-import com.android.tools.r8.cf.code.CfReturn;
-import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.CfCode;
-import com.android.tools.r8.graph.DexField;
-import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.ir.code.ValueType;
-import com.android.tools.r8.ir.synthetic.SyntheticCfCodeProvider;
-import java.util.ArrayList;
-import java.util.List;
-import org.objectweb.asm.Opcodes;
-
-public class HashCodeCfCodeProvider extends SyntheticCfCodeProvider {
-
- private final DexField wrapperField;
-
- public HashCodeCfCodeProvider(AppView<?> appView, DexType holder, DexField wrapperField) {
- super(appView, holder);
- this.wrapperField = wrapperField;
- }
-
- @Override
- public CfCode generateCfCode() {
- List<CfInstruction> instructions = new ArrayList<>();
- instructions.add(new CfLoad(ValueType.OBJECT, 0));
- instructions.add(new CfInstanceFieldRead(wrapperField));
- instructions.add(
- new CfInvoke(
- Opcodes.INVOKEVIRTUAL, appView.dexItemFactory().objectMembers.hashCode, false));
- instructions.add(new CfReturn(ValueType.INT));
- return standardCfCodeFromInstructions(instructions);
- }
-}
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ClockAPIConversionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ClockAPIConversionTest.java
index 53edf4c..7827d8a 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ClockAPIConversionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ClockAPIConversionTest.java
@@ -34,9 +34,10 @@
private static final AndroidApiLevel MIN_SUPPORTED = AndroidApiLevel.O;
private static final String EXPECTED_RESULT =
StringUtils.lines("Z", "Z", "true", "Z", "Z", "true", "true", "true", "true", "true", "true");
- private static final String DESUGARED_LIBRARY_EXPECTED_RESULT =
+ // TODO(b/230800107): There should not be any unexpected results.
+ private static final String UNEXPECTED_RESULT =
StringUtils.lines(
- "Z", "Z", "true", "Z", "Z", "true", "true", "false", "false", "true", "true");
+ "Z", "Z", "true", "Z", "Z", "false", "true", "false", "false", "false", "false");
@Parameters(name = "{0}, spec: {1}, {2}")
public static List<Object[]> data() {
@@ -63,7 +64,7 @@
new CustomLibrarySpecification(CustomLibClass.class, MIN_SUPPORTED))
.addKeepMainRule(Executor.class)
.run(parameters.getRuntime(), Executor.class)
- .assertSuccessWithOutput(DESUGARED_LIBRARY_EXPECTED_RESULT);
+ .assertSuccessWithOutput(UNEXPECTED_RESULT);
}
@Test
@@ -115,8 +116,8 @@
System.out.println(CustomLibClass.getClockss()[0][0].getZone());
System.out.println(clock1.equals(CustomLibClass.getClock()));
System.out.println(localClock.equals(Clock.systemUTC()));
- System.out.println(localClock.equals(clock1)); // Prints false with desugared library.
- System.out.println(clock1.equals(localClock)); // Prints false with desugared library.
+ System.out.println(localClock.equals(clock1));
+ System.out.println(clock1.equals(localClock));
System.out.println(clock1.equals(CustomLibClass.getClocks()[0]));
System.out.println(clock1.equals(CustomLibClass.getClockss()[0][0]));
}
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/WrapperEqualityTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/WrapperEqualityTest.java
index 1353145..9135130 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/WrapperEqualityTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/WrapperEqualityTest.java
@@ -17,7 +17,6 @@
import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.StringUtils;
-import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -37,13 +36,10 @@
private static final AndroidApiLevel MIN_SUPPORTED = AndroidApiLevel.N;
private static final String EXPECTED_RESULT =
- StringUtils.lines(
- "true", "true", "true", "true", "true", "true", "true", "true", "false", "false", "1",
- "1", "2", "2", "1", "1", "1", "0", "true", "true", "true", "true");
- private static final String DESUGARED_LIBRARY_EXPECTED_RESULT =
- StringUtils.lines(
- "true", "true", "true", "true", "false", "true", "false", "true", "false", "false", "1",
- "1", "2", "2", "1", "1", "1", "0", "false", "true", "false", "true");
+ StringUtils.lines("true", "true", "1", "1", "2", "2", "1", "1", "1", "0");
+ // TODO(b/230800107): There should not be any unexpected results.
+ private static final String UNEXPECTED_RESULT =
+ StringUtils.lines("false", "false", "1", "2", "3", "4", "2", "2", "4", "4");
@Parameters(name = "{0}, spec: {1}, {2}")
public static List<Object[]> data() {
@@ -71,7 +67,7 @@
.addKeepMainRule(Executor.class)
.compile()
.run(parameters.getRuntime(), Executor.class)
- .assertSuccessWithOutput(DESUGARED_LIBRARY_EXPECTED_RESULT);
+ .assertSuccessWithOutput(UNEXPECTED_RESULT);
}
@Test
@@ -97,22 +93,8 @@
public static void main(String[] args) {
Consumer<Boolean> consumer = b -> {};
Supplier<Boolean> supplier = () -> Boolean.TRUE;
- // Prints true for desugared library as the same wrapper is used for both arguments.
- System.out.println(CustomLibClass.same(consumer, consumer));
System.out.println(CustomLibClass.equals(consumer, consumer));
- // Prints true for desugared library as the same wrapper is used for both arguments.
- System.out.println(CustomLibClass.same(supplier, supplier));
System.out.println(CustomLibClass.equals(supplier, supplier));
-
- CustomLibClass.setConsumer(consumer);
- CustomLibClass.setSupplier(supplier);
- System.out.println(CustomLibClass.same(consumer));
- System.out.println(CustomLibClass.equals(consumer));
- System.out.println(CustomLibClass.same(supplier));
- System.out.println(CustomLibClass.equals(supplier));
- System.out.println(CustomLibClass.equalsWithObject(consumer, new HashMap<>()));
- System.out.println(CustomLibClass.equalsWithObject(supplier, new ArrayList<>()));
-
CustomLibClass.register(consumer, new Object());
System.out.println(CustomLibClass.registrations());
CustomLibClass.register(consumer, new Object());
@@ -127,19 +109,6 @@
System.out.println(CustomLibClass.registrations());
CustomLibClass.unregister(supplier);
System.out.println(CustomLibClass.registrations());
-
- // Prints false for desugared library as wrappers does not keep identity.
- System.out.println(
- CustomLibClass.getConsumerFromPlatform() == CustomLibClass.getConsumerFromPlatform());
- System.out.println(
- CustomLibClass.getConsumerFromPlatform()
- .equals(CustomLibClass.getConsumerFromPlatform()));
- // Prints false for desugared library as wrappers does not keep identity.
- System.out.println(
- CustomLibClass.getSupplierFromPlatform() == CustomLibClass.getSupplierFromPlatform());
- System.out.println(
- CustomLibClass.getSupplierFromPlatform()
- .equals(CustomLibClass.getSupplierFromPlatform()));
}
}
@@ -147,59 +116,14 @@
// This class is convenient for easy testing. Each method plays the role of methods in the
// platform APIs for which argument/return values need conversion.
static class CustomLibClass {
- private static final Map<Object, Object> map = new HashMap<>();
- private static final Consumer<Boolean> consumer = b -> {};
- private static final Supplier<Boolean> supplier = () -> Boolean.TRUE;
+ static Map<Object, Object> map = new HashMap<>();
- private static Consumer<Boolean> appConsumer;
- private static Supplier<Boolean> appSupplier;
-
- public static boolean equals(Consumer<Boolean> consumer1, Consumer<Boolean> consumer2) {
- return consumer1.equals(consumer2) && consumer2.equals(consumer1);
+ public static boolean equals(Consumer<Boolean> listener1, Consumer<Boolean> listene2) {
+ return listener1.equals(listene2) && listene2.equals(listener1);
}
- public static boolean equals(Supplier<Boolean> supplier1, Supplier<Boolean> supplier2) {
- return supplier1.equals(supplier2) && supplier2.equals(supplier1);
- }
-
- public static boolean same(Consumer<Boolean> consumer1, Consumer<Boolean> consumer2) {
- return consumer1.equals(consumer2) && consumer2.equals(consumer1);
- }
-
- public static boolean same(Supplier<Boolean> supplier1, Supplier<Boolean> supplier2) {
- return supplier1.equals(supplier2) && supplier2.equals(supplier1);
- }
-
- public static void setConsumer(Consumer<Boolean> consumer) {
- appConsumer = consumer;
- }
-
- public static void setSupplier(Supplier supplier) {
- appSupplier = supplier;
- }
-
- public static boolean equals(Consumer<Boolean> consumer) {
- return consumer.equals(appConsumer) && appConsumer.equals(consumer);
- }
-
- public static boolean equals(Supplier<Boolean> supplier) {
- return supplier.equals(appSupplier) && appSupplier.equals(supplier);
- }
-
- public static boolean same(Consumer<Boolean> consumer) {
- return appConsumer == consumer;
- }
-
- public static boolean same(Supplier supplier) {
- return appSupplier == supplier;
- }
-
- public static boolean equalsWithObject(Consumer<Boolean> consumer, Object object) {
- return consumer.equals(object);
- }
-
- public static boolean equalsWithObject(Supplier<Boolean> supplier, Object object) {
- return supplier.equals(object);
+ public static boolean equals(Supplier<Boolean> listener1, Supplier<Boolean> listene2) {
+ return listener1.equals(listene2) && listene2.equals(listener1);
}
public static void register(Consumer<Boolean> listener, Object context) {
@@ -229,13 +153,5 @@
public static long suppliers() {
return map.keySet().stream().filter(k -> k instanceof Supplier).count();
}
-
- public static Supplier<Boolean> getSupplierFromPlatform() {
- return supplier;
- }
-
- public static Consumer<Boolean> getConsumerFromPlatform() {
- return consumer;
- }
}
}