Workaround Art bug for invoke-interface on Object methods
In some situations using invoke-interface on Object methods
could lead to undefined behaviour in Art on Android T.
Rewrite these invoke-interface instructions to invoke-virtual.
This rewriting was already supported for other issues on Art/Dalvik
prior to Android S.
Generating invokeinterface on Object methods was introduced into
javac in JDK-18.
Bug: b/326661821
Change-Id: I3195651a5b7d9a47304e49636d196d5b22e0edb9
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 02e6e1d..a09100a 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -3133,8 +3133,13 @@
// JDK 18.
//
// See b/218298666.
+ //
+ // Art also had a bug in Android T, where this could lead to undefined behaviour (interpreter
+ // only).
+ //
+ // See b/326661821 (details in b/326661821#comment33).
public boolean canHaveInvokeInterfaceToObjectMethodBug() {
- return canHaveBugPresentUntil(AndroidApiLevel.S);
+ return canHaveBugPresentUntil(AndroidApiLevel.U);
}
// Until we fully drop support for API levels < 16, we have to emit an empty annotation set to
diff --git a/src/test/java/com/android/tools/r8/desugar/jdk8272564/Jdk8272564Test.java b/src/test/java/com/android/tools/r8/desugar/jdk8272564/Jdk8272564Test.java
index ddd0285..43853de 100644
--- a/src/test/java/com/android/tools/r8/desugar/jdk8272564/Jdk8272564Test.java
+++ b/src/test/java/com/android/tools/r8/desugar/jdk8272564/Jdk8272564Test.java
@@ -142,7 +142,7 @@
.addProgramFiles(Jdk8272564.jar())
.run(parameters.getRuntime(), Jdk8272564.Main.typeName())
.applyIf(
- parameters.isDexRuntime() && parameters.getApiLevel().isLessThan(AndroidApiLevel.S),
+ parameters.isDexRuntime() && parameters.getApiLevel().isLessThan(AndroidApiLevel.U),
b -> b.inspect(this::assertJdk8272564NotFixedCode),
b -> b.inspect(this::assertJdk8272564FixedCode))
.assertSuccess();