Merge "Regression test for bug on 6.0.1 dex2oat compiler."
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index e978b86..c7fcdcc 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -436,11 +436,32 @@
     BOOT_LIBS = builder.build();
   }
 
-  private static final String LIB_PATH = TOOLS + "/linux/art/lib";
   private static final Path DX = getDxExecutablePath();
-  private static final String DEX2OAT = TOOLS + "/linux/art/bin/dex2oat";
-  private static final String ANGLER_DIR = TOOLS + "/linux/art/product/angler";
-  private static final String ANGLER_BOOT_IMAGE = ANGLER_DIR + "/system/framework/boot.art";
+
+  private static Path getDexVmPath(DexVm vm) {
+    return Paths.get(
+        TOOLS,
+        "linux",
+        vm.getVersion() == DexVm.Version.DEFAULT
+            ? "art"
+            : "art-" + vm.getVersion());
+  }
+
+  private static Path getDexVmLibPath(DexVm vm) {
+    return getDexVmPath(vm).resolve("lib");
+  }
+
+  private static Path getDex2OatPath(DexVm vm) {
+    return getDexVmPath(vm).resolve("bin").resolve("dex2oat");
+  }
+
+  private static Path getAnglerPath(DexVm vm) {
+    return getDexVmPath(vm).resolve("product").resolve("angler");
+  }
+
+  private static Path getAnglerBootImagePath(DexVm vm) {
+    return getAnglerPath(vm).resolve("system").resolve("framework").resolve("boot.art");
+  }
 
   public static byte[] getClassAsBytes(Class clazz) throws IOException {
     String s = clazz.getSimpleName() + ".class";
@@ -1120,22 +1141,27 @@
   }
 
   public static void runDex2Oat(Path file, Path outFile) throws IOException {
+    // TODO(b/79191363): Support running dex2oat for past android versions.
+    runDex2Oat(file, outFile, DexVm.ART_DEFAULT);
+  }
+
+  public static void runDex2Oat(Path file, Path outFile, DexVm vm) throws IOException {
     Assume.assumeTrue(ToolHelper.artSupported());
     // TODO(jmhenaff): find a way to run this on windows (push dex and run on device/emulator?)
     Assume.assumeTrue(!ToolHelper.isWindows());
     assert Files.exists(file);
     assert ByteStreams.toByteArray(Files.newInputStream(file)).length > 0;
     List<String> command = new ArrayList<>();
-    command.add(DEX2OAT);
-    command.add("--android-root=" + ANGLER_DIR);
+    command.add(getDex2OatPath(vm).toString());
+    command.add("--android-root=" + getAnglerPath(vm));
     command.add("--runtime-arg");
     command.add("-Xnorelocate");
-    command.add("--boot-image=" + ANGLER_BOOT_IMAGE);
+    command.add("--boot-image=" + getAnglerBootImagePath(vm));
     command.add("--dex-file=" + file.toAbsolutePath());
     command.add("--oat-file=" + outFile.toAbsolutePath());
     command.add("--instruction-set=arm64");
     ProcessBuilder builder = new ProcessBuilder(command);
-    builder.environment().put("LD_LIBRARY_PATH", LIB_PATH);
+    builder.environment().put("LD_LIBRARY_PATH", getDexVmLibPath(vm).toString());
     ProcessResult result = runProcess(builder);
     if (result.exitCode != 0) {
       fail("dex2oat failed, exit code " + result.exitCode + ", stderr:\n" + result.stderr);
diff --git a/src/test/java/com/android/tools/r8/regress/b77842465/Regress77842465.java b/src/test/java/com/android/tools/r8/regress/b77842465/Regress77842465.java
new file mode 100644
index 0000000..ec16097
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/regress/b77842465/Regress77842465.java
@@ -0,0 +1,36 @@
+// Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.regress.b77842465;
+
+import com.android.tools.r8.AsmTestBase;
+import com.android.tools.r8.CompilationFailedException;
+import com.android.tools.r8.D8;
+import com.android.tools.r8.D8Command;
+import com.android.tools.r8.OutputMode;
+import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.ToolHelper.DexVm;
+import com.android.tools.r8.origin.Origin;
+import java.io.IOException;
+import java.nio.file.Path;
+import org.junit.Ignore;
+import org.junit.Test;
+
+public class Regress77842465 extends AsmTestBase {
+
+  @Test
+  @Ignore("b/77842465")
+  public void test() throws CompilationFailedException, IOException {
+
+    Path dexOut = temp.getRoot().toPath().resolve("out.jar");
+    Path oatOut = temp.getRoot().toPath().resolve("out.odex");
+
+    D8.run(D8Command.builder()
+        .addClassProgramData(Regress77842465Dump.dump(), Origin.unknown())
+        .setOutput(dexOut, OutputMode.DexIndexed)
+        .setDisableDesugaring(true)
+        .build());
+
+    ToolHelper.runDex2Oat(dexOut, oatOut, DexVm.ART_6_0_1_HOST);
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/regress/b77842465/Regress77842465Dump.java b/src/test/java/com/android/tools/r8/regress/b77842465/Regress77842465Dump.java
new file mode 100644
index 0000000..7a5aaea
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/regress/b77842465/Regress77842465Dump.java
@@ -0,0 +1,394 @@
+// Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.regress.b77842465;
+
+import com.android.tools.r8.utils.DescriptorUtils;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.FieldVisitor;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+
+public class Regress77842465Dump implements Opcodes {
+
+  public static final String CLASS_NAME = "a.a";
+  public static final String CLASS_DESC = DescriptorUtils.javaTypeToDescriptor(CLASS_NAME);
+  public static final String CLASS_INTERNAL = DescriptorUtils.descriptorToInternalName(CLASS_DESC);
+
+  public static byte[] dump() {
+
+    ClassWriter cw = new ClassWriter(0);
+    FieldVisitor fv;
+    MethodVisitor mv;
+
+    cw.visit(
+        V1_7, ACC_PUBLIC + ACC_FINAL + ACC_SUPER, CLASS_INTERNAL, null, "java/lang/Object", null);
+
+    {
+      fv = cw.visitField(0, "b", "I", null, null);
+      fv.visitEnd();
+    }
+    {
+      fv = cw.visitField(0, "c", "Ljava/lang/String;", null, null);
+      fv.visitEnd();
+    }
+    {
+      fv = cw.visitField(0, "d", "Ljava/lang/String;", null, null);
+      fv.visitEnd();
+    }
+    {
+      fv = cw.visitField(0, "g", "J", null, null);
+      fv.visitEnd();
+    }
+    {
+      fv = cw.visitField(0, "h", "J", null, null);
+      fv.visitEnd();
+    }
+
+    {
+      mv = cw.visitMethod(ACC_PUBLIC + ACC_FINAL, "a",
+          "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;IJ)" + CLASS_DESC,
+          null, null);
+      mv.visitCode();
+      Label l0 = new Label();
+      Label l1 = new Label();
+      Label l2 = new Label();
+      mv.visitTryCatchBlock(l0, l1, l2, "java/lang/Exception");
+      Label l3 = new Label();
+      Label l4 = new Label();
+      Label l5 = new Label();
+      mv.visitTryCatchBlock(l3, l4, l5, "java/lang/Exception");
+      mv.visitVarInsn(ALOAD, 3);
+      mv.visitFieldInsn(GETFIELD, "java/lang/Object", "c", "Ljava/util/Map;");
+      mv.visitVarInsn(ASTORE, 3);
+      mv.visitMethodInsn(INVOKESTATIC, "java/lang/System", "currentTimeMillis", "()J", false);
+      mv.visitVarInsn(LSTORE, 8);
+      mv.visitInsn(LCONST_0);
+      mv.visitVarInsn(LSTORE, 10);
+      mv.visitInsn(LCONST_0);
+      mv.visitVarInsn(LSTORE, 12);
+      mv.visitInsn(LCONST_0);
+      mv.visitVarInsn(LSTORE, 14);
+      mv.visitInsn(LCONST_0);
+      mv.visitVarInsn(LSTORE, 16);
+      mv.visitInsn(LCONST_0);
+      mv.visitVarInsn(LSTORE, 18);
+      mv.visitInsn(LCONST_0);
+      mv.visitVarInsn(LSTORE, 20);
+      mv.visitInsn(ICONST_0);
+      mv.visitVarInsn(ISTORE, 7);
+      mv.visitInsn(ICONST_0);
+      mv.visitVarInsn(ISTORE, 22);
+      mv.visitTypeInsn(NEW, "java/util/ArrayList");
+      mv.visitMethodInsn(INVOKESPECIAL, "java/util/ArrayList", "<init>", "()V", false);
+      mv.visitVarInsn(ALOAD, 3);
+      mv.visitLdcInsn("Date");
+      mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map", "get",
+          "(Ljava/lang/Object;)Ljava/lang/Object;", true);
+      mv.visitTypeInsn(CHECKCAST, "java/util/List");
+      mv.visitInsn(DUP);
+      mv.visitVarInsn(ASTORE, 23);
+      Label l6 = new Label();
+      mv.visitJumpInsn(IFNULL, l6);
+      mv.visitVarInsn(ALOAD, 23);
+      mv.visitMethodInsn(INVOKEINTERFACE, "java/util/List", "size", "()I", true);
+      mv.visitJumpInsn(IFLE, l6);
+      mv.visitVarInsn(ALOAD, 3);
+      mv.visitLdcInsn("Date");
+      mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map", "get",
+          "(Ljava/lang/Object;)Ljava/lang/Object;", true);
+      mv.visitTypeInsn(CHECKCAST, "java/util/List");
+      mv.visitInsn(ICONST_0);
+      mv.visitMethodInsn(INVOKEINTERFACE, "java/util/List", "get", "(I)Ljava/lang/Object;", true);
+      mv.visitTypeInsn(CHECKCAST, "java/lang/String");
+      mv.visitInsn(DUP);
+      mv.visitVarInsn(ASTORE, 23);
+      mv.visitJumpInsn(IFNULL, l6);
+      mv.visitVarInsn(ALOAD, 23);
+      mv.visitMethodInsn(INVOKESTATIC, CLASS_INTERNAL, "a", "(Ljava/lang/String;)J",
+          false);
+      mv.visitVarInsn(LSTORE, 10);
+      mv.visitLabel(l6);
+      mv.visitVarInsn(ALOAD, 3);
+      mv.visitLdcInsn("Cache-Control");
+      mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map", "get",
+          "(Ljava/lang/Object;)Ljava/lang/Object;", true);
+      mv.visitTypeInsn(CHECKCAST, "java/util/List");
+      mv.visitInsn(DUP);
+      mv.visitVarInsn(ASTORE, 23);
+      Label l7 = new Label();
+      mv.visitJumpInsn(IFNULL, l7);
+      mv.visitVarInsn(ALOAD, 23);
+      mv.visitMethodInsn(INVOKEINTERFACE, "java/util/List", "size", "()I", true);
+      mv.visitJumpInsn(IFLE, l7);
+      mv.visitVarInsn(ALOAD, 3);
+      mv.visitLdcInsn("Cache-Control");
+      mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map", "get",
+          "(Ljava/lang/Object;)Ljava/lang/Object;", true);
+      mv.visitTypeInsn(CHECKCAST, "java/util/List");
+      mv.visitInsn(ICONST_0);
+      mv.visitMethodInsn(INVOKEINTERFACE, "java/util/List", "get", "(I)Ljava/lang/Object;", true);
+      mv.visitTypeInsn(CHECKCAST, "java/lang/String");
+      mv.visitInsn(DUP);
+      mv.visitVarInsn(ASTORE, 23);
+      mv.visitJumpInsn(IFNULL, l7);
+      mv.visitInsn(ICONST_1);
+      mv.visitVarInsn(ISTORE, 7);
+      mv.visitVarInsn(ALOAD, 23);
+      mv.visitLdcInsn(",");
+      mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "split",
+          "(Ljava/lang/String;)[Ljava/lang/String;", false);
+      mv.visitVarInsn(ASTORE, 23);
+      mv.visitInsn(ICONST_0);
+      mv.visitVarInsn(ISTORE, 24);
+      Label l8 = new Label();
+      mv.visitLabel(l8);
+      mv.visitVarInsn(ILOAD, 24);
+      mv.visitVarInsn(ALOAD, 23);
+      mv.visitInsn(ARRAYLENGTH);
+      mv.visitJumpInsn(IF_ICMPGE, l7);
+      mv.visitVarInsn(ALOAD, 23);
+      mv.visitVarInsn(ILOAD, 24);
+      mv.visitInsn(AALOAD);
+      mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "trim", "()Ljava/lang/String;", false);
+      mv.visitInsn(DUP);
+      mv.visitVarInsn(ASTORE, 25);
+      mv.visitLdcInsn("no-cache");
+      mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "equals", "(Ljava/lang/Object;)Z",
+          false);
+      Label l9 = new Label();
+      mv.visitJumpInsn(IFNE, l9);
+      mv.visitVarInsn(ALOAD, 25);
+      mv.visitLdcInsn("no-store");
+      mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "equals", "(Ljava/lang/Object;)Z",
+          false);
+      mv.visitJumpInsn(IFNE, l9);
+      mv.visitVarInsn(ALOAD, 25);
+      mv.visitLdcInsn("max-age=");
+      mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "startsWith", "(Ljava/lang/String;)Z",
+          false);
+      Label l10 = new Label();
+      mv.visitJumpInsn(IFEQ, l10);
+      mv.visitLabel(l0);
+      mv.visitVarInsn(ALOAD, 25);
+      mv.visitIntInsn(BIPUSH, 8);
+      mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "substring", "(I)Ljava/lang/String;",
+          false);
+      mv.visitMethodInsn(INVOKESTATIC, "java/lang/Long", "parseLong", "(Ljava/lang/String;)J",
+          false);
+      mv.visitVarInsn(LSTORE, 18);
+      mv.visitLabel(l1);
+      mv.visitJumpInsn(GOTO, l9);
+      mv.visitLabel(l2);
+      mv.visitVarInsn(ASTORE, 25);
+      mv.visitMethodInsn(INVOKESTATIC, CLASS_INTERNAL, "b", "()Ljava/lang/String;", false);
+      mv.visitInsn(POP);
+      mv.visitVarInsn(ALOAD, 25);
+      mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Exception", "getMessage", "()Ljava/lang/String;",
+          false);
+      mv.visitInsn(POP);
+      mv.visitJumpInsn(GOTO, l9);
+      mv.visitLabel(l10);
+      mv.visitVarInsn(ALOAD, 25);
+      mv.visitLdcInsn("stale-while-revalidate=");
+      mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "startsWith", "(Ljava/lang/String;)Z",
+          false);
+      Label l11 = new Label();
+      mv.visitJumpInsn(IFEQ, l11);
+      mv.visitLabel(l3);
+      mv.visitVarInsn(ALOAD, 25);
+      mv.visitIntInsn(BIPUSH, 23);
+      mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "substring", "(I)Ljava/lang/String;",
+          false);
+      mv.visitMethodInsn(INVOKESTATIC, "java/lang/Long", "parseLong", "(Ljava/lang/String;)J",
+          false);
+      mv.visitVarInsn(LSTORE, 20);
+      mv.visitLabel(l4);
+      mv.visitJumpInsn(GOTO, l9);
+      mv.visitLabel(l5);
+      mv.visitVarInsn(ASTORE, 25);
+      mv.visitMethodInsn(INVOKESTATIC, CLASS_INTERNAL, "b", "()Ljava/lang/String;",
+          false);
+      mv.visitInsn(POP);
+      mv.visitVarInsn(ALOAD, 25);
+      mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Exception", "getMessage", "()Ljava/lang/String;",
+          false);
+      mv.visitInsn(POP);
+      mv.visitJumpInsn(GOTO, l9);
+      mv.visitLabel(l11);
+      mv.visitVarInsn(ALOAD, 25);
+      mv.visitLdcInsn("must-revalidate");
+      mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "equals", "(Ljava/lang/Object;)Z",
+          false);
+      Label l12 = new Label();
+      mv.visitJumpInsn(IFNE, l12);
+      mv.visitVarInsn(ALOAD, 25);
+      mv.visitLdcInsn("proxy-revalidate");
+      mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "equals", "(Ljava/lang/Object;)Z",
+          false);
+      mv.visitJumpInsn(IFEQ, l9);
+      mv.visitLabel(l12);
+      mv.visitInsn(ICONST_1);
+      mv.visitVarInsn(ISTORE, 22);
+      mv.visitLabel(l9);
+      mv.visitIincInsn(24, 1);
+      mv.visitJumpInsn(GOTO, l8);
+      mv.visitLabel(l7);
+      mv.visitVarInsn(ALOAD, 3);
+      mv.visitLdcInsn("Expires");
+      mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map", "get",
+          "(Ljava/lang/Object;)Ljava/lang/Object;", true);
+      mv.visitTypeInsn(CHECKCAST, "java/util/List");
+      mv.visitInsn(DUP);
+      mv.visitVarInsn(ASTORE, 23);
+      Label l13 = new Label();
+      mv.visitJumpInsn(IFNULL, l13);
+      mv.visitVarInsn(ALOAD, 23);
+      mv.visitMethodInsn(INVOKEINTERFACE, "java/util/List", "size", "()I", true);
+      mv.visitJumpInsn(IFLE, l13);
+      mv.visitVarInsn(ALOAD, 3);
+      mv.visitLdcInsn("Expires");
+      mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map", "get",
+          "(Ljava/lang/Object;)Ljava/lang/Object;", true);
+      mv.visitTypeInsn(CHECKCAST, "java/util/List");
+      mv.visitInsn(ICONST_0);
+      mv.visitMethodInsn(INVOKEINTERFACE, "java/util/List", "get", "(I)Ljava/lang/Object;", true);
+      mv.visitTypeInsn(CHECKCAST, "java/lang/String");
+      mv.visitInsn(DUP);
+      mv.visitVarInsn(ASTORE, 23);
+      mv.visitJumpInsn(IFNULL, l13);
+      mv.visitVarInsn(ALOAD, 23);
+      mv.visitMethodInsn(INVOKESTATIC, CLASS_INTERNAL, "a", "(Ljava/lang/String;)J",
+          false);
+      mv.visitVarInsn(LSTORE, 12);
+      mv.visitLabel(l13);
+      mv.visitVarInsn(ALOAD, 3);
+      mv.visitLdcInsn("Last-Modified");
+      mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map", "get",
+          "(Ljava/lang/Object;)Ljava/lang/Object;", true);
+      mv.visitTypeInsn(CHECKCAST, "java/util/List");
+      mv.visitInsn(DUP);
+      mv.visitVarInsn(ASTORE, 23);
+      Label l14 = new Label();
+      mv.visitJumpInsn(IFNULL, l14);
+      mv.visitVarInsn(ALOAD, 23);
+      mv.visitMethodInsn(INVOKEINTERFACE, "java/util/List", "size", "()I", true);
+      mv.visitJumpInsn(IFLE, l14);
+      mv.visitVarInsn(ALOAD, 3);
+      mv.visitLdcInsn("Last-Modified");
+      mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map", "get",
+          "(Ljava/lang/Object;)Ljava/lang/Object;", true);
+      mv.visitTypeInsn(CHECKCAST, "java/util/List");
+      mv.visitInsn(ICONST_0);
+      mv.visitMethodInsn(INVOKEINTERFACE, "java/util/List", "get", "(I)Ljava/lang/Object;", true);
+      mv.visitTypeInsn(CHECKCAST, "java/lang/String");
+      mv.visitInsn(DUP);
+      mv.visitVarInsn(ASTORE, 23);
+      mv.visitJumpInsn(IFNULL, l14);
+      mv.visitVarInsn(ALOAD, 23);
+      mv.visitMethodInsn(INVOKESTATIC, CLASS_INTERNAL, "a", "(Ljava/lang/String;)J",
+          false);
+      mv.visitInsn(POP2);
+      mv.visitLabel(l14);
+      mv.visitVarInsn(ALOAD, 3);
+      mv.visitLdcInsn("ETag");
+      mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map", "get",
+          "(Ljava/lang/Object;)Ljava/lang/Object;", true);
+      mv.visitTypeInsn(CHECKCAST, "java/util/List");
+      mv.visitInsn(DUP);
+      mv.visitVarInsn(ASTORE, 23);
+      Label l15 = new Label();
+      mv.visitJumpInsn(IFNULL, l15);
+      mv.visitVarInsn(ALOAD, 23);
+      mv.visitMethodInsn(INVOKEINTERFACE, "java/util/List", "size", "()I", true);
+      mv.visitJumpInsn(IFLE, l15);
+      mv.visitVarInsn(ALOAD, 3);
+      mv.visitLdcInsn("ETag");
+      mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map", "get",
+          "(Ljava/lang/Object;)Ljava/lang/Object;", true);
+      mv.visitTypeInsn(CHECKCAST, "java/util/List");
+      mv.visitInsn(ICONST_0);
+      mv.visitMethodInsn(INVOKEINTERFACE, "java/util/List", "get", "(I)Ljava/lang/Object;", true);
+      mv.visitInsn(POP);
+      mv.visitLabel(l15);
+      mv.visitVarInsn(ILOAD, 7);
+      Label l16 = new Label();
+      mv.visitJumpInsn(IFEQ, l16);
+      mv.visitVarInsn(LLOAD, 8);
+      mv.visitVarInsn(LLOAD, 18);
+      mv.visitLdcInsn(new Long(1000L));
+      mv.visitInsn(LMUL);
+      mv.visitInsn(LADD);
+      mv.visitVarInsn(LSTORE, 14);
+      mv.visitVarInsn(ILOAD, 22);
+      Label l17 = new Label();
+      mv.visitJumpInsn(IFEQ, l17);
+      mv.visitVarInsn(LLOAD, 14);
+      Label l18 = new Label();
+      mv.visitJumpInsn(GOTO, l18);
+      mv.visitLabel(l17);
+      mv.visitVarInsn(LLOAD, 14);
+      mv.visitVarInsn(LLOAD, 20);
+      mv.visitLdcInsn(new Long(1000L));
+      mv.visitInsn(LMUL);
+      mv.visitInsn(LADD);
+      mv.visitLabel(l18);
+      mv.visitVarInsn(LSTORE, 16);
+      Label l19 = new Label();
+      mv.visitJumpInsn(GOTO, l19);
+      mv.visitLabel(l16);
+      mv.visitVarInsn(LLOAD, 10);
+      mv.visitInsn(LCONST_0);
+      mv.visitInsn(LCMP);
+      mv.visitJumpInsn(IFLE, l19);
+      mv.visitVarInsn(LLOAD, 12);
+      mv.visitVarInsn(LLOAD, 10);
+      mv.visitInsn(LCMP);
+      mv.visitJumpInsn(IFLT, l19);
+      mv.visitVarInsn(LLOAD, 8);
+      mv.visitVarInsn(LLOAD, 12);
+      mv.visitVarInsn(LLOAD, 10);
+      mv.visitInsn(LSUB);
+      mv.visitInsn(LADD);
+      mv.visitInsn(DUP2);
+      mv.visitVarInsn(LSTORE, 14);
+      mv.visitVarInsn(LSTORE, 16);
+      mv.visitLabel(l19);
+      mv.visitVarInsn(ALOAD, 0);
+      mv.visitVarInsn(ALOAD, 1);
+      mv.visitFieldInsn(PUTFIELD, CLASS_INTERNAL, "c", "Ljava/lang/String;");
+      mv.visitVarInsn(ALOAD, 0);
+      mv.visitVarInsn(ALOAD, 2);
+      mv.visitFieldInsn(PUTFIELD, CLASS_INTERNAL, "d", "Ljava/lang/String;");
+      mv.visitVarInsn(ALOAD, 0);
+      mv.visitVarInsn(ILOAD, 4);
+      mv.visitFieldInsn(PUTFIELD, CLASS_INTERNAL, "b", "I");
+      mv.visitVarInsn(ALOAD, 0);
+      mv.visitVarInsn(LLOAD, 8);
+      mv.visitVarInsn(LLOAD, 5);
+      mv.visitLdcInsn(new Long(1000L));
+      mv.visitInsn(LMUL);
+      mv.visitInsn(LADD);
+      mv.visitFieldInsn(PUTFIELD, CLASS_INTERNAL, "g", "J");
+      mv.visitVarInsn(ALOAD, 0);
+      mv.visitVarInsn(LLOAD, 14);
+      mv.visitFieldInsn(PUTFIELD, CLASS_INTERNAL, "h", "J");
+      mv.visitVarInsn(ALOAD, 0);
+      mv.visitVarInsn(ALOAD, 0);
+      mv.visitFieldInsn(GETFIELD, CLASS_INTERNAL, "g", "J");
+      mv.visitVarInsn(LLOAD, 16);
+      mv.visitMethodInsn(INVOKESTATIC, "java/lang/Math", "min", "(JJ)J", false);
+      mv.visitFieldInsn(PUTFIELD, CLASS_INTERNAL, "g", "J");
+      mv.visitVarInsn(ALOAD, 0);
+      mv.visitInsn(ARETURN);
+      mv.visitMaxs(7, 26);
+      mv.visitEnd();
+    }
+
+    cw.visitEnd();
+
+    return cw.toByteArray();
+  }
+}
+