Avoid some spurious allocations.
Bug:
Change-Id: I6ecc0ee1619fe11fed9a407ed016a6807e3f99a4
diff --git a/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java b/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
index 945632f..3bedf08 100644
--- a/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
+++ b/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
@@ -129,6 +129,23 @@
this.proguardSeedsData = proguardSeedsData;
}
+ private Iterable<VirtualFile> distribute()
+ throws ExecutionException, IOException, DexOverflowException {
+ // Distribute classes into dex files.
+ VirtualFile.Distributor distributor;
+ if (options.outputMode == OutputMode.FilePerInputClass) {
+ distributor = new VirtualFile.FilePerInputClassDistributor(this);
+ } else if (!options.canUseMultidex()
+ && options.mainDexKeepRules.isEmpty()
+ && application.mainDexList.isEmpty()) {
+ distributor = new VirtualFile.MonoDexDistributor(this, options);
+ } else {
+ distributor = new VirtualFile.FillFilesDistributor(this, options);
+ }
+
+ return distributor.run();
+ }
+
public void write(OutputSink outputSink, ExecutorService executorService)
throws IOException, ExecutionException, DexOverflowException {
application.timing.begin("DexApplication.write");
@@ -139,24 +156,12 @@
SortAnnotations sortAnnotations = new SortAnnotations();
application.classes().forEach((clazz) -> clazz.addDependencies(sortAnnotations));
- // Distribute classes into dex files.
- VirtualFile.Distributor distributor;
- if (options.outputMode == OutputMode.FilePerInputClass) {
- distributor = new VirtualFile.FilePerInputClassDistributor(this);
- } else if (!options.canUseMultidex()
- && options.mainDexKeepRules.isEmpty()
- && application.mainDexList.isEmpty()) {
- distributor = new VirtualFile.MonoDexDistributor(this, options);
- } else {
- distributor = new VirtualFile.FillFilesDistributor(this, options);
- }
-
// Collect the indexed items sets for all files and perform JumboString processing.
// This is required to ensure that shared code blocks have a single and consistent code
// item that is valid for all dex files.
// Use a linked hash map as the order matters when addDexProgramData is called below.
Map<VirtualFile, Future<ObjectToOffsetMapping>> offsetMappingFutures = new LinkedHashMap<>();
- for (VirtualFile newFile : distributor.run()) {
+ for (VirtualFile newFile : distribute()) {
assert !newFile.isEmpty();
if (!newFile.isEmpty()) {
offsetMappingFutures
diff --git a/src/main/java/com/android/tools/r8/dex/FileWriter.java b/src/main/java/com/android/tools/r8/dex/FileWriter.java
index 020580f..0bfe0a8 100644
--- a/src/main/java/com/android/tools/r8/dex/FileWriter.java
+++ b/src/main/java/com/android/tools/r8/dex/FileWriter.java
@@ -1233,9 +1233,13 @@
return lookup(code, codes);
}
- private <T> void setOffsetFor(T item, int offset, Map<T, Integer> table) {
- Integer old = table.put(item, offset);
- assert old != null;
+ private <T> void setOffsetFor(T item, int offset, Object2IntMap<T> map) {
+ int old = map.put(item, offset);
+ assert old <= NOT_SET;
+ }
+
+ private <T> void setOffsetFor(T item, int offset, Reference2IntMap<T> map) {
+ int old = map.put(item, offset);
assert old <= NOT_SET;
}
diff --git a/src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java b/src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java
index 8cf4fbb..c7fc65d 100644
--- a/src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java
+++ b/src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java
@@ -78,7 +78,7 @@
if (items.isEmpty()) {
return null;
}
- Reference2IntMap<T> map = new Reference2IntLinkedOpenHashMap<>();
+ Reference2IntMap<T> map = new Reference2IntLinkedOpenHashMap<>(items.size());
map.defaultReturnValue(NOT_FOUND);
Collection<T> sorted = sort ? items.stream().sorted().collect(Collectors.toList()) : items;
int index = 0;