Fix Machine Emulated Interface building
- Correctly merge emulated interface information
Change-Id: I594ec19f857ea1bac0d9ece6a0c1e2beb9536cff
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/EmulatedInterfaceDescriptor.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/EmulatedInterfaceDescriptor.java
index 80ca5b3..e3a9dff 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/EmulatedInterfaceDescriptor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/EmulatedInterfaceDescriptor.java
@@ -6,6 +6,7 @@
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexType;
+import com.google.common.collect.ImmutableMap;
import java.util.Map;
import java.util.Objects;
@@ -34,6 +35,18 @@
return emulatedMethods;
}
+ public EmulatedInterfaceDescriptor merge(EmulatedInterfaceDescriptor other) {
+ if (!rewrittenType.isIdenticalTo(other.getRewrittenType())) {
+ throw new UnsupportedOperationException(
+ "Emulated interface descriptor can only be merged on the same rewritten type.");
+ }
+ ImmutableMap.Builder<DexMethod, EmulatedDispatchMethodDescriptor> builder =
+ ImmutableMap.builder();
+ builder.putAll(getEmulatedMethods());
+ builder.putAll(other.getEmulatedMethods());
+ return new EmulatedInterfaceDescriptor(rewrittenType, builder.build());
+ }
+
@Override
public Object[] toJsonStruct(
MultiAPILevelMachineDesugaredLibrarySpecificationJsonExporter exporter) {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineRewritingFlags.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineRewritingFlags.java
index d27ba9b..f28dae7 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineRewritingFlags.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineRewritingFlags.java
@@ -362,8 +362,8 @@
emulatedVirtualRetargetThroughEmulatedInterface = ImmutableMap.builder();
private final ImmutableMap.Builder<DexMethod, DexMethod[]> apiGenericTypesConversion =
ImmutableMap.builder();
- private final ImmutableMap.Builder<DexType, EmulatedInterfaceDescriptor> emulatedInterfaces =
- ImmutableMap.builder();
+ private final Map<DexType, EmulatedInterfaceDescriptor> emulatedInterfaces =
+ new IdentityHashMap<>();
private final LinkedHashMap<DexType, WrapperDescriptor> wrappers = new LinkedHashMap<>();
private final ImmutableMap.Builder<DexType, DexType> legacyBackport = ImmutableMap.builder();
private final ImmutableSet.Builder<DexType> dontRetarget = ImmutableSet.builder();
@@ -409,8 +409,12 @@
nonEmulatedVirtualRetarget.put(src, dest);
}
- public void putEmulatedInterface(DexType src, EmulatedInterfaceDescriptor descriptor) {
- emulatedInterfaces.put(src, descriptor);
+ public void putEmulatedInterface(DexType src, EmulatedInterfaceDescriptor newDescriptor) {
+ assert newDescriptor != null;
+ EmulatedInterfaceDescriptor oldDescriptor = emulatedInterfaces.get(src);
+ EmulatedInterfaceDescriptor mergedDescriptor =
+ oldDescriptor == null ? newDescriptor : newDescriptor.merge(oldDescriptor);
+ emulatedInterfaces.put(src, mergedDescriptor);
}
public void putEmulatedVirtualRetarget(DexMethod src, EmulatedDispatchMethodDescriptor dest) {
@@ -487,7 +491,7 @@
emulatedVirtualRetarget.build(),
emulatedVirtualRetargetThroughEmulatedInterface.build(),
apiGenericTypesConversion.build(),
- emulatedInterfaces.build(),
+ ImmutableMap.copyOf(emulatedInterfaces),
wrappers,
legacyBackport.build(),
dontRetarget.build(),