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