// 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 static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

import com.android.tools.r8.OutputMode;
import com.android.tools.r8.R8Command;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.ToolHelper.ProcessResult;
import com.android.tools.r8.jasmin.JasminBuilder.ClassFileVersion;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.utils.AndroidApp;
import com.google.common.collect.ImmutableList;
import java.nio.file.Path;
import org.junit.Test;

public class JumpSubroutineTests extends JasminTestBase {

  private void runTest(JasminBuilder builder, String main, String expected) throws Exception {
    String javaResult = runOnJava(builder, main);
    assertEquals(expected, javaResult);
    String artResult = runOnArtD8(builder, main);
    assertEquals(expected, artResult);
    String cfFrontendResult = runOnJavaR8CfFrontend(builder, main);
    assertEquals(expected, cfFrontendResult);
    String dxArtResult = runOnArtDx(builder, main);
    assertEquals(expected, dxArtResult);
  }

  private String runOnJavaR8CfFrontend(JasminBuilder builder, String main) throws Exception {
    Path inputJar = temp.getRoot().toPath().resolve("input.jar");
    Path outputJar = temp.getRoot().toPath().resolve("output.jar");
    builder.writeJar(inputJar, null);
    ToolHelper.runR8(
        R8Command.builder()
            .addProgramFiles(inputJar)
            .setOutput(outputJar, OutputMode.ClassFile)
            .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
            .setDisableTreeShaking(true)
            .setDisableMinification(true)
            .addProguardConfiguration(ImmutableList.of("-keepattributes *"), Origin.unknown())
            .build());
    ProcessResult processResult = ToolHelper.runJava(outputJar, main);
    assertEquals(0, processResult.exitCode);
    return processResult.stdout;
  }

  private void expectDxFailure(JasminBuilder builder) throws Exception {
    // This expects this dx failure:
    // Uncaught translation error: com.android.dex.util.ExceptionWithContext: returning from
    // invalid subroutine
    // 1 error; aborting
    ProcessResult result = runDX(builder);
    assertNotEquals(0, result.exitCode);
    assertTrue(result.stderr.contains("Uncaught translation error"));
    assertTrue(result.stderr.contains("invalid subroutine"));
  }

  @Test
  /*
   *  Compilation of the following code with JDK 1.3.0_05 (on Windows).
   *
   *  package test;
   *
   *  class Test {
   *    public static void main(String[] args) {
   *      try {
   *        System.out.println(0);
   *      } finally {
   *        System.out.println(2);
   *      }
   *    }
   *  }
   */
  public void testJsrJava130TryFinally() throws Exception {
    JasminBuilder builder = new JasminBuilder(ClassFileVersion.JDK_1_3);
    JasminBuilder.ClassBuilder clazz = builder.addClass("Test");

    clazz.addMainMethod(
        ".limit stack 3",
        ".limit locals 3",
        "TryStart:",
        "  getstatic java/lang/System/out Ljava/io/PrintStream;",
        "  iconst_0",
        "  invokevirtual java/io/PrintStream/print(I)V",
        "  jsr Finally",
        "  goto Return",
        "TryEnd:",
        "Catch:",
        "  astore_1",
        "  jsr Finally",
        "  aload_1",
        "  athrow",
        "Finally:",
        "  astore_2",
        "  getstatic java/lang/System/out Ljava/io/PrintStream;",
        "  iconst_1",
        "  invokevirtual java/io/PrintStream/print(I)V",
        "  ret 2",
        "Return:",
        "  return",
        ".catch all from TryStart to TryEnd using Catch");

    runTest(builder, clazz.name, "01");
  }

  @Test
  /*
   *  Compilation of the following code with JDK 1.3.0_05 (on Windows).
   *
   *  package test;
   *
   *  class Test {
   *    public static void main(String[] args) {
   *      try {
   *        System.out.println(0);
   *        try {
   *          System.out.println(1);
   *        } finally {
   *          System.out.println(2);
   *        }
   *      } finally {
   *        System.out.println(3);
   *      }
   *    }
   *  }
   */
  public void testJsrJava130TryFinallyNested() throws Exception {
    JasminBuilder builder = new JasminBuilder(ClassFileVersion.JDK_1_3);
    JasminBuilder.ClassBuilder clazz = builder.addClass("Test");

    clazz.addMainMethod(
        ".limit stack 3",
        ".limit locals 5",
        "TryStart:",
        "  getstatic java/lang/System/out Ljava/io/PrintStream;",
        "  iconst_0",
        "  invokevirtual java/io/PrintStream/print(I)V",
        "TryStartInner:",
        "  getstatic java/lang/System/out Ljava/io/PrintStream;",
        "  iconst_1",
        "  invokevirtual java/io/PrintStream/print(I)V",
        "  jsr FinallyInner",
        "  goto DoneInner",
        "TryEndInner:",
        "CatchInner:",
        "  astore_1",
        "  jsr FinallyInner",
        "  aload_1",
        "  athrow",
        "FinallyInner:",
        "  astore_2",
        "  getstatic java/lang/System/out Ljava/io/PrintStream;",
        "  iconst_2",
        "  invokevirtual java/io/PrintStream/print(I)V",
        "  ret 2",
        "DoneInner:",
        "  jsr Finally",
        "  goto Return",
        "TryEnd:",
        "Catch:",
        "  astore_3",
        "  jsr Finally",
        "  aload_3",
        "  athrow",
        "Finally:",
        "  astore 4",
        "  getstatic java/lang/System/out Ljava/io/PrintStream;",
        "  iconst_3",
        "  invokevirtual java/io/PrintStream/print(I)V",
        "  ret 4",
        "Return:",
        "  return",
        ".catch all from TryStartInner to TryEndInner using CatchInner",
        ".catch all from TryStart to TryEnd using Catch");


    runTest(builder, clazz.name, "0123");
  }

  @Test
  public void testJsrWithStraightlineCode() throws Exception {
    JasminBuilder builder = new JasminBuilder(ClassFileVersion.JDK_1_4);
    JasminBuilder.ClassBuilder clazz = builder.addClass("Test");

    clazz.addStaticMethod("foo", ImmutableList.of(), "I",
        ".limit stack 3",
        ".limit locals 3",
        "  ldc 0",
        "  ldc 1",
        "  jsr LabelSub",
        "  ldc 2",
        "  jsr LabelSub",
        "  ldc 3",
        "  jsr LabelSub",
        "  ireturn",
        "LabelSub:",
        "  astore 1",
        "  iadd",
        "  ret 1");

    clazz.addMainMethod(
        ".limit stack 2",
        ".limit locals 1",
        "  getstatic java/lang/System/out Ljava/io/PrintStream;",
        "  invokestatic Test/foo()I",
        "  invokevirtual java/io/PrintStream/print(I)V",
        "  return");

    runTest(builder, clazz.name, Integer.toString(3 * 4 / 2));
  }

