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