Fix lens rewriting of invoke signatures
Change-Id: I8744720c1a3180e4a784e2d20beff3b2c56d0bc7
diff --git a/src/main/java/com/android/tools/r8/graph/MethodAccessInfoCollection.java b/src/main/java/com/android/tools/r8/graph/MethodAccessInfoCollection.java
index 1af8be2..f56cc34 100644
--- a/src/main/java/com/android/tools/r8/graph/MethodAccessInfoCollection.java
+++ b/src/main/java/com/android/tools/r8/graph/MethodAccessInfoCollection.java
@@ -4,8 +4,9 @@
package com.android.tools.r8.graph;
+import com.android.tools.r8.graph.GraphLens.MethodLookupResult;
+import com.android.tools.r8.ir.code.Invoke.Type;
import com.android.tools.r8.utils.ConsumerUtils;
-import com.android.tools.r8.utils.MapUtils;
import com.android.tools.r8.utils.collections.ProgramMethodSet;
import com.google.common.collect.Sets;
import java.util.IdentityHashMap;
@@ -89,24 +90,31 @@
public MethodAccessInfoCollection rewrittenWithLens(
DexDefinitionSupplier definitions, GraphLens lens) {
- return new MethodAccessInfoCollection(
- rewriteInvokesWithLens(directInvokes, definitions, lens),
- rewriteInvokesWithLens(interfaceInvokes, definitions, lens),
- rewriteInvokesWithLens(staticInvokes, definitions, lens),
- rewriteInvokesWithLens(superInvokes, definitions, lens),
- rewriteInvokesWithLens(virtualInvokes, definitions, lens));
+ MethodAccessInfoCollection.Builder<?> builder = identityBuilder();
+ rewriteInvokesWithLens(builder, directInvokes, definitions, lens, Type.DIRECT);
+ rewriteInvokesWithLens(builder, interfaceInvokes, definitions, lens, Type.INTERFACE);
+ rewriteInvokesWithLens(builder, staticInvokes, definitions, lens, Type.STATIC);
+ rewriteInvokesWithLens(builder, superInvokes, definitions, lens, Type.SUPER);
+ rewriteInvokesWithLens(builder, virtualInvokes, definitions, lens, Type.VIRTUAL);
+ return builder.build();
}
- private static Map<DexMethod, ProgramMethodSet> rewriteInvokesWithLens(
- Map<DexMethod, ProgramMethodSet> invokes, DexDefinitionSupplier definitions, GraphLens lens) {
- return MapUtils.map(
- invokes,
- IdentityHashMap::new,
- lens::getRenamedMethodSignature,
- methods -> methods.rewrittenWithLens(definitions, lens),
- (methods, other) -> {
- methods.addAll(other);
- return methods;
+ private static void rewriteInvokesWithLens(
+ MethodAccessInfoCollection.Builder<?> builder,
+ Map<DexMethod, ProgramMethodSet> invokes,
+ DexDefinitionSupplier definitions,
+ GraphLens lens,
+ Type type) {
+ invokes.forEach(
+ (reference, contexts) -> {
+ ProgramMethodSet newContexts = contexts.rewrittenWithLens(definitions, lens);
+ for (ProgramMethod newContext : newContexts) {
+ MethodLookupResult methodLookupResult =
+ lens.lookupMethod(reference, newContext.getReference(), type);
+ DexMethod newReference = methodLookupResult.getReference();
+ Type newType = methodLookupResult.getType();
+ builder.registerInvokeInContext(newReference, newContext, newType);
+ }
});
}
@@ -151,6 +159,25 @@
return virtualInvokes;
}
+ public boolean registerInvokeInContext(
+ DexMethod invokedMethod, ProgramMethod context, Type type) {
+ switch (type) {
+ case DIRECT:
+ return registerInvokeDirectInContext(invokedMethod, context);
+ case INTERFACE:
+ return registerInvokeInterfaceInContext(invokedMethod, context);
+ case STATIC:
+ return registerInvokeStaticInContext(invokedMethod, context);
+ case SUPER:
+ return registerInvokeSuperInContext(invokedMethod, context);
+ case VIRTUAL:
+ return registerInvokeVirtualInContext(invokedMethod, context);
+ default:
+ assert false;
+ return false;
+ }
+ }
+
public boolean registerInvokeDirectInContext(DexMethod invokedMethod, ProgramMethod context) {
return registerInvokeMethodInContext(invokedMethod, context, directInvokes);
}