  @Test
  public void testJsrWithStraightlineCodeMultiple() throws Exception {
    JasminBuilder builder = new JasminBuilder(ClassFileVersion.JDK_1_4);
    JasminBuilder.ClassBuilder clazz = builder.addClass("Test");

    clazz.addStaticMethod("foo", ImmutableList.of(), "I",
        ".limit stack 3",
        ".limit locals 3",
        "  ldc 0",
        "  ldc 1",
        "  jsr LabelSub1",
        "  ldc 2",
        "  jsr LabelSub2",
        "  ldc 3",
        "  jsr LabelSub3",
        "  ireturn",
        "LabelSub1:",
        "  astore 1",
        "  iadd",
        "  ret 1",
        "LabelSub2:",
        "  astore 1",
        "  iadd",
        "  ret 1",
        "LabelSub3:",
        "  astore 1",
        "  iadd",
        "  ret 1");

    clazz.addMainMethod(
        ".limit stack 2",
        ".limit locals 1",
        "  getstatic java/lang/System/out Ljava/io/PrintStream;",
        "  invokestatic Test/foo()I",
        "  invokevirtual java/io/PrintStream/print(I)V",
        "  return");

    runTest(builder, clazz.name, Integer.toString(3 * 4 / 2));
  }

  @Test
  public void testJsrWithStraightlineCodeMultiple2() throws Exception {
    JasminBuilder builder = new JasminBuilder(ClassFileVersion.JDK_1_4);
    JasminBuilder.ClassBuilder clazz = builder.addClass("Test");

    clazz.addStaticMethod("foo", ImmutableList.of(), "I",
        ".limit stack 4",
        ".limit locals 3",
        "  ldc 0",
        "  ldc 1",
        "  jsr LabelSub",
        "  ldc 2",
        "  jsr LabelSub",
        "  ldc 3",
        "  jsr LabelSub",
        "  ldc 4",
        "  ldc 5",
        "  jsr LabelSub2",
        "  ldc 6",
        "  ldc 7",
        "  jsr LabelSub2",
        "  ldc 8",
        "  ldc 9",
        "  jsr LabelSub2",
        "  ireturn",
        "LabelSub:",
        "  astore 1",
        "  iadd",
        "  ret 1",
        "LabelSub2:",
        "  astore 1",
        "  iadd",
        "  iadd",
        "  ret 1");

    clazz.addMainMethod(
        ".limit stack 2",
        ".limit locals 1",
        "  getstatic java/lang/System/out Ljava/io/PrintStream;",
        "  invokestatic Test/foo()I",
        "  invokevirtual java/io/PrintStream/print(I)V",
        "  return");

    runTest(builder, clazz.name, Integer.toString(9 * 10 / 2));
  }

  @Test
  public void testJsrWithControlFlowCode() throws Exception {
    JasminBuilder builder = new JasminBuilder(ClassFileVersion.JDK_1_4);
    JasminBuilder.ClassBuilder clazz = builder.addClass("Test");

    clazz.addStaticMethod("foo", ImmutableList.of(), "V",
        ".limit stack 2",
        ".limit locals 2",
        "  ldc 0",
        "  jsr LabelSub",
        "  ldc 1",
        "  jsr LabelSub",
        "  return",
        "LabelSub:",
        "  astore 1",
        "  ifeq LabelZero",
        "  getstatic java/lang/System/out Ljava/io/PrintStream;",
        "  ldc \"Got non-zero\"",
        "  invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V",
        "  goto LabelRet",
        "LabelZero:",
        "  getstatic java/lang/System/out Ljava/io/PrintStream;",
        "  ldc \"Got zero\"",
        "  invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V",
        "LabelRet:",
        "  ret 1");

    clazz.addMainMethod(
        ".limit stack 0",
        ".limit locals 1",
        "  invokestatic Test/foo()V",
        "  return");

    runTest(builder, clazz.name, "Got zero" + ToolHelper.LINE_SEPARATOR + "Got non-zero"
            + ToolHelper.LINE_SEPARATOR);
  }

  @Test
  public void testJsrWithNestedJsr() throws Exception {
    JasminBuilder builder = new JasminBuilder(ClassFileVersion.JDK_1_4);
    JasminBuilder.ClassBuilder clazz = builder.addClass("Test");

    clazz.addStaticMethod("foo", ImmutableList.of(), "V",
        ".limit stack 2",
        ".limit locals 3",
        "  ldc 0",
        "  jsr LabelSub",  // index 1.
        "  ldc 1",
        "  jsr LabelSub",  // index 3.
        "  return",
        "LabelSub:",
        "  astore 1",
        "  ifeq LabelZero",
        "  getstatic java/lang/System/out Ljava/io/PrintStream;",
        "  ldc \"Got non-zero, calling nested\"",
        "  invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V",
        "  jsr LabelSub2",  // index 11.
        "  goto LabelRet",
        "LabelZero:",
        "  getstatic java/lang/System/out Ljava/io/PrintStream;",
        "  ldc \"Got zero\"",
        "  invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V",
        "LabelRet:",
        "  ret 1",
        "LabelSub2:",
        "  astore 2",
        "  getstatic java/lang/System/out Ljava/io/PrintStream;",
        "  ldc \"In nested subroutine\"",
        "  invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V",
        "  ret 2");

    clazz.addMainMethod(
        ".limit stack 0",
        ".limit locals 1",
        "  invokestatic Test/foo()V",
        "  return");

    runTest(builder, clazz.name, "Got zero" + ToolHelper.LINE_SEPARATOR
            + "Got non-zero, calling nested" + ToolHelper.LINE_SEPARATOR + "In nested subroutine"
            + ToolHelper.LINE_SEPARATOR);
  }

  @Test
  public void testJsrWithNestedJsrPopReturnAddress() throws Exception {
    JasminBuilder builder = new JasminBuilder(ClassFileVersion.JDK_1_4);
    JasminBuilder.ClassBuilder clazz = builder.addClass("Test");

    clazz.addStaticMethod("foo", ImmutableList.of(), "V",
        ".limit stack 1",
        ".limit locals 1",
        "  jsr LabelSub1",
        "  return",
        "LabelSub1:",
        "  astore 0",
        "  jsr LabelSub2",
        "LabelSub2:",
        "  pop",
        "  ret 0");

    clazz.addMainMethod(
        ".limit stack 1",
        ".limit locals 1",
        "  invokestatic Test/foo()V",
        "  return");

    String expected = "";
    String javaResult = runOnJava(builder, clazz.name);
    assertEquals(expected, javaResult);
    String artResult = runOnArtD8(builder, clazz.name);
    assertEquals(expected, artResult);
    String cfFrontendResult = runOnJavaR8CfFrontend(builder, clazz.name);
    assertEquals(expected, cfFrontendResult);
    // This fails with dx.
    expectDxFailure(builder);
  }

  @Test
  public void testJsrWithNestedPopReturnAddress2() throws Exception {
    JasminBuilder builder = new JasminBuilder(ClassFileVersion.JDK_1_4);
    JasminBuilder.ClassBuilder clazz = builder.addClass("Test");

    clazz.addStaticMethod("foo", ImmutableList.of(), "V",
        ".limit stack 1",
        ".limit locals 1",
        "  jsr LabelSub1",
        "LabelSub1:",
        "  pop",
        "  jsr LabelSub2",
        "  return",
        "LabelSub2:",
        "  astore 0",
        "  ret 0");

    clazz.addMainMethod(
        ".limit stack 1",
        ".limit locals 1",
        "  invokestatic Test/foo()V",
        "  return");

    runTest(builder, clazz.name, "");
  }

