Merge commit 'e554cce584ccf03601d97ce6d4f34230a3177f39' into dev-release
diff --git a/src/main/java/com/android/tools/r8/D8.java b/src/main/java/com/android/tools/r8/D8.java
index 06f5379..43868c3 100644
--- a/src/main/java/com/android/tools/r8/D8.java
+++ b/src/main/java/com/android/tools/r8/D8.java
@@ -17,8 +17,6 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexApplication;
import com.android.tools.r8.graph.DexProgramClass;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.LazyLoadedDexApplication;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.analysis.ClassInitializerAssertionEnablingAnalysis;
@@ -280,7 +278,7 @@
if (options.isGeneratingClassFiles()) {
finalizeApplication(appView, executor);
- new CfApplicationWriter(appView, marker, GraphLens.getIdentityLens(), namingLens)
+ new CfApplicationWriter(appView, marker, namingLens)
.write(options.getClassFileConsumer(), inputApp);
} else {
if (!hasDexResources || !hasClassResources || !appView.typeRewriter.isRewriting()) {
@@ -332,8 +330,6 @@
new ApplicationWriter(
appView,
marker == null ? null : ImmutableList.copyOf(markers),
- appView.graphLens(),
- InitClassLens.getThrowingInstance(),
namingLens)
.write(executor, inputApp);
}
@@ -393,8 +389,6 @@
new ApplicationWriter(
appView,
null,
- GraphLens.getIdentityLens(),
- InitClassLens.getThrowingInstance(),
desugaringLens,
convertedCfFiles)
.write(executor);
diff --git a/src/main/java/com/android/tools/r8/DexFileMergerHelper.java b/src/main/java/com/android/tools/r8/DexFileMergerHelper.java
index d8e8e69..a31f3f7 100644
--- a/src/main/java/com/android/tools/r8/DexFileMergerHelper.java
+++ b/src/main/java/com/android/tools/r8/DexFileMergerHelper.java
@@ -13,8 +13,6 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexApplication;
import com.android.tools.r8.graph.DexProgramClass;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.naming.NamingLens;
import com.android.tools.r8.utils.AndroidApp;
import com.android.tools.r8.utils.ExceptionUtils;
@@ -105,8 +103,6 @@
new ApplicationWriter(
appView,
markers,
- GraphLens.getIdentityLens(),
- InitClassLens.getThrowingInstance(),
NamingLens.getIdentityLens());
writer.write(executor);
options.printWarnings();
diff --git a/src/main/java/com/android/tools/r8/DexSplitterHelper.java b/src/main/java/com/android/tools/r8/DexSplitterHelper.java
index fdcdaf2..a7ac9e3 100644
--- a/src/main/java/com/android/tools/r8/DexSplitterHelper.java
+++ b/src/main/java/com/android/tools/r8/DexSplitterHelper.java
@@ -14,8 +14,6 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexApplication;
import com.android.tools.r8.graph.DexProgramClass;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.LazyLoadedDexApplication;
import com.android.tools.r8.naming.ClassNameMapper;
import com.android.tools.r8.naming.NamingLens;
@@ -112,8 +110,6 @@
new ApplicationWriter(
appView,
markers,
- GraphLens.getIdentityLens(),
- InitClassLens.getThrowingInstance(),
NamingLens.getIdentityLens(),
consumer)
.write(executor);
diff --git a/src/main/java/com/android/tools/r8/GenerateLintFiles.java b/src/main/java/com/android/tools/r8/GenerateLintFiles.java
index dde847a..303b540 100644
--- a/src/main/java/com/android/tools/r8/GenerateLintFiles.java
+++ b/src/main/java/com/android/tools/r8/GenerateLintFiles.java
@@ -30,7 +30,6 @@
import com.android.tools.r8.graph.FieldAccessFlags;
import com.android.tools.r8.graph.GenericSignature.ClassSignature;
import com.android.tools.r8.graph.GenericSignature.MethodTypeSignature;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.LazyLoadedDexApplication;
import com.android.tools.r8.graph.MethodAccessFlags;
import com.android.tools.r8.graph.MethodCollection.MethodCollectionFactory;
@@ -349,7 +348,6 @@
new CfApplicationWriter(
appView,
options.getMarker(Tool.L8),
- GraphLens.getIdentityLens(),
NamingLens.getIdentityLens());
ClassFileConsumer consumer =
new ClassFileConsumer.ArchiveConsumer(
diff --git a/src/main/java/com/android/tools/r8/L8.java b/src/main/java/com/android/tools/r8/L8.java
index 430d811..48e8729 100644
--- a/src/main/java/com/android/tools/r8/L8.java
+++ b/src/main/java/com/android/tools/r8/L8.java
@@ -146,7 +146,7 @@
NamingLens namingLens = PrefixRewritingNamingLens.createPrefixRewritingNamingLens(appView);
new GenericSignatureRewriter(appView, namingLens).run(appView.appInfo().classes(), executor);
- new CfApplicationWriter(appView, options.getMarker(Tool.L8), appView.graphLens(), namingLens)
+ new CfApplicationWriter(appView, options.getMarker(Tool.L8), namingLens)
.write(options.getClassFileConsumer());
options.printWarnings();
} catch (ExecutionException e) {
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index 7d177cd..885ada8 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -36,7 +36,6 @@
import com.android.tools.r8.graph.GenericSignatureContextBuilder;
import com.android.tools.r8.graph.GenericSignatureCorrectnessHelper;
import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ProgramDefinition;
import com.android.tools.r8.graph.PrunedItems;
import com.android.tools.r8.graph.SubtypingInfo;
@@ -212,8 +211,6 @@
static void writeApplication(
ExecutorService executorService,
AppView<?> appView,
- GraphLens graphLens,
- InitClassLens initClassLens,
NamingLens namingLens,
InternalOptions options,
AndroidApp inputApp)
@@ -227,15 +224,13 @@
Set<Marker> markers = new HashSet<>(options.itemFactory.extractMarkers());
markers.remove(marker);
if (options.isGeneratingClassFiles()) {
- new CfApplicationWriter(appView, marker, graphLens, namingLens)
+ new CfApplicationWriter(appView, marker, namingLens)
.write(options.getClassFileConsumer(), inputApp);
} else {
new ApplicationWriter(
appView,
// Ensure that the marker for this compilation is the first in the list.
ImmutableList.<Marker>builder().add(marker).addAll(markers).build(),
- graphLens,
- initClassLens,
namingLens)
.write(executorService, inputApp);
}
@@ -844,8 +839,6 @@
writeApplication(
executorService,
appView,
- appView.graphLens(),
- appView.initClassLens(),
namingLens,
options,
inputApp);
diff --git a/src/main/java/com/android/tools/r8/bisect/Bisect.java b/src/main/java/com/android/tools/r8/bisect/Bisect.java
index 262300f..d9dd999 100644
--- a/src/main/java/com/android/tools/r8/bisect/Bisect.java
+++ b/src/main/java/com/android/tools/r8/bisect/Bisect.java
@@ -14,8 +14,6 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexApplication;
import com.android.tools.r8.graph.DexProgramClass;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.naming.NamingLens;
import com.android.tools.r8.utils.AndroidApp;
import com.android.tools.r8.utils.AndroidAppConsumers;
@@ -192,8 +190,6 @@
new ApplicationWriter(
AppView.createForD8(AppInfo.createInitialAppInfo(app)),
null,
- GraphLens.getIdentityLens(),
- InitClassLens.getThrowingInstance(),
NamingLens.getIdentityLens());
writer.write(executor);
options.signalFinishedToConsumers();
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 58748cd..3bb7190 100644
--- a/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
+++ b/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
@@ -39,8 +39,6 @@
import com.android.tools.r8.graph.DexValue;
import com.android.tools.r8.graph.DexWritableCode;
import com.android.tools.r8.graph.EnclosingMethodAttribute;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.InnerClassAttribute;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.graph.ParameterAnnotationsList;
@@ -81,8 +79,6 @@
public class ApplicationWriter {
public final AppView<?> appView;
- public final GraphLens graphLens;
- public final InitClassLens initClassLens;
public final NamingLens namingLens;
public final InternalOptions options;
private final CodeToKeep desugaredLibraryCodeToKeep;
@@ -158,14 +154,10 @@
public ApplicationWriter(
AppView<?> appView,
List<Marker> markers,
- GraphLens graphLens,
- InitClassLens initClassLens,
NamingLens namingLens) {
this(
appView,
markers,
- graphLens,
- initClassLens,
namingLens,
null);
}
@@ -173,16 +165,12 @@
public ApplicationWriter(
AppView<?> appView,
List<Marker> markers,
- GraphLens graphLens,
- InitClassLens initClassLens,
NamingLens namingLens,
DexIndexedConsumer consumer) {
this.appView = appView;
this.options = appView.options();
this.desugaredLibraryCodeToKeep = CodeToKeep.createCodeToKeep(options, namingLens);
this.markers = markers;
- this.graphLens = graphLens;
- this.initClassLens = initClassLens;
this.namingLens = namingLens;
this.programConsumer = consumer;
this.isTypeMissing =
@@ -297,7 +285,8 @@
Timing fileTiming = Timing.create("VirtualFile " + virtualFile.getId(), options);
computeOffsetMappingAndRewriteJumboStrings(
virtualFile, lazyDexStrings, fileTiming);
- DebugRepresentation.computeForFile(virtualFile, graphLens, namingLens, options);
+ DebugRepresentation.computeForFile(
+ virtualFile, appView.graphLens(), namingLens, options);
fileTiming.end();
return fileTiming;
},
@@ -351,7 +340,7 @@
// Fail if there are pending errors, e.g., the program consumers may have reported errors.
options.reporter.failIfPendingErrors();
// Supply info to all additional resource consumers.
- supplyAdditionalConsumers(appView.appInfo().app(), appView, graphLens, namingLens, options);
+ supplyAdditionalConsumers(appView.appInfo().app(), appView, namingLens, options);
} finally {
timing.end();
}
@@ -455,8 +444,7 @@
return;
}
timing.begin("Compute object offset mapping");
- virtualFile.computeMapping(
- appView, graphLens, namingLens, initClassLens, lazyDexStrings.size(), timing);
+ virtualFile.computeMapping(appView, namingLens, lazyDexStrings.size(), timing);
timing.end();
timing.begin("Rewrite jumbo strings");
rewriteCodeWithJumboStrings(
@@ -521,7 +509,6 @@
public static void supplyAdditionalConsumers(
DexApplication application,
AppView<?> appView,
- GraphLens graphLens,
NamingLens namingLens,
InternalOptions options) {
if (options.configurationConsumer != null) {
@@ -540,7 +527,7 @@
if (dataResourceConsumer != null) {
ImmutableList<DataResourceProvider> dataResourceProviders = application.dataResourceProviders;
ResourceAdapter resourceAdapter =
- new ResourceAdapter(appView, application.dexItemFactory, graphLens, namingLens, options);
+ new ResourceAdapter(appView, application.dexItemFactory, namingLens, options);
adaptAndPassDataResources(
options, dataResourceConsumer, dataResourceProviders, resourceAdapter);
@@ -575,8 +562,7 @@
for (DataResourceProvidersAndConsumer entry :
options.featureSplitConfiguration.getDataResourceProvidersAndConsumers()) {
ResourceAdapter resourceAdapter =
- new ResourceAdapter(
- appView, application.dexItemFactory, graphLens, namingLens, options);
+ new ResourceAdapter(appView, application.dexItemFactory, namingLens, options);
adaptAndPassDataResources(
options, entry.getConsumer(), entry.getProviders(), resourceAdapter);
}
diff --git a/src/main/java/com/android/tools/r8/dex/InheritanceClassInDexDistributor.java b/src/main/java/com/android/tools/r8/dex/InheritanceClassInDexDistributor.java
index 1183590..92671f2 100644
--- a/src/main/java/com/android/tools/r8/dex/InheritanceClassInDexDistributor.java
+++ b/src/main/java/com/android/tools/r8/dex/InheritanceClassInDexDistributor.java
@@ -10,8 +10,6 @@
import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.naming.NamingLens;
import com.android.tools.r8.utils.ThreadUtils;
import com.google.common.collect.Maps;
@@ -71,7 +69,7 @@
public void updateNumbersOfIds() {
// Use a temporary VirtualFile to evaluate the number of ids in the group.
- VirtualFile virtualFile = new VirtualFile(0, appView, graphLens, initClassLens, namingLens);
+ VirtualFile virtualFile = new VirtualFile(0, appView, namingLens);
// Note: sort not needed.
for (DexProgramClass clazz : members) {
virtualFile.addClass(clazz);
@@ -285,9 +283,7 @@
private final BitSet fullDex = new BitSet();
private final Set<DexProgramClass> classes;
private final AppView<?> appView;
- private int dexIndexOffset;
- private final GraphLens graphLens;
- private final InitClassLens initClassLens;
+ private final int dexIndexOffset;
private final NamingLens namingLens;
private final DirectSubClassesInfo directSubClasses;
@@ -296,8 +292,6 @@
List<VirtualFile> dexes,
Set<DexProgramClass> classes,
int dexIndexOffset,
- GraphLens graphLens,
- InitClassLens initClassLens,
NamingLens namingLens,
AppView<?> appView,
ExecutorService executorService) {
@@ -305,8 +299,6 @@
this.dexes = dexes;
this.classes = classes;
this.dexIndexOffset = dexIndexOffset;
- this.graphLens = graphLens;
- this.initClassLens = initClassLens;
this.namingLens = namingLens;
this.appView = appView;
this.executorService = executorService;
@@ -378,8 +370,7 @@
}
private Collection<VirtualFile> assignGroup(ClassGroup group, List<VirtualFile> exclude) {
- VirtualFileCycler cycler =
- new VirtualFileCycler(dexes, appView, graphLens, initClassLens, namingLens, dexIndexOffset);
+ VirtualFileCycler cycler = new VirtualFileCycler(dexes, appView, namingLens, dexIndexOffset);
if (group.members.isEmpty()) {
return Collections.emptyList();
} else if (group.canFitInOneDex()) {
@@ -428,8 +419,7 @@
Collections.sort(layers);
Collection<VirtualFile> usedDex = new ArrayList<>();
- VirtualFileCycler cycler =
- new VirtualFileCycler(dexes, appView, graphLens, initClassLens, namingLens, dexIndexOffset);
+ VirtualFileCycler cycler = new VirtualFileCycler(dexes, appView, namingLens, dexIndexOffset);
// Don't modify exclude. Think about modifying the input collection considering this
// is private API.
Set<VirtualFile> currentExclude = new HashSet<>(exclude);
diff --git a/src/main/java/com/android/tools/r8/dex/ResourceAdapter.java b/src/main/java/com/android/tools/r8/dex/ResourceAdapter.java
index 29987e7..eaf736d 100644
--- a/src/main/java/com/android/tools/r8/dex/ResourceAdapter.java
+++ b/src/main/java/com/android/tools/r8/dex/ResourceAdapter.java
@@ -40,12 +40,11 @@
public ResourceAdapter(
AppView<?> appView,
DexItemFactory dexItemFactory,
- GraphLens graphLens,
NamingLens namingLens,
InternalOptions options) {
this.appView = appView;
this.dexItemFactory = dexItemFactory;
- this.graphLens = graphLens;
+ this.graphLens = appView.graphLens();
this.namingLens = namingLens;
this.options = options;
}
diff --git a/src/main/java/com/android/tools/r8/dex/VirtualFile.java b/src/main/java/com/android/tools/r8/dex/VirtualFile.java
index a085223..7d88ac7 100644
--- a/src/main/java/com/android/tools/r8/dex/VirtualFile.java
+++ b/src/main/java/com/android/tools/r8/dex/VirtualFile.java
@@ -79,44 +79,35 @@
VirtualFile(
int id,
AppView<?> appView,
- GraphLens graphLens,
- InitClassLens initClassLens,
NamingLens namingLens) {
- this(id, appView, graphLens, initClassLens, namingLens, null, null);
+ this(id, appView, namingLens, null, null);
}
VirtualFile(
int id,
AppView<?> appView,
- GraphLens graphLens,
- InitClassLens initClassLens,
NamingLens namingLens,
FeatureSplit featureSplit) {
- this(id, appView, graphLens, initClassLens, namingLens, null, featureSplit);
+ this(id, appView, namingLens, null, featureSplit);
}
private VirtualFile(
int id,
AppView<?> appView,
- GraphLens graphLens,
- InitClassLens initClassLens,
NamingLens namingLens,
DexProgramClass primaryClass) {
- this(id, appView, graphLens, initClassLens, namingLens, primaryClass, null);
+ this(id, appView, namingLens, primaryClass, null);
}
private VirtualFile(
int id,
AppView<?> appView,
- GraphLens graphLens,
- InitClassLens initClassLens,
NamingLens namingLens,
DexProgramClass primaryClass,
FeatureSplit featureSplit) {
this.id = id;
- this.indexedItems = new VirtualFileIndexedItemCollection(graphLens, initClassLens, namingLens);
- this.transaction =
- new IndexedItemTransaction(indexedItems, appView, graphLens, initClassLens, namingLens);
+ this.indexedItems = new VirtualFileIndexedItemCollection(appView, namingLens);
+ this.transaction = new IndexedItemTransaction(indexedItems, appView, namingLens);
this.primaryClass = primaryClass;
this.featureSplit = featureSplit;
}
@@ -221,9 +212,7 @@
public void computeMapping(
AppView<?> appView,
- GraphLens graphLens,
NamingLens namingLens,
- InitClassLens initClassLens,
int lazyDexStringsCount,
Timing timing) {
assert transaction.isEmpty();
@@ -231,9 +220,7 @@
objectMapping =
new ObjectToOffsetMapping(
appView,
- graphLens,
namingLens,
- initClassLens,
transaction.rewriter,
indexedItems.classes,
indexedItems.protos,
@@ -351,8 +338,6 @@
new VirtualFile(
virtualFiles.size(),
writer.appView,
- writer.graphLens,
- writer.initClassLens,
writer.namingLens,
clazz);
virtualFiles.add(file);
@@ -390,9 +375,7 @@
this.options = options;
// Create the primary dex file. The distribution will add more if needed.
- mainDexFile =
- new VirtualFile(
- 0, writer.appView, writer.graphLens, writer.initClassLens, writer.namingLens);
+ mainDexFile = new VirtualFile(0, writer.appView, writer.namingLens);
assert virtualFiles.isEmpty();
virtualFiles.add(mainDexFile);
addMarkers(mainDexFile);
@@ -506,8 +489,6 @@
new VirtualFile(
0,
writer.appView,
- writer.graphLens,
- writer.initClassLens,
writer.namingLens,
featureSplitSetEntry.getKey());
virtualFiles.add(featureFile);
@@ -522,8 +503,6 @@
featureClasses,
originalNames,
0,
- writer.graphLens,
- writer.initClassLens,
writer.namingLens,
options)
.call();
@@ -557,9 +536,7 @@
assert !virtualFiles.get(0).isEmpty();
assert virtualFiles.size() == 1;
// The main dex file is filtered out, so ensure at least one file for the remaining classes.
- virtualFiles.add(
- new VirtualFile(
- 1, writer.appView, writer.graphLens, writer.initClassLens, writer.namingLens));
+ virtualFiles.add(new VirtualFile(1, writer.appView, writer.namingLens));
filesForDistribution = virtualFiles.subList(1, virtualFiles.size());
fileIndexOffset = 1;
}
@@ -573,8 +550,6 @@
filesForDistribution,
classes,
fileIndexOffset,
- writer.graphLens,
- writer.initClassLens,
writer.namingLens,
writer.appView,
executorService)
@@ -589,8 +564,6 @@
classes,
originalNames,
fileIndexOffset,
- writer.graphLens,
- writer.initClassLens,
writer.namingLens,
options)
.call();
@@ -642,10 +615,9 @@
private final Set<DexCallSite> callSites = Sets.newIdentityHashSet();
private final Set<DexMethodHandle> methodHandles = Sets.newIdentityHashSet();
- public VirtualFileIndexedItemCollection(
- GraphLens graphLens, InitClassLens initClassLens, NamingLens namingLens) {
- this.graphLens = graphLens;
- this.initClassLens = initClassLens;
+ public VirtualFileIndexedItemCollection(AppView<?> appView, NamingLens namingLens) {
+ this.graphLens = appView.graphLens();
+ this.initClassLens = appView.initClassLens();
this.namingLens = namingLens;
}
@@ -732,8 +704,8 @@
public static class IndexedItemTransaction implements IndexedItemCollection {
+ private final AppView<?> appView;
private final VirtualFileIndexedItemCollection base;
- private final GraphLens graphLens;
private final InitClassLens initClassLens;
private final NamingLens namingLens;
private final LensCodeRewriterUtils rewriter;
@@ -750,12 +722,10 @@
private IndexedItemTransaction(
VirtualFileIndexedItemCollection base,
AppView<?> appView,
- GraphLens graphLens,
- InitClassLens initClassLens,
NamingLens namingLens) {
+ this.appView = appView;
this.base = base;
- this.graphLens = graphLens;
- this.initClassLens = initClassLens;
+ this.initClassLens = appView.initClassLens();
this.namingLens = namingLens;
this.rewriter = new LensCodeRewriterUtils(appView, true);
}
@@ -769,7 +739,7 @@
}
void addClassAndDependencies(DexProgramClass clazz) {
- clazz.collectIndexedItems(this, graphLens, rewriter);
+ clazz.collectIndexedItems(this, getGraphLens(), rewriter);
}
@Override
@@ -815,7 +785,7 @@
@Override
public GraphLens getGraphLens() {
- return graphLens;
+ return appView.graphLens();
}
@Override
@@ -901,8 +871,6 @@
private final List<VirtualFile> files;
private final AppView<?> appView;
- private final GraphLens graphLens;
- private final InitClassLens initClassLens;
private final NamingLens namingLens;
private int nextFileId;
@@ -913,14 +881,10 @@
VirtualFileCycler(
List<VirtualFile> files,
AppView<?> appView,
- GraphLens graphLens,
- InitClassLens initClassLens,
NamingLens namingLens,
int fileIndexOffset) {
this.files = files;
this.appView = appView;
- this.graphLens = graphLens;
- this.initClassLens = initClassLens;
this.namingLens = namingLens;
nextFileId = files.size() + fileIndexOffset;
@@ -951,9 +915,7 @@
if (hasNext()) {
return activeFiles.next();
} else {
- VirtualFile newFile =
- new VirtualFile(
- nextFileId++, appView, graphLens, initClassLens, namingLens, featuresplit);
+ VirtualFile newFile = new VirtualFile(nextFileId++, appView, namingLens, featuresplit);
files.add(newFile);
allFilesCyclic = Iterators.cycle(files);
return newFile;
@@ -984,9 +946,7 @@
}
VirtualFile addFile() {
- VirtualFile newFile =
- new VirtualFile(
- nextFileId++, appView, graphLens, initClassLens, namingLens, featuresplit);
+ VirtualFile newFile = new VirtualFile(nextFileId++, appView, namingLens, featuresplit);
files.add(newFile);
reset();
@@ -1030,17 +990,13 @@
Set<DexProgramClass> classes,
Map<DexProgramClass, String> originalNames,
int fileIndexOffset,
- GraphLens graphLens,
- InitClassLens initClassLens,
NamingLens namingLens,
InternalOptions options) {
this.classes = new ArrayList<>(classes);
this.originalNames = originalNames;
this.dexItemFactory = appView.dexItemFactory();
this.options = options;
- this.cycler =
- new VirtualFileCycler(
- files, appView, graphLens, initClassLens, namingLens, fileIndexOffset);
+ this.cycler = new VirtualFileCycler(files, appView, namingLens, fileIndexOffset);
}
static boolean coveredByPrefix(String originalName, String currentPrefix) {
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 fcdafdd..3d987c1 100644
--- a/src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java
+++ b/src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java
@@ -54,9 +54,7 @@
public ObjectToOffsetMapping(
AppView<?> appView,
- GraphLens graphLens,
NamingLens namingLens,
- InitClassLens initClassLens,
LensCodeRewriterUtils lensCodeRewriter,
Collection<DexProgramClass> classes,
Collection<DexProto> protos,
@@ -69,7 +67,6 @@
int lazyDexStringsCount,
Timing timing) {
assert appView != null;
- assert graphLens != null;
assert classes != null;
assert protos != null;
assert types != null;
@@ -78,12 +75,11 @@
assert strings != null;
assert callSites != null;
assert methodHandles != null;
- assert initClassLens != null;
this.lazyDexStringsCount = lazyDexStringsCount;
this.appView = appView;
- this.graphLens = graphLens;
+ this.graphLens = appView.graphLens();
this.namingLens = namingLens;
- this.initClassLens = initClassLens;
+ this.initClassLens = appView.initClassLens();
this.lensCodeRewriter = lensCodeRewriter;
timing.begin("Sort strings");
this.strings =
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java b/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
index 3d91587..27298a9 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
@@ -23,6 +23,7 @@
import com.android.tools.r8.graph.DexProto;
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.graph.DexValue.DexValueNull;
import com.android.tools.r8.graph.FieldAccessFlags;
import com.android.tools.r8.graph.MethodAccessFlags;
import com.android.tools.r8.graph.MethodResolutionResult;
@@ -33,11 +34,14 @@
import com.android.tools.r8.ir.desugar.lambda.ForcefullyMovedLambdaMethodConsumer;
import com.android.tools.r8.ir.desugar.lambda.LambdaInstructionDesugaring;
import com.android.tools.r8.ir.desugar.lambda.LambdaInstructionDesugaring.DesugarInvoke;
+import com.android.tools.r8.ir.optimize.info.OptimizationFeedback;
+import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackSimple;
import com.android.tools.r8.synthesis.SyntheticProgramClassBuilder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.function.Consumer;
+import org.objectweb.asm.Opcodes;
/**
* Represents lambda class generated for a lambda descriptor in context of lambda instantiation
@@ -60,11 +64,15 @@
public static final String JAVAC_EXPECTED_LAMBDA_METHOD_PREFIX = "lambda$";
public static final String R8_LAMBDA_ACCESSOR_METHOD_PREFIX = "$r8$lambda$";
+ private static final OptimizationFeedback feedback = OptimizationFeedbackSimple.getInstance();
+
final AppView<?> appView;
final LambdaInstructionDesugaring desugaring;
public final DexType type;
public LambdaDescriptor descriptor;
public final DexMethod constructor;
+ final DexMethod classConstructor;
+ public final DexField lambdaField;
public final Target target;
// Considered final but is set after due to circularity in allocation.
@@ -91,6 +99,16 @@
this.target = createTarget(accessedFrom);
+ boolean statelessSingleton = isStatelessSingleton();
+ this.classConstructor =
+ statelessSingleton
+ ? factory.createMethod(type, constructorProto, factory.classConstructorMethodName)
+ : null;
+ this.lambdaField =
+ statelessSingleton
+ ? factory.createField(type, type, factory.lambdaInstanceFieldName)
+ : null;
+
// Synthesize the program class once all fields are set.
synthesizeLambdaClass(builder, desugarInvoke);
}
@@ -114,12 +132,13 @@
private void synthesizeLambdaClass(
SyntheticProgramClassBuilder builder, DesugarInvoke desugarInvoke) {
builder.setInterfaces(descriptor.interfaces);
+ synthesizeStaticFields(builder);
synthesizeInstanceFields(builder);
synthesizeDirectMethods(builder);
synthesizeVirtualMethods(builder, desugarInvoke);
}
- DexField getCaptureField(int index) {
+ final DexField getCaptureField(int index) {
return appView
.dexItemFactory()
.createField(
@@ -128,6 +147,10 @@
appView.dexItemFactory().createString("f$" + index));
}
+ public final boolean isStatelessSingleton() {
+ return appView.options().createSingletonsForStatelessLambdas && descriptor.isStateless();
+ }
+
// Synthesize virtual methods.
private void synthesizeVirtualMethods(
SyntheticProgramClassBuilder builder, DesugarInvoke desugarInvoke) {
@@ -172,19 +195,39 @@
// Synthesize direct methods.
private void synthesizeDirectMethods(SyntheticProgramClassBuilder builder) {
+ boolean statelessSingleton = isStatelessSingleton();
+ List<DexEncodedMethod> methods = new ArrayList<>(statelessSingleton ? 2 : 1);
+
// Constructor.
MethodAccessFlags accessFlags =
MethodAccessFlags.fromSharedAccessFlags(
- Constants.ACC_PUBLIC | Constants.ACC_SYNTHETIC, true);
- DexEncodedMethod method =
+ (statelessSingleton ? Constants.ACC_PRIVATE : Constants.ACC_PUBLIC)
+ | Constants.ACC_SYNTHETIC,
+ true);
+ methods.add(
DexEncodedMethod.syntheticBuilder()
.setMethod(constructor)
.setAccessFlags(accessFlags)
.setCode(LambdaConstructorSourceCode.build(this))
// The api level is computed when tracing.
.disableAndroidApiLevelCheck()
- .build();
- builder.setDirectMethods(Collections.singletonList(method));
+ .build());
+
+ // Class constructor for stateless lambda classes.
+ if (statelessSingleton) {
+ methods.add(
+ DexEncodedMethod.syntheticBuilder()
+ .setMethod(classConstructor)
+ .setAccessFlags(
+ MethodAccessFlags.fromSharedAccessFlags(
+ Constants.ACC_SYNTHETIC | Constants.ACC_STATIC, true))
+ .setCode(LambdaClassConstructorSourceCode.build(this))
+ // The api level is computed when tracing.
+ .disableAndroidApiLevelCheck()
+ .build());
+ feedback.classInitializerMayBePostponed(methods.get(1));
+ }
+ builder.setDirectMethods(methods);
}
// Synthesize instance fields to represent captured values.
@@ -207,6 +250,43 @@
builder.setInstanceFields(fields);
}
+ // Synthesize static fields to represent singleton instance.
+ private void synthesizeStaticFields(SyntheticProgramClassBuilder builder) {
+ if (isStatelessSingleton()) {
+ // Create instance field for stateless lambda.
+ assert this.lambdaField != null;
+ builder.setStaticFields(
+ Collections.singletonList(
+ DexEncodedField.syntheticBuilder()
+ .setField(this.lambdaField)
+ .setAccessFlags(
+ FieldAccessFlags.fromSharedAccessFlags(
+ Constants.ACC_PUBLIC
+ | Constants.ACC_FINAL
+ | Constants.ACC_SYNTHETIC
+ | Constants.ACC_STATIC))
+ .setStaticValue(DexValueNull.NULL)
+ // The api level is computed when tracing.
+ .disableAndroidApiLevelCheck()
+ .build()));
+ }
+ }
+
+ public static int getAsmOpcodeForInvokeType(MethodHandleType type) {
+ switch (type) {
+ case INVOKE_INTERFACE:
+ return Opcodes.INVOKEINTERFACE;
+ case INVOKE_STATIC:
+ return Opcodes.INVOKESTATIC;
+ case INVOKE_DIRECT:
+ return Opcodes.INVOKESPECIAL;
+ case INVOKE_INSTANCE:
+ return Opcodes.INVOKEVIRTUAL;
+ default:
+ throw new Unreachable("Unexpected method handle type: " + type);
+ }
+ }
+
// Creates a delegation target for this particular lambda class. Note that we
// should always be able to create targets for the lambdas we support.
private Target createTarget(ProgramMethod accessedFrom) {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/LambdaClassConstructorSourceCode.java b/src/main/java/com/android/tools/r8/ir/desugar/LambdaClassConstructorSourceCode.java
new file mode 100644
index 0000000..ddcb68d
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaClassConstructorSourceCode.java
@@ -0,0 +1,35 @@
+// Copyright (c) 2017, 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.desugar;
+
+import com.android.tools.r8.cf.code.CfInvoke;
+import com.android.tools.r8.cf.code.CfNew;
+import com.android.tools.r8.cf.code.CfReturnVoid;
+import com.android.tools.r8.cf.code.CfStackInstruction;
+import com.android.tools.r8.cf.code.CfStackInstruction.Opcode;
+import com.android.tools.r8.cf.code.CfStaticFieldWrite;
+import com.android.tools.r8.graph.CfCode;
+import com.google.common.collect.ImmutableList;
+import org.objectweb.asm.Opcodes;
+
+// Source code representing synthesized lambda class constructor.
+// Used for stateless lambdas to instantiate singleton instance.
+final class LambdaClassConstructorSourceCode {
+
+ public static CfCode build(LambdaClass lambda) {
+ int maxStack = 2;
+ int maxLocals = 0;
+ return new CfCode(
+ lambda.type,
+ maxStack,
+ maxLocals,
+ ImmutableList.of(
+ new CfNew(lambda.type),
+ new CfStackInstruction(Opcode.Dup),
+ new CfInvoke(Opcodes.INVOKESPECIAL, lambda.constructor, false),
+ new CfStaticFieldWrite(lambda.lambdaField, lambda.lambdaField),
+ new CfReturnVoid()));
+ }
+}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/LambdaDescriptor.java b/src/main/java/com/android/tools/r8/ir/desugar/LambdaDescriptor.java
index e72af99..bc7a544 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/LambdaDescriptor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaDescriptor.java
@@ -190,6 +190,15 @@
}
}
+ public Iterable<DexType> getReferencedBaseTypes(DexItemFactory dexItemFactory) {
+ return enforcedProto.getBaseTypes(dexItemFactory);
+ }
+
+ /** Is a stateless lambda, i.e. lambda does not capture any values */
+ final boolean isStateless() {
+ return captures.isEmpty();
+ }
+
/** Checks if call site needs a accessor when referenced from `accessedFrom`. */
boolean needsAccessor(ProgramMethod accessedFrom) {
if (implHandle.type.isInvokeInterface()) {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/lambda/LambdaInstructionDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/lambda/LambdaInstructionDesugaring.java
index e305984..f7e8d1a 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/lambda/LambdaInstructionDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/lambda/LambdaInstructionDesugaring.java
@@ -11,6 +11,7 @@
import com.android.tools.r8.cf.code.CfNew;
import com.android.tools.r8.cf.code.CfStackInstruction;
import com.android.tools.r8.cf.code.CfStackInstruction.Opcode;
+import com.android.tools.r8.cf.code.CfStaticFieldRead;
import com.android.tools.r8.cf.code.CfStore;
import com.android.tools.r8.contexts.CompilationContext.MethodProcessingContext;
import com.android.tools.r8.graph.AppView;
@@ -31,6 +32,7 @@
import com.android.tools.r8.ir.desugar.LocalStackAllocator;
import com.android.tools.r8.synthesis.SyntheticNaming;
import com.android.tools.r8.utils.Box;
+import com.google.common.collect.ImmutableList;
import com.google.common.collect.Sets;
import java.util.ArrayDeque;
import java.util.Collection;
@@ -119,6 +121,11 @@
eventConsumer.acceptLambdaClass(lambdaClass, context);
+ if (lambdaClass.isStatelessSingleton()) {
+ return ImmutableList.of(
+ new CfStaticFieldRead(lambdaClass.lambdaField, lambdaClass.lambdaField));
+ }
+
DexTypeList captureTypes = lambdaClass.descriptor.captures;
Deque<CfInstruction> replacement = new ArrayDeque<>(3 + captureTypes.size() * 2);
replacement.add(new CfNew(lambdaClass.getType()));
diff --git a/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java b/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java
index 98057dd..1332bf7 100644
--- a/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java
+++ b/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java
@@ -35,7 +35,6 @@
import com.android.tools.r8.graph.DexValue.DexValueArray;
import com.android.tools.r8.graph.DexValue.DexValueInt;
import com.android.tools.r8.graph.DexValue.DexValueString;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.InnerClassAttribute;
import com.android.tools.r8.graph.NestMemberClassAttribute;
import com.android.tools.r8.graph.ParameterAnnotationsList;
@@ -87,7 +86,6 @@
private final DexApplication application;
private final AppView<?> appView;
- private final GraphLens graphLens;
private final NamingLens namingLens;
private final InternalOptions options;
private final Marker marker;
@@ -95,11 +93,9 @@
private static final CfVersion MIN_VERSION_FOR_COMPILER_GENERATED_CODE = CfVersion.V1_6;
- public CfApplicationWriter(
- AppView<?> appView, Marker marker, GraphLens graphLens, NamingLens namingLens) {
+ public CfApplicationWriter(AppView<?> appView, Marker marker, NamingLens namingLens) {
this.application = appView.appInfo().app();
this.appView = appView;
- this.graphLens = graphLens;
this.namingLens = namingLens;
this.options = appView.options();
assert marker != null;
@@ -180,8 +176,7 @@
e.getCodeSize()));
}
}
- ApplicationWriter.supplyAdditionalConsumers(
- application, appView, graphLens, namingLens, options);
+ ApplicationWriter.supplyAdditionalConsumers(application, appView, namingLens, options);
}
private void writeClass(
diff --git a/src/main/java/com/android/tools/r8/relocator/Relocator.java b/src/main/java/com/android/tools/r8/relocator/Relocator.java
index d0836d7..cd3adfe 100644
--- a/src/main/java/com/android/tools/r8/relocator/Relocator.java
+++ b/src/main/java/com/android/tools/r8/relocator/Relocator.java
@@ -15,7 +15,6 @@
import com.android.tools.r8.graph.AppServices;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexApplication;
-import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.jar.CfApplicationWriter;
import com.android.tools.r8.naming.NamingLens;
import com.android.tools.r8.naming.signature.GenericSignatureRewriter;
@@ -88,8 +87,7 @@
new GenericSignatureRewriter(appView, namingLens).run(appInfo.classes(), executor);
- new CfApplicationWriter(
- appView, new Marker(Tool.Relocator), GraphLens.getIdentityLens(), namingLens)
+ new CfApplicationWriter(appView, new Marker(Tool.Relocator), namingLens)
.write(command.getConsumer());
options.printWarnings();
} catch (ExecutionException e) {
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index 12e0a78..e359381 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -360,6 +360,11 @@
// Boolean value indicating that byte code pass through may be enabled.
public boolean enableCfByteCodePassThrough = false;
+ // Flag to control the representation of stateless lambdas.
+ // See b/222081665 for context.
+ public boolean createSingletonsForStatelessLambdas =
+ System.getProperty("com.android.tools.r8.createSingletonsForStatelessLambdas") != null;
+
// Contain the contents of the build properties file from the compiler command.
public DumpOptions dumpOptions;
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index 548279c..e0bb322 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -23,8 +23,6 @@
import com.android.tools.r8.graph.DexApplication;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DirectMappedDexApplication;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.naming.NamingLens;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.position.Position;
@@ -2256,13 +2254,11 @@
R8.writeApplication(
Executors.newSingleThreadExecutor(),
appView,
- GraphLens.getIdentityLens(),
- InitClassLens.getThrowingInstance(),
NamingLens.getIdentityLens(),
options,
null);
}
-
+
public static void disassemble(AndroidApp app, PrintStream ps) throws IOException {
DexApplication application =
new ApplicationReader(app, new InternalOptions(), Timing.empty()).read().toDirect();
diff --git a/src/test/java/com/android/tools/r8/dex/DebugByteCodeWriterTest.java b/src/test/java/com/android/tools/r8/dex/DebugByteCodeWriterTest.java
index 9c4c113..63dd7ed 100644
--- a/src/test/java/com/android/tools/r8/dex/DebugByteCodeWriterTest.java
+++ b/src/test/java/com/android/tools/r8/dex/DebugByteCodeWriterTest.java
@@ -16,7 +16,6 @@
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.ObjectToOffsetMapping;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.naming.NamingLens;
@@ -51,9 +50,7 @@
.build()));
return new ObjectToOffsetMapping(
appView,
- GraphLens.getIdentityLens(),
NamingLens.getIdentityLens(),
- InitClassLens.getThrowingInstance(),
new LensCodeRewriterUtils(appView),
Collections.emptyList(),
Collections.emptyList(),
@@ -70,7 +67,7 @@
@Test
public void testEmptyDebugInfo() {
DexDebugInfo debugInfo =
- new EventBasedDebugInfo(1, DexString.EMPTY_ARRAY, new DexDebugEvent[] {});
+ new EventBasedDebugInfo(1, DexString.EMPTY_ARRAY, DexDebugEvent.EMPTY_ARRAY);
DebugBytecodeWriter writer =
new DebugBytecodeWriter(
DexDebugInfo.convertToWritable(debugInfo),
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java
index 6031ece..249e78d 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java
@@ -48,8 +48,6 @@
import com.android.tools.r8.graph.DexTypeList;
import com.android.tools.r8.graph.DirectMappedDexApplication;
import com.android.tools.r8.graph.GenericSignature.ClassSignature;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.graph.MethodAccessFlags;
import com.android.tools.r8.graph.MethodCollection.MethodCollectionFactory;
import com.android.tools.r8.graph.ProgramMethod;
@@ -883,8 +881,6 @@
new ApplicationWriter(
AppView.createForD8(AppInfo.createInitialAppInfo(application)),
null,
- GraphLens.getIdentityLens(),
- InitClassLens.getThrowingInstance(),
NamingLens.getIdentityLens());
ExecutorService executor = ThreadUtils.getExecutorService(options);
AndroidAppConsumers compatSink = new AndroidAppConsumers(options);
diff --git a/src/test/java/com/android/tools/r8/utils/Smali.java b/src/test/java/com/android/tools/r8/utils/Smali.java
index bdeecf4..ae1fdbf 100644
--- a/src/test/java/com/android/tools/r8/utils/Smali.java
+++ b/src/test/java/com/android/tools/r8/utils/Smali.java
@@ -11,8 +11,6 @@
import com.android.tools.r8.graph.AppInfo;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexApplication;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
import com.android.tools.r8.naming.NamingLens;
import com.android.tools.r8.origin.Origin;
import com.google.common.collect.ImmutableList;
@@ -117,8 +115,6 @@
new ApplicationWriter(
AppView.createForD8(AppInfo.createInitialAppInfo(dexApp)),
null,
- GraphLens.getIdentityLens(),
- InitClassLens.getThrowingInstance(),
NamingLens.getIdentityLens());
writer.write(executor);
return consumer.contents;