blob: ddf3dbbae6a7fc3d65cab1bc4867c64a83fc8d2c [file] [log] [blame]
// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.jasmin;
import static org.junit.Assert.assertEquals;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.ToolHelper.DexVm;
import com.android.tools.r8.jasmin.JasminBuilder.ClassFileVersion;
import com.google.common.collect.ImmutableList;
import org.junit.Test;
public class FillBooleanArrayTruncation extends JasminTestBase {
private void runOnDalvikCheckVerifyError(JasminBuilder builder, String main) throws Exception {
try {
runOnArtD8(builder, main);
} catch (AssertionError e) {
assert e.toString().contains("VerifyError");
}
}
private void runOnDalvikDxCheckVerifyError(JasminBuilder builder, String main) throws Exception {
try {
runOnArtDx(builder, main);
} catch (AssertionError e) {
assert e.toString().contains("VerifyError");
}
}
private void runTest(JasminBuilder builder, String main) throws Exception {
String javaResult = runOnJava(builder, main);
if (ToolHelper.getDexVm().getVersion().isOlderThanOrEqual(DexVm.Version.V4_4_4)) {
// On dalvik the need for truncation is treated as a verification error.
runOnDalvikCheckVerifyError(builder, main);
runOnDalvikDxCheckVerifyError(builder, main);
} else {
String artResult = runOnArtD8(builder, main);
assertEquals(javaResult, artResult);
String dxArtResult = runOnArtDx(builder, main);
assertEquals(javaResult, dxArtResult);
}
}
@Test
public void filledArray() throws Exception {
JasminBuilder builder = new JasminBuilder(ClassFileVersion.JDK_1_4);
JasminBuilder.ClassBuilder clazz = builder.addClass("Test");
// Corresponds to something like the following (which doesn't compile with javac):
//
// public static void foo() {
// byte[] bytes = new byte[5];
// bytes[0] = 257;
// bytes[1] = -257;
// bytes[2] = 88;
// bytes[3] = 129;
// bytes[4] = -129;
// for (int i = 0; i < bytes.length; i++) {
// System.out.println(bytes[i]);
// }
// }
clazz.addStaticMethod("foo", ImmutableList.of(), "V",
".limit stack 10",
".limit locals 10",
" iconst_5",
" newarray byte",
" astore_0",
" aload_0",
" iconst_0",
" sipush 257",
" bastore",
" aload_0",
" iconst_1",
" sipush -257",
" bastore",
" aload_0",
" iconst_2",
" bipush 88",
" bastore",
" aload_0",
" iconst_3",
" sipush 129",
" bastore",
" aload_0",
" iconst_4",
" sipush -129",
" bastore",
" iconst_0",
" istore_1",
"PrintLoop:",
" iload_1",
" aload_0",
" arraylength",
" if_icmpge Return",
" getstatic java/lang/System.out Ljava/io/PrintStream;",
" aload_0",
" iload_1",
" baload",
" invokevirtual java/io/PrintStream.println(I)V",
" iinc 1 1",
" goto PrintLoop",
"Return:",
" return");
// public static void main(String args[]) {
// foo();
// }
clazz.addMainMethod(
".limit stack 2",
".limit locals 10",
" invokestatic Test/foo()V",
" return");
runTest(builder, clazz.name);
}
}