  @Test
  public void testJsrJustThrows() throws Exception {
    JasminBuilder builder = new JasminBuilder(ClassFileVersion.JDK_1_4);
    JasminBuilder.ClassBuilder clazz = builder.addClass("Test");

    clazz.addStaticMethod("foo", ImmutableList.of(), "V",
        ".limit stack 2",
        ".limit locals 1",
        "  jsr Jsr",
        // The return target is the same as the jsr target.
        "Jsr:",
        "  pop",  // Return address is not used.
        "  new java/lang/Exception",
        "  dup",
        "  invokenonvirtual java/lang/Exception.<init>()V",
        "  athrow");

    clazz.addMainMethod(
        ".limit stack 1",
        ".limit locals 1",
        "TryStart:",
        "  invokestatic Test/foo()V",
        "  return",
        "TryEnd:",
        "Catch:",
        "  pop",
        "  return",
        ".catch java/lang/Exception from TryStart to TryEnd using Catch");

    runTest(builder, clazz.name, "");
  }

  @Test
  public void testJsrJustThrows2() throws Exception {
    JasminBuilder builder = new JasminBuilder(ClassFileVersion.JDK_1_4);
    JasminBuilder.ClassBuilder clazz = builder.addClass("Test");

    clazz.addStaticMethod("foo", ImmutableList.of(), "V",
        ".limit stack 2",
        ".limit locals 1",
        "  jsr Jsr",
        // The jsr does not return, so this is dead code.
        "  pop",
        "  pop",
        "  pop",
        "  pop",
        "  pop",
        "  pop",
        "  return",
        "Jsr:",
        "  pop",  // Return address is not used.
        "  new java/lang/Exception",
        "  dup",
        "  invokenonvirtual java/lang/Exception.<init>()V",
        "  athrow");

    clazz.addMainMethod(
        ".limit stack 1",
        ".limit locals 1",
        "TryStart:",
        "  invokestatic Test/foo()V",
        "  return",
        "TryEnd:",
        "Catch:",
        "  pop",
        "  return",
        ".catch java/lang/Exception from TryStart to TryEnd using Catch");

    runTest(builder, clazz.name, "");
  }

  @Test
  public void testJsrWithException() throws Exception {
    JasminBuilder builder = new JasminBuilder(ClassFileVersion.JDK_1_4);
    JasminBuilder.ClassBuilder clazz = builder.addClass("Test");

    clazz.addStaticMethod("foo", ImmutableList.of(), "V",
        ".limit stack 3",
        ".limit locals 2",
        "  ldc 0",
        "  jsr LabelSub",
        "  ldc 1",
        "  jsr LabelSub",
        "  return",
        "LabelSub:",
        "  astore 1",
        "  ldc 42",
        "  swap",
        "  ldc 42",
        "  swap",
        "LabelTryStart:",
        "  idiv",
        "  pop",
        "LabelTryEnd:",
        "  pop",
        "  getstatic java/lang/System/out Ljava/io/PrintStream;",
        "  ldc \"Divided by non-zero\"",
        "  invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V",
        "  goto LabelRet",
        "LabelCatch:",
        "  pop",
        "  getstatic java/lang/System/out Ljava/io/PrintStream;",
        "  ldc \"Divided by zero\"",
        "  invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V",
        "  goto LabelRet",
        "LabelRet:",
        "  ret 1",
        ".catch java/lang/Exception from LabelTryStart to LabelTryEnd using LabelCatch");

    clazz.addMainMethod(
        ".limit stack 0",
        ".limit locals 1",
        "  invokestatic Test/foo()V",
        "  return");

    runTest(builder, clazz.name, "Divided by zero" + ToolHelper.LINE_SEPARATOR
            + "Divided by non-zero" + ToolHelper.LINE_SEPARATOR);
  }

  @Test
  public void testJsrWithAddressManipulation() throws Exception {
    JasminBuilder builder = new JasminBuilder(ClassFileVersion.JDK_1_4);
    JasminBuilder.ClassBuilder clazz = builder.addClass("Test");

    clazz.addStaticMethod("foo", ImmutableList.of(), "V",
        ".limit stack 4",
        ".limit locals 4",
        "  ldc 0",
        "  jsr LabelSub",
        "  ldc 1",
        "  jsr LabelSub",
        "  return",
        "LabelSub:",
        "  ldc \"junk\"",
        "  swap",
        "  dup",
        // stack is now ..., arg, "junk", addr, addr
        "  astore 3",
        "  astore 2",
        "  astore 1",
        "  getstatic java/lang/System/out Ljava/io/PrintStream;",
        "  swap",
        "  invokevirtual java/io/PrintStream/print(I)V",
        "  ret 2");

    clazz.addMainMethod(
        ".limit stack 0",
        ".limit locals 1",
        "  invokestatic Test/foo()V",
        "  return");

    runTest(builder, clazz.name, "01");
  }

  @Test
  public void testJsrWithSharedExceptionHandler() throws Exception {
    // Regression test for b/37659886
    JasminBuilder builder = new JasminBuilder(ClassFileVersion.JDK_1_4);
    JasminBuilder.ClassBuilder clazz = builder.addClass("Test");

    clazz.addStaticMethod("foo", ImmutableList.of("I"), "V",
        ".limit stack 4",
        ".limit locals 2",
        "LabelTryStart:",
        "  getstatic java/lang/System/out Ljava/io/PrintStream;",
        "  iload 0",
        "  jsr LabelSub",
        "  invokevirtual java/io/PrintStream/print(I)V",
        "  return",
        "LabelSub:",
        "  astore 1",
        "  dup",
        "  ldc 168",
        "  swap",
        "  idiv", // First throwing shares the handler with JSR.
        "LabelTryEnd1:",
        "  swap",
        "  idiv", // Second throwing is in the outer handler, but still opened at the point of JSR.
        "  ret 1",
        "LabelTryEnd2:",
        "LabelCatch1:",
        "  return",
        "LabelCatch2:",
        "  return",
        ".catch java/lang/Exception from LabelTryStart to LabelTryEnd1 using LabelCatch1",
        ".catch java/lang/Exception from LabelTryStart to LabelTryEnd2 using LabelCatch2");

    clazz.addMainMethod(
        ".limit stack 1",
        ".limit locals 1",
        "  ldc 2",
        "  invokestatic Test/foo(I)V",
        "  return");

    runTest(builder, clazz.name, "42");
  }

  @Test
  public void regressJsrHitParentCatchHandler() throws Exception {
    JasminBuilder builder = new JasminBuilder(ClassFileVersion.JDK_1_4);
    JasminBuilder.ClassBuilder clazz = builder.addClass("Test");

    clazz.addStaticMethod("test", ImmutableList.of(), "I",
        ".limit stack 2",
        ".limit locals 2",
        "  ldc 10",
        "  istore 1",
        "TryStart:",
        "  iinc 1 -1",
        "  iload 1",
        "  ifeq LabelReturn",
        "  jsr Jsr",
        "  goto LabelReturn",
        "Jsr:",
        "  astore 0",
        "  new java/lang/Exception",
        "  dup",
        "  invokenonvirtual java/lang/Exception.<init>()V",
        "  athrow",
        "  ret 0",
        "LabelReturn:",
        "  ldc 0",
        "  ireturn",
        "Catch:",
        "  pop",
        "  goto TryStart",
        "TryEnd:",
        ".catch java/lang/Exception from TryStart to TryEnd using Catch"
    );

    clazz.addMainMethod(
        ".limit stack 2",
        ".limit locals 1",
        "  getstatic java/lang/System/out Ljava/io/PrintStream;",
        "  invokestatic Test/test()I",
        "  invokevirtual java/io/PrintStream/print(I)V",
        "  return");

    runTest(builder, clazz.name, "0");
  }

