Deterministic addition of forwarding methods.
Bug: 217727847
Change-Id: I5a96c135d8aea426badb8ae5d8c5837e3d2a09a2
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/ClassProcessor.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/ClassProcessor.java
index 33f7037..da7d679 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/ClassProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/ClassProcessor.java
@@ -42,6 +42,7 @@
import com.google.common.collect.ImmutableSet;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.Comparator;
import java.util.HashSet;
import java.util.IdentityHashMap;
import java.util.List;
@@ -408,11 +409,15 @@
// We introduce forwarding methods only once all desugaring has been performed to avoid
// confusing the look-up with inserted forwarding methods.
- public final void finalizeProcessing(InterfaceProcessingDesugaringEventConsumer eventConsumer) {
+ public void finalizeProcessing(InterfaceProcessingDesugaringEventConsumer eventConsumer) {
newSyntheticMethods.forEach(
(clazz, newForwardingMethods) -> {
- clazz.addVirtualMethods(newForwardingMethods.toDefinitionSet());
- newForwardingMethods.forEach(eventConsumer::acceptForwardingMethod);
+ List<ProgramMethod> sorted = new ArrayList<>(newForwardingMethods.toCollection());
+ sorted.sort(Comparator.comparing(ProgramMethod::getReference));
+ for (ProgramMethod method : sorted) {
+ clazz.addVirtualMethod(method.getDefinition());
+ eventConsumer.acceptForwardingMethod(method);
+ }
});
newExtraInterfaceSignatures.forEach(
(clazz, extraInterfaceSignatures) -> {
diff --git a/src/main/java/com/android/tools/r8/utils/collections/DexClassAndMethodSetBase.java b/src/main/java/com/android/tools/r8/utils/collections/DexClassAndMethodSetBase.java
index cc8bc7f..f42a8cd 100644
--- a/src/main/java/com/android/tools/r8/utils/collections/DexClassAndMethodSetBase.java
+++ b/src/main/java/com/android/tools/r8/utils/collections/DexClassAndMethodSetBase.java
@@ -8,6 +8,7 @@
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.utils.SetUtils;
+import java.util.Collection;
import java.util.IdentityHashMap;
import java.util.Iterator;
import java.util.Map;
@@ -96,6 +97,10 @@
return backing.values().stream();
}
+ public Collection<T> toCollection() {
+ return backing.values();
+ }
+
public Set<DexEncodedMethod> toDefinitionSet() {
assert backing instanceof IdentityHashMap;
return toDefinitionSet(SetUtils::newIdentityHashSet);