// 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.utils.AndroidApp;
import com.google.common.collect.ImmutableList;
import java.nio.file.Path;
import java.nio.file.Paths;
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(Paths.get(ToolHelper.JAVA_8_RUNTIME))
            .build(),
        options -> options.enableCfFrontend = true);
    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));
  }
}