  private void generateRegressJsrHitParentCatchHandler2(
      JasminBuilder.ClassBuilder clazz, String name, String exception, boolean decrementInOuter) {
    String outer = decrementInOuter ? "  iinc 0 -1" : "";
    String inner = decrementInOuter ? "" : "  iinc 0 -1";
    clazz.addStaticMethod(name, ImmutableList.of(), "I",
        ".limit stack 3",
        ".limit locals 1",
        "  ldc 10",
        "  istore 0",
        "TryStart:",
        outer,
        "  iload 0",
        "  ifeq LabelReturn1",
        "  jsr Jsr1",
        "Jsr1:",
        "  pop",  // Return value is not used.
        "Jsr1Retry:",
        inner,
        "  iload 0",
        "  ifeq LabelReturn0",
        "  jsr Jsr2",
        "  ldc 2",
        "  ireturn",
        "Jsr2:",
        "  pop",  // Return value is not used.
        "  new " + exception,
        "  dup",
        "  invokenonvirtual " + exception + ".<init>()V",
        "  athrow",
        "Jsr2Catch:",
        "  pop",
        "  goto Jsr1Retry",
        "Jsr2End:",
        "LabelReturn0:",
        "  ldc 0",
        "  ireturn",
        "LabelReturn1:",
        "  ldc 1",
        "  ireturn",
        "Catch:",
        "  pop",
        "  goto TryStart",
        "TryEnd:",
        ".catch java/lang/Exception from Jsr2 to Jsr2End using Jsr2Catch",
        ".catch java/lang/Throwable from TryStart to TryEnd using Catch"
    );
  }

  @Test
  public void regressJsrHitParentCatchHandler2() throws Exception {
    JasminBuilder builder = new JasminBuilder(ClassFileVersion.JDK_1_4);
    JasminBuilder.ClassBuilder clazz = builder.addClass("Test");

    generateRegressJsrHitParentCatchHandler2(clazz, "test1", "java/lang/Exception", false);
    generateRegressJsrHitParentCatchHandler2(clazz, "test2", "java/lang/Throwable", true);

    clazz.addMainMethod(
        ".limit stack 2",
        ".limit locals 1",
        "  getstatic java/lang/System/out Ljava/io/PrintStream;",
        "  invokestatic Test/test1()I",
        "  invokevirtual java/io/PrintStream/print(I)V",
        "  getstatic java/lang/System/out Ljava/io/PrintStream;",
        "  invokestatic Test/test2()I",
        "  invokevirtual java/io/PrintStream/print(I)V",
        "  return");

    runTest(builder, clazz.name, "01");
  }

  @Test
  // Reduction of b/38156139 causing the infinite loop.
  //
  // The original code is this method:
  // https://github.com/cbeust/testng/blob/4a8459e36f2b0ed057ffa7e470f1057e8e5b0ff9/src/main/java/org/testng/internal/Invoker.java#L1066
  // compiled with some ancient version of javac generating code with jsr for try/finally.
  public void regress38156139() throws Exception {
    JasminBuilder builder = new JasminBuilder(ClassFileVersion.JDK_1_4);
    JasminBuilder.ClassBuilder clazz = builder.addClass("Test");

    clazz.addStaticMethod("foo", ImmutableList.of("Z"), "I",
        ".limit stack 2",
        ".limit locals 3",
        "  ldc 10",
        "  istore 2",
        "LabelLoopStart:",
        "  iinc 2 -1",
        "  iload 2",
        "  ifeq LabelReturn",
        "LabelTryStart:",
        "  getstatic java/lang/System/out Ljava/io/PrintStream;",
        "  iload 2",
        "  invokevirtual java/io/PrintStream/print(I)V",
        "  jsr LabelFinally",
        "  goto LabelLoopStart",
        "LabelTryEnd:",
        "LabelReturn:",
        "  ldc 0",
        "  ireturn",
        "LabelCatch:",
        "  pop",
        "  jsr LabelFinally",
        "  goto LabelLoopStart",
        "LabelFinally:",
        "  astore 1",
        "  iload 0",
        "  ifeq LabelZero",
        "  goto LabelLoopStart",  // Jump to loop start without invoking ret.
        "LabelZero:",
        "  ret 1",  // Invoke ret, which will also continue at the loop start.
        ".catch java/lang/Exception from LabelTryStart to LabelTryEnd using LabelCatch");

    clazz.addMainMethod(
        ".limit stack 2",
        ".limit locals 1",
        "  getstatic java/lang/System/out Ljava/io/PrintStream;",
        "  ldc 0",
        "  invokestatic Test/foo(Z)I",
        "  invokevirtual java/io/PrintStream/print(I)V",
        "  getstatic java/lang/System/out Ljava/io/PrintStream;",
        "  ldc 1",
        "  invokestatic Test/foo(Z)I",
        "  invokevirtual java/io/PrintStream/print(I)V",
        "  return");

    runTest(builder, clazz.name, "98765432109876543210");
  }

