| // 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); |
| } |
| } |
| } |