Fix stack height for ContentProviderClient.close backport
Bug: b/276874854
Change-Id: I1304ec7fc6ca84a3864c503397a5f753a561e6de
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/backports/ContentProviderClientMethodRewrites.java b/src/main/java/com/android/tools/r8/ir/desugar/backports/ContentProviderClientMethodRewrites.java
index 8881483..5d1114b 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/backports/ContentProviderClientMethodRewrites.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/backports/ContentProviderClientMethodRewrites.java
@@ -4,8 +4,16 @@
package com.android.tools.r8.ir.desugar.backports;
+import com.android.tools.r8.cf.code.CfInstruction;
import com.android.tools.r8.cf.code.CfInvoke;
+import com.android.tools.r8.cf.code.CfStackInstruction;
+import com.android.tools.r8.cf.code.CfStackInstruction.Opcode;
+import com.android.tools.r8.graph.DexItemFactory;
+import com.android.tools.r8.ir.desugar.BackportedMethodRewriter.FullMethodInvokeRewriter;
import com.android.tools.r8.ir.desugar.BackportedMethodRewriter.MethodInvokeRewriter;
+import com.android.tools.r8.ir.desugar.LocalStackAllocator;
+import com.google.common.collect.ImmutableList;
+import java.util.Collection;
import org.objectweb.asm.Opcodes;
public final class ContentProviderClientMethodRewrites {
@@ -15,10 +23,18 @@
public static MethodInvokeRewriter rewriteClose() {
// Rewrite android/content/ContentProviderClient#close to
// android/content/ContentProviderClient#recycle
- return (invoke, factory) ->
- new CfInvoke(
- Opcodes.INVOKEVIRTUAL,
- factory.androidContentContentProviderClientMembers.release,
- false);
+ return new FullMethodInvokeRewriter() {
+ @Override
+ public Collection<CfInstruction> rewrite(
+ CfInvoke invoke, DexItemFactory factory, LocalStackAllocator localStackAllocator) {
+ // The invoke consumes the stack value and pushes another assumed to be the same.
+ return ImmutableList.of(
+ new CfInvoke(
+ Opcodes.INVOKEVIRTUAL,
+ factory.androidContentContentProviderClientMembers.release,
+ false),
+ new CfStackInstruction(Opcode.Pop));
+ }
+ };
}
}