  @Test
  public void regress37767254() throws Exception {
    JasminBuilder builder = new JasminBuilder(ClassFileVersion.JDK_1_4);
    JasminBuilder.ClassBuilder clazz = builder.addClass("Test");

    // This is the code for the method org.apache.log4j.net.SocketAppender$Connector.run() from
    // log4j version 1.2.
    //
    // https://github.com/apache/log4j/blob/v1_2-branch/src/main/java/org/apache/log4j/net/SocketAppender.java#L373
    //
    clazz.addVirtualMethod("run", ImmutableList.of(), "V",
        ".limit stack 4",
        ".limit locals 4",
        ".var 0 is this Lorg/apache/log4j/net/SocketAppender$Connector; from L0 to L26",
        ".var 1 is socket Ljava/net/Socket; from L5 to L13",
        ".var 2 is e Ljava/io/IOException; from L22 to L1",
        "L0:",
        ".line 367",
        "  goto L1",
        "L2:",
        ".line 368",
        ".line 369",
        "  aload 0",
        "  getfield org/apache/log4j/net/SocketAppender$Connector.this$0 Lorg/apache/log4j/net/SocketAppender;",
        "  getfield org/apache/log4j/net/SocketAppender.reconnectionDelay I",
        "  i2l",
        "  invokestatic java/lang/Thread.sleep(J)V",
        "L3:",
        ".line 370",
        "  new java/lang/StringBuffer",
        "  dup",
        "  ldc \"Attempting connection to \"",
        "  invokenonvirtual java/lang/StringBuffer.<init>(Ljava/lang/String;)V",
        "  aload 0",
        "  getfield org/apache/log4j/net/SocketAppender$Connector.this$0 Lorg/apache/log4j/net/SocketAppender;",
        "  getfield org/apache/log4j/net/SocketAppender.address Ljava/net/InetAddress;",
        "  invokevirtual java/net/InetAddress.getHostName()Ljava/lang/String;",
        "  invokevirtual java/lang/StringBuffer.append(Ljava/lang/String;)Ljava/lang/StringBuffer;",
        "  invokevirtual java/lang/StringBuffer.toString()Ljava/lang/String;",
        "  invokestatic org/apache/log4j/helpers/LogLog.debug(Ljava/lang/String;)V",
        "L4:",
        ".line 371",
        "  new java/net/Socket",
        "  dup",
        "  aload 0",
        "  getfield org/apache/log4j/net/SocketAppender$Connector.this$0 Lorg/apache/log4j/net/SocketAppender;",
        "  getfield org/apache/log4j/net/SocketAppender.address Ljava/net/InetAddress;",
        "  aload 0",
        "  getfield org/apache/log4j/net/SocketAppender$Connector.this$0 Lorg/apache/log4j/net/SocketAppender;",
        "  getfield org/apache/log4j/net/SocketAppender.port I",
        "  invokenonvirtual java/net/Socket.<init>(Ljava/net/InetAddress;I)V",
        "  astore 1",
        "L5:",
        ".line 372",
        "  aload 0",
        "  astore 2",
        "  aload 2",
        "  monitorenter",
        "L6:",
        ".line 373",
        "  aload 0",
        "  getfield org/apache/log4j/net/SocketAppender$Connector.this$0 Lorg/apache/log4j/net/SocketAppender;",
        "  new java/io/ObjectOutputStream",
        "  dup",
        "  aload 1",
        "  invokevirtual java/net/Socket.getOutputStream()Ljava/io/OutputStream;",
        "  invokenonvirtual java/io/ObjectOutputStream.<init>(Ljava/io/OutputStream;)V",
        "  putfield org/apache/log4j/net/SocketAppender.oos Ljava/io/ObjectOutputStream;",
        "L7:",
        ".line 374",
        "  aload 0",
        "  getfield org/apache/log4j/net/SocketAppender$Connector.this$0 Lorg/apache/log4j/net/SocketAppender;",
        "  aconst_null",
        "  invokestatic org/apache/log4j/net/SocketAppender.access$1(Lorg/apache/log4j/net/SocketAppender;Lorg/apache/log4j/net/SocketAppender$Connector;)V",
        "L8:",
        ".line 375",
        "  ldc \"Connection established. Exiting connector thread.\"",
        "  invokestatic org/apache/log4j/helpers/LogLog.debug(Ljava/lang/String;)V",
        "L9:",
        ".line 376",
        "  jsr L10",
        "  goto L11",
        "L12:",
        ".line 372",
        "  aload 2",
        "  monitorexit",
        "  athrow",
        "L10:",
        "  astore 3",
        "  aload 2",
        "  monitorexit",
        "  ret 3",
        "L13:",
        ".line 378",
        "  pop",
        "L14:",
        ".line 379",
        "  ldc \"Connector interrupted. Leaving loop.\"",
        "  invokestatic org/apache/log4j/helpers/LogLog.debug(Ljava/lang/String;)V",
        "L15:",
        ".line 380",
        "  return",
        "L16:",
        ".line 381",
        "  pop",
        "L17:",
        ".line 382",
        "  new java/lang/StringBuffer",
        "  dup",
        "  ldc \"Remote host \"",
        "  invokenonvirtual java/lang/StringBuffer.<init>(Ljava/lang/String;)V",
        "  aload 0",
        "  getfield org/apache/log4j/net/SocketAppender$Connector.this$0 Lorg/apache/log4j/net/SocketAppender;",
        "  getfield org/apache/log4j/net/SocketAppender.address Ljava/net/InetAddress;",
        "  invokevirtual java/net/InetAddress.getHostName()Ljava/lang/String;",
        "  invokevirtual java/lang/StringBuffer.append(Ljava/lang/String;)Ljava/lang/StringBuffer;",
        "L18:",
        ".line 383",
        "  ldc \" refused connection.\"",
        "  invokevirtual java/lang/StringBuffer.append(Ljava/lang/String;)Ljava/lang/StringBuffer;",
        "  invokevirtual java/lang/StringBuffer.toString()Ljava/lang/String;",
        "L19:",
        ".line 382",
        "  invokestatic org/apache/log4j/helpers/LogLog.debug(Ljava/lang/String;)V",
        "L20:",
        ".line 368",
        "  goto L1",
        "L21:",
        ".line 384",
        "  astore 2",
        "L22:",
        ".line 385",
        "  new java/lang/StringBuffer",
        "  dup",
        "  ldc \"Could not connect to \"",
        "  invokenonvirtual java/lang/StringBuffer.<init>(Ljava/lang/String;)V",
        "  aload 0",
        "  getfield org/apache/log4j/net/SocketAppender$Connector.this$0 Lorg/apache/log4j/net/SocketAppender;",
        "  getfield org/apache/log4j/net/SocketAppender.address Ljava/net/InetAddress;",
        "  invokevirtual java/net/InetAddress.getHostName()Ljava/lang/String;",
        "  invokevirtual java/lang/StringBuffer.append(Ljava/lang/String;)Ljava/lang/StringBuffer;",
        "L23:",
        ".line 386",
        "  ldc \". Exception is \"",
        "  invokevirtual java/lang/StringBuffer.append(Ljava/lang/String;)Ljava/lang/StringBuffer;",
        "  aload 2",
        "  invokevirtual java/lang/StringBuffer.append(Ljava/lang/Object;)Ljava/lang/StringBuffer;",
        "  invokevirtual java/lang/StringBuffer.toString()Ljava/lang/String;",
        "L24:",
        ".line 385",
        "  invokestatic org/apache/log4j/helpers/LogLog.debug(Ljava/lang/String;)V",
        "L25:",
        ".line 368",
        "  goto L1",
        "L1:",
        ".line 367",
        "  aload 0",
        "  getfield org/apache/log4j/net/SocketAppender$Connector.interrupted Z",
        "  ifeq L2",
        "L11:",
        ".line 365",
        "  return",
        "L26:",
        ".catch all from L6 to L12 using L12",
        ".catch java/lang/InterruptedException from L2 to L13 using L13",
        ".catch java/net/ConnectException from L2 to L13 using L16",
        ".catch java/io/IOException from L2 to L13 using L21"
    );

    // Check that the code compiles without an infinite loop. It cannot run by itself.
    AndroidApp app = compileWithD8(builder);
    assertNotNull(app);
  }

