Don't lens rewrite known parts of polymorphic invokes.
Change-Id: Ib54df6cf4a246d048e1716efe3e70f15b8c52c27
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfInvoke.java b/src/main/java/com/android/tools/r8/cf/code/CfInvoke.java
index 8cc10c2..249de08 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfInvoke.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfInvoke.java
@@ -34,6 +34,7 @@
import com.android.tools.r8.naming.NamingLens;
import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig;
import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState;
+import com.android.tools.r8.utils.DescriptorUtils;
import com.android.tools.r8.utils.structural.CompareToVisitor;
import com.android.tools.r8.utils.structural.HashingVisitor;
import com.android.tools.r8.utils.structural.StructuralSpecification;
@@ -111,25 +112,27 @@
LensCodeRewriterUtils rewriter,
MethodVisitor visitor) {
Invoke.Type invokeType = Invoke.Type.fromCfOpcode(opcode, method, context, appView);
- Invoke.Type rewrittenType;
- DexMethod rewrittenMethod;
if (invokeType == Type.POLYMORPHIC) {
- // The method is one of the java.lang.MethodHandle invokes.
- // Only the argument signature (getProto()) is to be type rewritten.
- rewrittenType = Type.POLYMORPHIC;
+ assert dexItemFactory.polymorphicMethods.isPolymorphicInvoke(method);
+ // The method is one of java.lang.MethodHandle.invoke/invokeExact.
+ // Only the method signature (getProto()) is to be type rewritten.
DexProto rewrittenProto = rewriter.rewriteProto(method.getProto());
- rewrittenMethod =
- dexItemFactory.createMethod(method.getHolderType(), rewrittenProto, method.getName());
+ visitor.visitMethodInsn(
+ invokeType.getCfOpcode(),
+ DescriptorUtils.descriptorToInternalName(method.holder.toDescriptorString()),
+ method.getName().toString(),
+ rewrittenProto.toDescriptorString(namingLens),
+ itf);
} else {
MethodLookupResult lookup =
graphLens.lookupMethod(method, context.getReference(), invokeType);
- rewrittenType = lookup.getType();
- rewrittenMethod = lookup.getReference();
+ Invoke.Type rewrittenType = lookup.getType();
+ DexMethod rewrittenMethod = lookup.getReference();
+ String owner = namingLens.lookupInternalName(rewrittenMethod.holder);
+ String name = namingLens.lookupName(rewrittenMethod).toString();
+ String desc = rewrittenMethod.proto.toDescriptorString(namingLens);
+ visitor.visitMethodInsn(rewrittenType.getCfOpcode(), owner, name, desc, itf);
}
- String owner = namingLens.lookupInternalName(rewrittenMethod.holder);
- String name = namingLens.lookupName(rewrittenMethod).toString();
- String desc = rewrittenMethod.proto.toDescriptorString(namingLens);
- visitor.visitMethodInsn(rewrittenType.getCfOpcode(), owner, name, desc, itf);
}
@Override
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat45cc.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat45cc.java
index 8e9a2b0..61a0257 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat45cc.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat45cc.java
@@ -122,17 +122,17 @@
GraphLens graphLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
- MethodLookupResult lookup =
- graphLens.lookupMethod(getMethod(), context.getReference(), Type.POLYMORPHIC);
- // The method is one of the java.lang.MethodHandle invokes.
- // Only the argument (getProto()) signature is to be type rewritten.
- assert lookup.getType() == Type.POLYMORPHIC;
- assert getMethod() == lookup.getReference();
- writeFirst(A, G, dest);
- write16BitReference(lookup.getReference(), dest, mapping);
- write16BitValue(combineBytes(makeByte(F, E), makeByte(D, C)), dest);
-
+ // The method is one of java.lang.MethodHandle.invoke/invokeExact.
+ // Only the method signature (getProto()) is to be type rewritten.
+ assert rewriter.dexItemFactory().polymorphicMethods.isPolymorphicInvoke(getMethod());
+ assert getMethod()
+ == graphLens
+ .lookupMethod(getMethod(), context.getReference(), Type.POLYMORPHIC)
+ .getReference();
DexProto rewrittenProto = rewriter.rewriteProto(getProto());
+ writeFirst(A, G, dest);
+ write16BitReference(getMethod(), dest, mapping);
+ write16BitValue(combineBytes(makeByte(F, E), makeByte(D, C)), dest);
write16BitReference(rewrittenProto, dest, mapping);
}
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat4rcc.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat4rcc.java
index 94b043a..b795316 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat4rcc.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat4rcc.java
@@ -59,17 +59,17 @@
GraphLens graphLens,
ObjectToOffsetMapping mapping,
LensCodeRewriterUtils rewriter) {
- MethodLookupResult lookup =
- graphLens.lookupMethod(getMethod(), context.getReference(), Type.POLYMORPHIC);
- // The method is one of the java.lang.MethodHandle invokes.
- // Only the argument (getProto()) signature is to be type rewritten.
- assert lookup.getType() == Type.POLYMORPHIC;
- assert getMethod() == lookup.getReference();
- writeFirst(AA, dest);
- write16BitReference(lookup.getReference(), dest, mapping);
- write16BitValue(CCCC, dest);
-
+ // The method is one of java.lang.MethodHandle.invoke/invokeExact.
+ // Only the method signature (getProto()) is to be type rewritten.
+ assert rewriter.dexItemFactory().polymorphicMethods.isPolymorphicInvoke(getMethod());
+ assert getMethod()
+ == graphLens
+ .lookupMethod(getMethod(), context.getReference(), Type.POLYMORPHIC)
+ .getReference();
DexProto rewrittenProto = rewriter.rewriteProto(getProto());
+ writeFirst(AA, dest);
+ write16BitReference(getMethod(), dest, mapping);
+ write16BitValue(CCCC, dest);
write16BitReference(rewrittenProto, dest, mapping);
}