blob: 561fa9b54ca5060c99f9ecc20a1fbedc0d85ed5a [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.jasmin.JasminBuilder.ClassFileVersion;
import com.google.common.collect.ImmutableList;
import org.junit.Test;
public class BooleanByteConfusion extends JasminTestBase {
private void runTest(JasminBuilder builder, String main) throws Exception {
String javaResult = runOnJava(builder, main);
String artResult = runOnArtD8(builder, main);
assertEquals(javaResult, artResult);
String dxArtResult = runOnArtDx(builder, main);
assertEquals(javaResult, dxArtResult);
}
@Test
public void booleanByteConfusion() throws Exception {
JasminBuilder builder = new JasminBuilder(ClassFileVersion.JDK_1_4);
JasminBuilder.ClassBuilder clazz = builder.addClass("Test");
// public static void foo(boolean condition) {
// boolean[][] array = null;
// if (condition) {
// array = new boolean[][] { {true}, {false} };
// }
// if (array != null) {
// System.out.println(array[0][0]);
// System.out.println(array[1][0]);
// } else {
// System.out.println("null array");
// }
// }
clazz.addStaticMethod("foo", ImmutableList.of("Z"), "V",
".limit stack 10",
".limit locals 10",
" aconst_null",
// Compiling with new versions of javac seem to always put in this check cast, but it
// is not strictly required and some versions of javac seem to not emit it. The class
// file is still valid and runs, so we should be able to deal with it as well.
//
// " checkcast [[Z",
//
" astore_1",
" iload_0",
" ifeq Target",
" iconst_2",
" anewarray [Z",
" dup",
" iconst_0",
" iconst_1",
" newarray boolean",
" dup",
" iconst_0",
" iconst_1",
" bastore",
" aastore",
" dup",
" iconst_1",
" iconst_1",
" newarray boolean",
" dup",
" iconst_0",
" iconst_0",
" bastore",
" aastore",
" astore_1",
"Target:",
" aload_1",
" ifnull PrintNull",
" getstatic java/lang/System/out Ljava/io/PrintStream;",
" aload_1",
" iconst_0",
" aaload",
" iconst_0",
" baload",
" invokevirtual java/io/PrintStream/println(Z)V",
" getstatic java/lang/System.out Ljava/io/PrintStream;",
" aload_1",
" iconst_1",
" aaload",
" iconst_0",
" baload",
" invokevirtual java/io/PrintStream.println(Z)V",
" goto Return",
"PrintNull:",
" getstatic java/lang/System.out Ljava/io/PrintStream;",
" ldc \"null array\"",
" invokevirtual java/io/PrintStream.println(Ljava/lang/String;)V",
"Return:",
" return");
// public static void main(String args[]) {
// foo(true);
// foo(false);
// }
clazz.addMainMethod(
".limit stack 2",
".limit locals 10",
" iconst_1",
" invokestatic Test/foo(Z)V",
" iconst_0",
" invokestatic Test/foo(Z)V",
" return");
runTest(builder, clazz.name);
}
}