  @Test
  public void regress37888855Reduced() throws Exception {
    JasminBuilder builder = new JasminBuilder();
    JasminBuilder.ClassBuilder clazz = builder.addClass("Test");

    // This is the code for the method
    //
    // void org.eclipse.jdt.internal.core.JavaModelOperation.run(org.eclipse.core.runtime.IProgressMonitor)
    //
    // from struts2/lib/core-3.1.1.jar
    //
    clazz.addVirtualMethod("run", ImmutableList.of("Lorg/eclipse/core/runtime/IProgressMonitor;"),
        "V",
        ".limit stack 3",
        ".limit locals 15",
        "TryStart1:",
        "TryStart2:",
        "  goto Finally2Start",
        "TryEnd2:",
        "Catch2:",
        "  astore 6",
        "  jsr Finally2Code",  // 6
        "  aload 6",
        "  athrow",
        "Finally2Code:",  // 9
        "  astore 5",
        "  ret 5",
        "Finally2Start:",
        "  jsr Finally2Code",  // 13
        "Finally2End:",
        "  goto Finally1Start",
        "TryEnd1:",
        "Catch1:",
        "  astore 8",
        "  jsr Finally1Code",  // 19
        "L19:",
        "  aload 8",
        "  athrow",
        "Finally1Code:",
        "  astore 7",
        "Try3Start:",
        "  goto Finally3Start",
        "Try3End:",
        "Catch3:",
        "  astore 14",  // Catch
        "  jsr Finally3Code",  // 30
        "  aload 14",
        "  athrow",
        "Finally3Code:",  // Finally
        "  astore 13",
        "  ret 13",
        "Finally3Start:",
        "  jsr Finally3Code",  // 37
        "Finally3End:",
        "  ret 7",
        "Finally1Start:",
        "  jsr Finally1Code",  // 41
        "Finally1End:",
        "  return",
        ".catch all from TryStart2 to TryEnd2 using Catch2",  // Block
        ".catch all from Finally2Start to Finally2End using Catch2",  // Finally
        ".catch all from TryStart1 to TryEnd1 using Catch1",  // Block
        ".catch all from Finally1Start to Finally1End using Catch1",  // Finally
        ".catch all from Try3Start to Try3End using Catch3",  // Block
        ".catch all from Finally3Start to Finally3End using Catch3"  // Finally
    );

    // Check that the code compiles without an infinite loop. It cannot run by itself.
    AndroidApp app = compileWithD8(builder);
    assertNotNull(app);
  }

