Reduce map lookups in BackportedMethodRewriter
Test: tools/test.py --no-internal -v *Backport*Test*
Change-Id: I149ec9459463d9b527d731773fb643908b013211
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
index b47dced..4298d1b 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
@@ -64,14 +64,14 @@
public static final String UTILITY_CLASS_NAME_PREFIX = "$r8$backportedMethods$utility";
private static final String UTILITY_CLASS_DESCRIPTOR_PREFIX = "L" + UTILITY_CLASS_NAME_PREFIX;
- private final Set<DexType> holders = Sets.newConcurrentHashSet();
private final AppView<?> appView;
private final IRConverter converter;
private final DexItemFactory factory;
private final RewritableMethods rewritableMethods;
- private Map<DexMethod, MethodProvider> methodProviders = new ConcurrentHashMap<>();
+ private final Set<DexType> holders = Sets.newConcurrentHashSet();
+ private final Map<DexMethod, MethodProvider> methodProviders = new ConcurrentHashMap<>();
public BackportedMethodRewriter(AppView<?> appView, IRConverter converter) {
this.appView = appView;
@@ -157,13 +157,11 @@
ClassAccessFlags.fromSharedAccessFlags(Constants.ACC_PUBLIC | Constants.ACC_SYNTHETIC);
// Generate the utility classes in a loop since utility classes can require the
// the creation of other utility classes.
- // Function multiplyExact(long int) calls multiplyExact(long long) for example.
+ // Function multiplyExact(long, int) calls multiplyExact(long, long) for example.
while (!methodProviders.isEmpty()) {
- DexMethod key = methodProviders.keySet().iterator().next();
- MethodProvider provider = methodProviders.get(key);
- methodProviders.remove(key);
+ DexMethod method = methodProviders.keySet().iterator().next();
+ MethodProvider provider = methodProviders.remove(method);
assert provider.requiresGenerationOfCode();
- DexMethod method = provider.provideMethod(appView);
// The utility class could have been synthesized, e.g., running R8 then D8,
// or if already processed in this while loop.
if (appView.definitionFor(method.holder) != null) {
@@ -226,12 +224,12 @@
return rewritableMethods.getProvider(original);
}
- public static final class RewritableMethods {
+ private static final class RewritableMethods {
// Map backported method to a provider for creating the actual target method (with code).
private final Map<DexMethod, MethodProvider> rewritable = new IdentityHashMap<>();
- public RewritableMethods(InternalOptions options, AppView<?> appView) {
+ RewritableMethods(InternalOptions options, AppView<?> appView) {
DexItemFactory factory = options.itemFactory;
if (options.minApiLevel < AndroidApiLevel.K.getLevel()) {
@@ -1038,11 +1036,11 @@
}
private void addProvider(MethodProvider generator) {
- assert !rewritable.containsKey(generator.method);
- rewritable.put(generator.method, generator);
+ MethodProvider replaced = rewritable.put(generator.method, generator);
+ assert replaced == null;
}
- public MethodProvider getProvider(DexMethod method) {
+ MethodProvider getProvider(DexMethod method) {
return rewritable.get(method);
}
}
@@ -1062,13 +1060,13 @@
public abstract boolean requiresGenerationOfCode();
}
- public static class RetargetCoreLibraryMethodProvider extends MethodProvider {
+ private static class RetargetCoreLibraryMethodProvider extends MethodProvider {
private final DexType newHolder;
private DexMethod targetMethod;
private boolean isStatic;
- public RetargetCoreLibraryMethodProvider(
+ RetargetCoreLibraryMethodProvider(
DexType newHolder, DexMethod method, boolean isStatic) {
super(method);
this.newHolder = newHolder;
@@ -1098,17 +1096,17 @@
}
}
- public static class MethodGenerator extends MethodProvider {
+ private static class MethodGenerator extends MethodProvider {
private final TemplateMethodFactory factory;
private final String methodName;
- protected DexMethod generatedMethod;
+ DexMethod generatedMethod;
- public MethodGenerator(DexMethod method, TemplateMethodFactory factory) {
+ MethodGenerator(DexMethod method, TemplateMethodFactory factory) {
this(method, factory, method.name.toString());
}
- public MethodGenerator(DexMethod method, TemplateMethodFactory factory, String methodName) {
+ MethodGenerator(DexMethod method, TemplateMethodFactory factory, String methodName) {
super(method);
this.factory = factory;
this.methodName = methodName;
@@ -1153,11 +1151,11 @@
// Specific subclass to transform virtual methods into static desugared methods.
// To be correct, the method has to be on a final class, and be implemented directly
// on the class (no overrides).
- public static class StatifyingMethodGenerator extends MethodGenerator {
+ private static class StatifyingMethodGenerator extends MethodGenerator {
private final DexType receiverType;
- public StatifyingMethodGenerator(
+ StatifyingMethodGenerator(
DexMethod method, TemplateMethodFactory factory, String methodName, DexType receiverType) {
super(method, factory, methodName);
this.receiverType = receiverType;