Also apply the rewriting for JDK-8272564 Andorid O and O_MR1
Art had a bug in handing j.l.CharSequence.equals.
Fixes: b/231450655
Change-Id: Ia36cf8910bfaa2a1b5feb30936dec765dde372bd
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 005e185..c9ff321 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -2309,10 +2309,14 @@
// interface invoke. In these cases rewrite to a virtual invoke with
// the symbolic reference java.lang.Object.
//
- // javac started generating code like this with the fix for JDK-8272564.
+ // The support was added in Android O, however at least for j.l.CharSequence.equals the handling
+ // in Art was incorrect (b/231450655).
+ //
+ // javac started generating code like this with the fix for JDK-8272564, which will be part of
+ // JDK 18.
//
// See b/218298666.
public boolean canHaveInvokeInterfaceToObjectMethodBug() {
- return isGeneratingDex() && getMinApiLevel().isLessThan(AndroidApiLevel.O);
+ return isGeneratingDex() && getMinApiLevel().isLessThan(AndroidApiLevel.P);
}
}
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/string/InvokeInterfaceToStringEqualsTest.java b/src/test/java/com/android/tools/r8/ir/optimize/string/InvokeInterfaceToStringEqualsTest.java
index e13ca1b..2507e66 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/string/InvokeInterfaceToStringEqualsTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/string/InvokeInterfaceToStringEqualsTest.java
@@ -4,11 +4,11 @@
package com.android.tools.r8.ir.optimize.string;
+import static org.junit.Assume.assumeTrue;
+
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ToolHelper.DexVm.Version;
-import com.android.tools.r8.utils.AndroidApiLevel;
import java.io.IOException;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -17,7 +17,7 @@
import org.junit.runners.Parameterized.Parameters;
import org.objectweb.asm.Opcodes;
-/** Reproduction for b/230821936. */
+/** Reproduction for b/230821936. Also see b/231450655 for Art 8.1 issue. */
@RunWith(Parameterized.class)
public class InvokeInterfaceToStringEqualsTest extends TestBase {
@@ -30,23 +30,28 @@
}
@Test
- public void test() throws Exception {
- testForR8(parameters.getBackend())
- .addProgramClassFileData(getTransformedMain())
- .addKeepMainRule(Main.class)
- .addDontOptimize()
+ public void testD8() throws Exception {
+ assumeTrue(parameters.isDexRuntime());
+ testForD8(parameters.getBackend())
+ .addProgramClassFileData(getTransformedMain(MainD8.class))
.setMinApi(parameters.getApiLevel())
- .run(parameters.getRuntime(), Main.class)
- .applyIf(
- parameters.isDexRuntimeVersion(Version.V8_1_0)
- && parameters.getApiLevel().isGreaterThan(AndroidApiLevel.B),
- // TODO(b/231450655): Should evaluate to "false".
- runResult -> runResult.assertSuccessWithOutputLines("true"),
- runResult -> runResult.assertSuccessWithOutputLines("false"));
+ .run(parameters.getRuntime(), MainD8.class)
+ .assertSuccessWithOutputLines("false");
}
- private static byte[] getTransformedMain() throws IOException {
- return transformer(Main.class)
+ @Test
+ public void test() throws Exception {
+ testForR8(parameters.getBackend())
+ .addProgramClassFileData(getTransformedMain(MainR8.class))
+ .addKeepMainRule(MainR8.class)
+ .addDontOptimize()
+ .setMinApi(parameters.getApiLevel())
+ .run(parameters.getRuntime(), MainR8.class)
+ .assertSuccessWithOutputLines("false");
+ }
+
+ private static byte[] getTransformedMain(Class<?> clazz) throws IOException {
+ return transformer(clazz)
.transformMethodInsnInMethod(
"main",
(opcode, owner, name, descriptor, isInterface, continuation) -> {
@@ -64,11 +69,18 @@
.transform();
}
- static class Main {
+ static class MainR8 {
public static void main(String[] args) {
String s = System.currentTimeMillis() > 0 ? "foo" : "bar";
System.out.println(s.equals("baz"));
}
}
+
+ static class MainD8 {
+
+ public static void main(String[] args) {
+ System.out.println("foo".equals("baz"));
+ }
+ }
}