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