blob: 5e2549de87a846e4b1c620b64a66927335dcc474 [file] [log] [blame]
// Copyright (c) 2018, 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 static org.junit.Assert.assertNotEquals;
import com.android.tools.r8.ToolHelper.ProcessResult;
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.jasmin.JasminBuilder.ClassFileVersion;
import com.google.common.collect.ImmutableList;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import org.objectweb.asm.Type;
@RunWith(Parameterized.class)
public class Regress72413928 extends JasminTestBase {
public Regress72413928(Type type, boolean supportedOnD8AndDx) {
this.type = type;
this.supportedOnD8AndDx = supportedOnD8AndDx;
}
@Parameters(name = "{0}")
public static List<Object[]> getData() {
return ImmutableList.copyOf(new Object[][]{
new Object[]{Type.INT_TYPE, true},
new Object[]{Type.SHORT_TYPE, false},
new Object[]{Type.CHAR_TYPE, false},
new Object[]{Type.BYTE_TYPE, true},
});
}
private final Type type;
private final boolean supportedOnD8AndDx;
private JasminBuilder buildClass(Type type) {
JasminBuilder builder = new JasminBuilder(ClassFileVersion.JDK_1_4);
JasminBuilder.ClassBuilder clazz = builder.addClass("Test");
String conversion;
switch (type.getSort()) {
case Type.INT:
conversion = "";
break;
case Type.SHORT:
conversion = "i2s";
break;
case Type.CHAR:
conversion = "i2c";
break;
case Type.BYTE:
conversion = "i2b";
break;
default:
throw new Unreachable();
}
clazz.addStaticMethod("returnsConstantFalse", ImmutableList.of(), "Z",
".limit stack 10",
".limit locals 10",
" iconst_0",
conversion,
" ireturn");
clazz.addStaticMethod("returnsConstantTrue", ImmutableList.of(), "Z",
".limit stack 10",
".limit locals 10",
" iconst_1",
conversion,
" ireturn");
clazz.addStaticMethod("returnsArgument", ImmutableList.of(type.getDescriptor()), "Z",
".limit stack 10",
".limit locals 10",
" iload_0",
conversion,
" ireturn");
// public static void main(String args[]) {
// System.out.println(Test.returnsConstantFalse());
// System.out.println(Test.returnsConstantFalse());
// System.out.println(Test.returnsArgument(0));
// System.out.println(Test.returnsArgument(1));
// }
clazz.addMainMethod(
".limit stack 2",
".limit locals 10",
" getstatic java/lang/System/out Ljava/io/PrintStream;",
" invokestatic Test/returnsConstantFalse()Z",
" invokevirtual java/io/PrintStream/println(Z)V",
" getstatic java/lang/System/out Ljava/io/PrintStream;",
" invokestatic Test/returnsConstantTrue()Z",
" invokevirtual java/io/PrintStream/println(Z)V",
" getstatic java/lang/System/out Ljava/io/PrintStream;",
" iconst_0",
" invokestatic Test/returnsArgument(" + type.getDescriptor() + ")Z",
" invokevirtual java/io/PrintStream/println(Z)V",
" getstatic java/lang/System/out Ljava/io/PrintStream;",
" iconst_1",
" invokestatic Test/returnsArgument(" + type.getDescriptor() + ")Z",
" invokevirtual java/io/PrintStream/println(Z)V",
" return");
return builder;
}
@Test
public void test() throws Exception {
JasminBuilder builder = buildClass(type);
String javaResult = runOnJava(builder, "Test");
ProcessResult d8Result = runOnArtD8Raw(builder, "Test");
ProcessResult dxResult = runOnArtDxRaw(builder, "Test");
if (supportedOnD8AndDx) {
assertEquals(0, d8Result.exitCode);
assertEquals(javaResult, d8Result.stdout);
assertEquals(0, dxResult.exitCode);
assertEquals(javaResult, dxResult.stdout);
} else {
assertNotEquals(0, d8Result.exitCode);
assertNotEquals(0, dxResult.exitCode);
}
}
}