  @Test
  public void regress37888855() throws Exception {
    JasminBuilder builder = new JasminBuilder();
    JasminBuilder.ClassBuilder clazz = builder.addClass("Test");

    // This is the code for the method
    //
    // void org.eclipse.jdt.internal.core.JavaModelOperation.run(org.eclipse.core.runtime.IProgressMonitor)
    //
    // from struts2/lib/core-3.1.1.jar
    //
    clazz.addVirtualMethod("run", ImmutableList.of("Lorg/eclipse/core/runtime/IProgressMonitor;"), "V",
        ".limit stack 3",
        ".limit locals 15",
        ".var 0 is this Lorg/eclipse/jdt/internal/core/JavaModelOperation; from L0 to L50",
        ".var 1 is monitor Lorg/eclipse/core/runtime/IProgressMonitor; from L0 to L50",
        ".var 2 is manager Lorg/eclipse/jdt/internal/core/JavaModelManager; from L1 to L50",
        ".var 3 is deltaProcessor Lorg/eclipse/jdt/internal/core/DeltaProcessor; from L2 to L50",
        ".var 4 is previousDeltaCount I from L1 to L50",
        ".var 9 is i I from L22 to L27",
        ".var 10 is size I from L23 to L27",
        ".var 9 is i I from L28 to L38",
        ".var 10 is length I from L29 to L38",
        ".var 11 is element Lorg/eclipse/jdt/core/IJavaElement; from L32 to L37",
        ".var 12 is openable Lorg/eclipse/jdt/internal/core/Openable; from L33 to L37",
        "L0:",
        ".line 705",
        "  invokestatic org/eclipse/jdt/internal/core/JavaModelManager.getJavaModelManager()Lorg/eclipse/jdt/internal/core/JavaModelManager;",
        "  astore 2",
        "L1:",
        ".line 706",
        "  aload 2",
        "  invokevirtual org/eclipse/jdt/internal/core/JavaModelManager.getDeltaProcessor()Lorg/eclipse/jdt/internal/core/DeltaProcessor;",
        "  astore 3",
        "L2:",
        ".line 707",
        "  aload 3",
        "  getfield org/eclipse/jdt/internal/core/DeltaProcessor.javaModelDeltas Ljava/util/ArrayList;",
        "  invokevirtual java/util/ArrayList.size()I",
        "  istore 4",
        "L3:",
        ".line 709",
        "  aload 0",
        "  aload 1",
        "  putfield org/eclipse/jdt/internal/core/JavaModelOperation.progressMonitor Lorg/eclipse/core/runtime/IProgressMonitor;",
        "L4:",
        ".line 710",
        "  aload 0",
        "  aload 0",
        "  invokevirtual org/eclipse/jdt/internal/core/JavaModelOperation.pushOperation(Lorg/eclipse/jdt/internal/core/JavaModelOperation;)V",
        "L5:",
        ".line 712",
        "  aload 0",
        "  invokevirtual org/eclipse/jdt/internal/core/JavaModelOperation.canModifyRoots()Z",
        "  ifeq L6",
        "L7:",
        ".line 715",
        "  invokestatic org/eclipse/jdt/internal/core/JavaModelManager.getJavaModelManager()Lorg/eclipse/jdt/internal/core/JavaModelManager;",
        "  getfield org/eclipse/jdt/internal/core/JavaModelManager.deltaState Lorg/eclipse/jdt/internal/core/DeltaProcessingState;",
        "  invokevirtual org/eclipse/jdt/internal/core/DeltaProcessingState.initializeRoots()V",
        "L6:",
        ".line 718",
        "  aload 0",
        "  invokevirtual org/eclipse/jdt/internal/core/JavaModelOperation.executeOperation()V",
        "  goto L8",
        "L9:",
        ".line 719",
        "  astore 6",
        "  jsr L10",
        "L11:",
        ".line 723",
        "  aload 6",
        "  athrow",
        "L10:",
        ".line 719",
        "  astore 5",
        "L12:",
        ".line 720",
        "  aload 0",
        "  invokevirtual org/eclipse/jdt/internal/core/JavaModelOperation.isTopLevelOperation()Z",
        "  ifeq L13",
        "L14:",
        ".line 721",
        "  aload 0",
        "  invokevirtual org/eclipse/jdt/internal/core/JavaModelOperation.runPostActions()V",
        "L13:",
        ".line 723",
        "  ret 5",
        "L8:",
        "  jsr L10",
        "L15:",
        "  goto L16",
        "L17:",
        ".line 724",
        "  astore 8",
        "  jsr L18",
        "L19:",
        ".line 764",
        "  aload 8",
        "  athrow",
        "L18:",
        ".line 724",
        "  astore 7",
        "L20:",
        ".line 727",
        "  aload 2",
        "  invokevirtual org/eclipse/jdt/internal/core/JavaModelManager.getDeltaProcessor()Lorg/eclipse/jdt/internal/core/DeltaProcessor;",
        "  astore 3",
        "L21:",
        ".line 730",
        "  iload 4",
        "  istore 9",
        "L22:",
        "  aload 3",
        "  getfield org/eclipse/jdt/internal/core/DeltaProcessor.javaModelDeltas Ljava/util/ArrayList;",
        "  invokevirtual java/util/ArrayList.size()I",
        "  istore 10",
        "L23:",
        "  goto L24",
        "L25:",
        ".line 731",
        "  aload 3",
        "  aload 3",
        "  getfield org/eclipse/jdt/internal/core/DeltaProcessor.javaModelDeltas Ljava/util/ArrayList;",
        "  iload 9",
        "  invokevirtual java/util/ArrayList.get(I)Ljava/lang/Object;",
        "  checkcast org/eclipse/jdt/core/IJavaElementDelta",
        "  invokevirtual org/eclipse/jdt/internal/core/DeltaProcessor.updateJavaModel(Lorg/eclipse/jdt/core/IJavaElementDelta;)V",
        "L26:",
        ".line 730",
        "  iinc 9 1",
        "L24:",
        "  iload 9",
        "  iload 10",
        "  if_icmplt L25",
        "L27:",
        ".line 737",
        "  iconst_0",
        "  istore 9",
        "L28:",
        "  aload 0",
        "  getfield org/eclipse/jdt/internal/core/JavaModelOperation.resultElements [Lorg/eclipse/jdt/core/IJavaElement;",
        "  arraylength",
        "  istore 10",
        "L29:",
        "  goto L30",
        "L31:",
        ".line 738",
        "  aload 0",
        "  getfield org/eclipse/jdt/internal/core/JavaModelOperation.resultElements [Lorg/eclipse/jdt/core/IJavaElement;",
        "  iload 9",
        "  aaload",
        "  astore 11",
        "L32:",
        ".line 739",
        "  aload 11",
        "  invokeinterface org/eclipse/jdt/core/IJavaElement.getOpenable()Lorg/eclipse/jdt/core/IOpenable; 0",
        "  checkcast org/eclipse/jdt/internal/core/Openable",
        "  astore 12",
        "L33:",
        ".line 740",
        "  aload 12",
        "  instanceof org/eclipse/jdt/internal/core/CompilationUnit",
        "  ifeq L34",
        "  aload 12",
        "  checkcast org/eclipse/jdt/internal/core/CompilationUnit",
        "  invokevirtual org/eclipse/jdt/internal/core/CompilationUnit.isWorkingCopy()Z",
        "  ifne L35",
        "L34:",
        ".line 741",
        "  aload 12",
        "  invokevirtual org/eclipse/jdt/internal/core/Openable.getParent()Lorg/eclipse/jdt/core/IJavaElement;",
        "  checkcast org/eclipse/jdt/internal/core/JavaElement",
        "  invokevirtual org/eclipse/jdt/internal/core/JavaElement.close()V",
        "L35:",
        ".line 743",
        "  aload 11",
        "  invokeinterface org/eclipse/jdt/core/IJavaElement.getElementType()I 0",
        "  tableswitch 3",
        "    L36",
        "    L36",
        "    default: L37",
        "L36:",
        ".line 746",
        "  aload 11",
        "  invokeinterface org/eclipse/jdt/core/IJavaElement.getJavaProject()Lorg/eclipse/jdt/core/IJavaProject; 0",
        "  checkcast org/eclipse/jdt/internal/core/JavaProject",
        "  invokevirtual org/eclipse/jdt/internal/core/JavaProject.resetCaches()V",
        "L37:",
        ".line 737",
        "  iinc 9 1",
        "L30:",
        "  iload 9",
        "  iload 10",
        "  if_icmplt L31",
        "L38:",
        ".line 755",
        "  aload 0",
        "  invokevirtual org/eclipse/jdt/internal/core/JavaModelOperation.isTopLevelOperation()Z",
        "  ifeq L39",
        "L40:",
        ".line 756",
        "  aload 3",
        "  getfield org/eclipse/jdt/internal/core/DeltaProcessor.javaModelDeltas Ljava/util/ArrayList;",
        "  invokevirtual java/util/ArrayList.size()I",
        "  iload 4",
        "  if_icmpgt L41",
        "  aload 3",
        "  getfield org/eclipse/jdt/internal/core/DeltaProcessor.reconcileDeltas Ljava/util/HashMap;",
        "  invokevirtual java/util/HashMap.isEmpty()Z",
        "  ifne L39",
        "L41:",
        ".line 757",
        "  aload 0",
        "  invokevirtual org/eclipse/jdt/internal/core/JavaModelOperation.hasModifiedResource()Z",
        "  ifne L39",
        "L42:",
        ".line 758",
        "  aload 3",
        "  aconst_null",
        "  iconst_0",
        "  invokevirtual org/eclipse/jdt/internal/core/DeltaProcessor.fire(Lorg/eclipse/jdt/core/IJavaElementDelta;I)V",
        "  goto L39",
        "L43:",
        ".line 761",
        "  astore 14",
        "  jsr L44",
        "L45:",
        ".line 763",
        "  aload 14",
        "  athrow",
        "L44:",
        ".line 761",
        "  astore 13",
        "L46:",
        ".line 762",
        "  aload 0",
        "  invokevirtual org/eclipse/jdt/internal/core/JavaModelOperation.popOperation()Lorg/eclipse/jdt/internal/core/JavaModelOperation;",
        "  pop",
        "L47:",
        ".line 763",
        "  ret 13",
        "L39:",
        "  jsr L44",
        "L48:",
        ".line 764",
        "  ret 7",
        "L16:",
        "  jsr L18",
        "L49:",
        ".line 765",
        "  return",
        "L50:",
        ".catch all from L5 to L9 using L9",
        ".catch all from L8 to L15 using L9",
        ".catch all from L3 to L17 using L17",
        ".catch all from L16 to L49 using L17",
        ".catch all from L20 to L43 using L43",
        ".catch all from L39 to L48 using L43"
    );

    // Check that the code compiles without an infinite loop. It cannot run by itself.
    AndroidApp app = compileWithD8(builder);
    assertNotNull(app);
  }

  // Some jsr tests that fails with org.objectweb.asm.commons.JSRInlinerAdapter.

  @Test
  // This test is based on the example on http://asm.ow2.org/doc/developer-guide.html.
  public void testJsrWithNestedJsrRetBasedOnControlFlow() throws Exception {
    JasminBuilder builder = new JasminBuilder(ClassFileVersion.JDK_1_3);
    JasminBuilder.ClassBuilder clazz = builder.addClass("Test");

    clazz.addStaticMethod("foo", ImmutableList.of("Z"), "I",
        ".limit stack 2",
        ".limit locals 3",
        "  jsr LabelSub1",
        "  ldc 1",
        "  ireturn",
        "LabelSub1:",
        "  astore 1",
        "  jsr LabelSub2",
        "  ldc 0",
        "  ireturn",
        "LabelSub2:",
        "  astore 2",
        "  iload 0",
        "  ifeq LabelZero",
        "  ret 2",
        "LabelZero:",
        "  ret 1");

    clazz.addMainMethod(
        ".limit stack 2",
        ".limit locals 1",
        "  getstatic java/lang/System/out Ljava/io/PrintStream;",
        "  ldc 0",
        "  invokestatic Test/foo(Z)I",
        "  invokevirtual java/io/PrintStream/print(I)V",
        "  getstatic java/lang/System/out Ljava/io/PrintStream;",
        "  ldc 1",
        "  invokestatic Test/foo(Z)I",
        "  invokevirtual java/io/PrintStream/print(I)V",
        "  return");

    String expected = "10";
    String javaResult = runOnJava(builder, clazz.name);
    assertEquals(expected, javaResult);
    String artResult = runOnArtD8(builder, clazz.name);
    // The ASM jsr inliner does not get the control-flow dependent ret right in his case.
    assertNotEquals(expected, artResult);
    String cfFrontendResult = runOnJavaR8CfFrontend(builder, clazz.name);
    assertNotEquals(expected, cfFrontendResult);
    // This fails with dx.
    expectDxFailure(builder);
  }

