Use sorted method backing when ensuring fixed class
Bug: 190567248
Change-Id: I60e3b13176c8c7473d6524ec87bb43f5e9eb05c7
diff --git a/src/main/java/com/android/tools/r8/graph/MethodCollection.java b/src/main/java/com/android/tools/r8/graph/MethodCollection.java
index 35e0541..635132f 100644
--- a/src/main/java/com/android/tools/r8/graph/MethodCollection.java
+++ b/src/main/java/com/android/tools/r8/graph/MethodCollection.java
@@ -7,6 +7,7 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
+import java.util.Comparator;
import java.util.List;
import java.util.Set;
import java.util.function.Consumer;
@@ -137,7 +138,7 @@
public List<DexEncodedMethod> allMethodsSorted() {
List<DexEncodedMethod> sorted = new ArrayList<>(size());
forEachMethod(sorted::add);
- sorted.sort((a, b) -> a.getReference().compareTo(b.getReference()));
+ sorted.sort(Comparator.comparing(DexEncodedMember::getReference));
return sorted;
}
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticClassBuilder.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticClassBuilder.java
index 65c510c..737ffa6 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticClassBuilder.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticClassBuilder.java
@@ -43,6 +43,7 @@
private DexType superType;
private DexTypeList interfaces = DexTypeList.empty();
private DexString sourceFile = null;
+ private boolean useSortedMethodBacking = false;
private List<DexEncodedField> staticFields = new ArrayList<>();
private List<DexEncodedField> instanceFields = new ArrayList<>();
private List<DexEncodedMethod> directMethods = new ArrayList<>();
@@ -143,6 +144,11 @@
return self();
}
+ public B setUseSortedMethodBacking(boolean useSortedMethodBacking) {
+ this.useSortedMethodBacking = useSortedMethodBacking;
+ return self();
+ }
+
public C build() {
int flag = isAbstract ? Constants.ACC_ABSTRACT : Constants.ACC_FINAL;
int itfFlag = isInterface ? Constants.ACC_INTERFACE : 0;
@@ -167,27 +173,34 @@
+ 11 * (long) virtualMethods.hashCode()
+ 13 * (long) staticFields.hashCode()
+ 17 * (long) instanceFields.hashCode();
- return getClassKind()
- .create(
- type,
- originKind,
- origin,
- accessFlags,
- superType,
- interfaces,
- sourceFile,
- nestHost,
- nestMembers,
- enclosingMembers,
- innerClasses,
- signature,
- DexAnnotationSet.empty(),
- staticFields.toArray(DexEncodedField.EMPTY_ARRAY),
- instanceFields.toArray(DexEncodedField.EMPTY_ARRAY),
- directMethods.toArray(DexEncodedMethod.EMPTY_ARRAY),
- virtualMethods.toArray(DexEncodedMethod.EMPTY_ARRAY),
- factory.getSkipNameValidationForTesting(),
- c -> checksum,
- null);
+ C clazz =
+ getClassKind()
+ .create(
+ type,
+ originKind,
+ origin,
+ accessFlags,
+ superType,
+ interfaces,
+ sourceFile,
+ nestHost,
+ nestMembers,
+ enclosingMembers,
+ innerClasses,
+ signature,
+ DexAnnotationSet.empty(),
+ staticFields.toArray(DexEncodedField.EMPTY_ARRAY),
+ instanceFields.toArray(DexEncodedField.EMPTY_ARRAY),
+ DexEncodedMethod.EMPTY_ARRAY,
+ DexEncodedMethod.EMPTY_ARRAY,
+ factory.getSkipNameValidationForTesting(),
+ c -> checksum,
+ null);
+ if (useSortedMethodBacking) {
+ clazz.getMethodCollection().useSortedBacking();
+ }
+ clazz.setDirectMethods(directMethods.toArray(DexEncodedMethod.EMPTY_ARRAY));
+ clazz.setVirtualMethods(virtualMethods.toArray(DexEncodedMethod.EMPTY_ARRAY));
+ return clazz;
}
}
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
index 2d0970f..3bd99a2 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
@@ -541,7 +541,15 @@
}
assert !isSyntheticClass(type);
DexProgramClass dexProgramClass =
- internalCreateClass(kind, fn, outerContext, type, appView.dexItemFactory());
+ internalCreateClass(
+ kind,
+ syntheticProgramClassBuilder -> {
+ syntheticProgramClassBuilder.setUseSortedMethodBacking(true);
+ fn.accept(syntheticProgramClassBuilder);
+ },
+ outerContext,
+ type,
+ appView.dexItemFactory());
onCreationConsumer.accept(dexProgramClass);
return dexProgramClass;
}