  @Test
  // This test is based on the example on http://asm.ow2.org/doc/developer-guide.html.
  public void testJsrWithNestedRetBasedOnControlFlow2() throws Exception {
    JasminBuilder builder = new JasminBuilder(ClassFileVersion.JDK_1_4);
    JasminBuilder.ClassBuilder clazz = builder.addClass("Test");

    clazz.addStaticMethod("foo", ImmutableList.of("Z"), "I",
        ".limit stack 2",
        ".limit locals 3",
        "  jsr LabelSub1",
        "  ldc 1",
        "  ireturn",
        "LabelSub1:",
        "  jsr LabelSub2",
        "  ldc 0",
        "  ireturn",
        "LabelSub2:",
        "  astore 2",
        "  astore 1",
        "  iload 0",
        "  ifeq LabelZero",
        "  ret 2",
        "LabelZero:",
        "  ret 1");

    clazz.addMainMethod(
        ".limit stack 2",
        ".limit locals 1",
        "  getstatic java/lang/System/out Ljava/io/PrintStream;",
        "  ldc 0",
        "  invokestatic Test/foo(Z)I",
        "  invokevirtual java/io/PrintStream/print(I)V",
        "  getstatic java/lang/System/out Ljava/io/PrintStream;",
        "  ldc 1",
        "  invokestatic Test/foo(Z)I",
        "  invokevirtual java/io/PrintStream/print(I)V",
        "  return");

    String expected = "10";
    String javaResult = runOnJava(builder, clazz.name);
    assertEquals(expected, javaResult);
    String artResult = runOnArtD8(builder, clazz.name);
    // The ASM jsr inliner does not get the control-flow dependent ret right in his case.
    assertNotEquals(expected, artResult);
    String cfFrontendResult = runOnJavaR8CfFrontend(builder, clazz.name);
    assertNotEquals(expected, cfFrontendResult);
    // This fails with dx.
    expectDxFailure(builder);
  }

  @Test
  // This test is based on the example on http://asm.ow2.org/doc/developer-guide.html.
  public void testJsrWithNestedRetBasedOnControlFlow3() throws Exception {
    JasminBuilder builder = new JasminBuilder(ClassFileVersion.JDK_1_4);
    JasminBuilder.ClassBuilder clazz = builder.addClass("Test");

    clazz.addStaticMethod("foo", ImmutableList.of("Z"), "I",
        ".limit stack 2",
        ".limit locals 3",
        "  jsr LabelSub1",
        "  ldc 1",
        "  ireturn",
        "LabelSub1:",
        "  jsr LabelSub2",
        "  ldc 0",
        "  ireturn",
        "LabelSub2:",
        "  swap",
        "  astore 1",
        "  astore 2",
        "  iload 0",
        "  ifeq LabelZero",
        "  ret 2",
        "LabelZero:",
        "  ret 1");

    clazz.addMainMethod(
        ".limit stack 2",
        ".limit locals 1",
        "  getstatic java/lang/System/out Ljava/io/PrintStream;",
        "  ldc 0",
        "  invokestatic Test/foo(Z)I",
        "  invokevirtual java/io/PrintStream/print(I)V",
        "  getstatic java/lang/System/out Ljava/io/PrintStream;",
        "  ldc 1",
        "  invokestatic Test/foo(Z)I",
        "  invokevirtual java/io/PrintStream/print(I)V",
        "  return");

    String expected = "10";
    String javaResult = runOnJava(builder, clazz.name);
    assertEquals(expected, javaResult);
    String artResult = runOnArtD8(builder, clazz.name);
    // The ASM jsr inliner does not get the control-flow dependent ret right in his case.
    assertNotEquals(expected, artResult);
    String cfFrontendResult = runOnJavaR8CfFrontend(builder, clazz.name);
    assertNotEquals(expected, cfFrontendResult);
    // This fails with dx.
    expectDxFailure(builder);
  }

  // Some jsr tests that fails bytecode verification on the Java VM.

  @Test
  public void testReuseAddr() throws Exception {
    JasminBuilder builder = new JasminBuilder();
    JasminBuilder.ClassBuilder clazz = builder.addClass("Test");

    clazz.addMainMethod(
        ".limit stack 3",
        ".limit locals 2",
        "  jsr LabelSub1",
        "  return",
        "LabelSub1:",
        "  jsr LabelSub2",
        "  dup",
        "  astore 0",
        "  ret 0",
        "LabelSub2:",
        "  dup",
        "  astore 0",
        "  ret 0");

    // This does not run on the Java VM (verification error).
    assertNotEquals(0, runOnJavaRaw(builder, clazz.name));
  }

  @Test
  public void testSwitchAddr() throws Exception {
    JasminBuilder builder = new JasminBuilder();
    JasminBuilder.ClassBuilder clazz = builder.addClass("Test");

    clazz.addMainMethod(
        ".limit stack 3",
        ".limit locals 2",
        "  jsr LabelSub1",
        "  astore 0",
        "  ret 0",
        "LabelSub1:",
        "  jsr LabelSub2",
        "  return",
        "LabelSub2:",
        "  swap",
        "  astore 0",
        "  ret 0");

    // This does not run on the Java VM (verification error).
    assertNotEquals(0, runOnJavaRaw(builder, clazz.name));
  }

  @Test
  public void testJsrPreserveRetAddressOverJsr() throws Exception {
    JasminBuilder builder = new JasminBuilder();
    JasminBuilder.ClassBuilder clazz = builder.addClass("Test");

    clazz.addStaticMethod("foo", ImmutableList.of("Z"), "I",
        ".limit stack 2",
        ".limit locals 2",
        "  jsr LabelSub1",
        "  ldc 0",
        "  ireturn",
        "LabelSub1:",
        "  iload 0",
        "  ifeq StoreInFirst",
        "  pop",
        "  goto NextJsr",
        "StoreInFirst:",
        "  astore 1",
        "NextJsr:",
        "  jsr LabelSub2",
        "  ldc 1",
        "  ireturn",
        "LabelSub2:",
        "  iload 0",
        "  ifeq DontStoreInSecond",  // Same as StoreInFirst
        "  astore 1",
        "  goto Ret",
        "DontStoreInSecond:",
        "  pop",
        "Ret:",
        // There will always be an address in local 1 at this point.
        "  ret 1");

    clazz.addMainMethod(
        ".limit stack 2",
        ".limit locals 1",
        "  getstatic java/lang/System/out Ljava/io/PrintStream;",
        "  ldc 0",
        "  invokestatic Test/foo(Z)I",
        "  invokevirtual java/io/PrintStream/print(I)V",
        "  getstatic java/lang/System/out Ljava/io/PrintStream;",
        "  ldc 1",
        "  invokestatic Test/foo(Z)I",
        "  invokevirtual java/io/PrintStream/print(I)V",
        "  return");

    // This does not run on the Java VM (verification error).
    assertNotEquals(0, runOnJavaRaw(builder, clazz.name));
  }
}
