Version 1.5.65

Cherry pick: Fix incorrect constraint checks for wide types.
CL: https://r8-review.googlesource.com/c/r8/+/41361
Bug: 138952302

Change-Id: I9cc5c174dad46a9ee515cf31d639222d662039fe
diff --git a/src/main/java/com/android/tools/r8/Version.java b/src/main/java/com/android/tools/r8/Version.java
index 2e7a4ab..a49bad9 100644
--- a/src/main/java/com/android/tools/r8/Version.java
+++ b/src/main/java/com/android/tools/r8/Version.java
@@ -11,7 +11,7 @@
 
   // This field is accessed from release scripts using simple pattern matching.
   // Therefore, changing this field could break our release scripts.
-  public static final String LABEL = "1.5.64";
+  public static final String LABEL = "1.5.65";
 
   private Version() {
   }
diff --git a/src/main/java/com/android/tools/r8/ir/code/Value.java b/src/main/java/com/android/tools/r8/ir/code/Value.java
index 2243641..4ad2015 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Value.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Value.java
@@ -97,12 +97,12 @@
         }
         break;
       case LONG:
-        if (typeLattice.isWide()) {
+        if (typeLattice.isWide() && !typeLattice.isDouble()) {
           return TypeLatticeElement.LONG;
         }
         break;
       case DOUBLE:
-        if (typeLattice.isWide()) {
+        if (typeLattice.isWide() && !typeLattice.isLong()) {
           return TypeLatticeElement.DOUBLE;
         }
         break;
diff --git a/src/test/java/com/android/tools/r8/SwitchDebugLocalsConflictTest.java b/src/test/java/com/android/tools/r8/SwitchDebugLocalsConflictTest.java
new file mode 100644
index 0000000..6e86fe6
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/SwitchDebugLocalsConflictTest.java
@@ -0,0 +1,672 @@
+// Copyright (c) 2019, 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;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+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;
+
+@RunWith(Parameterized.class)
+public class SwitchDebugLocalsConflictTest extends TestBase {
+
+  private final TestParameters parameters;
+
+  @Parameterized.Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withNoneRuntime().build();
+  }
+
+  public SwitchDebugLocalsConflictTest(TestParameters parameters) {
+    this.parameters = parameters;
+  }
+
+  @Test
+  public void testNewFrontend() throws Exception {
+    runTest(true);
+  }
+
+  @Test
+  public void testOldFrontend() throws Exception {
+    runTest(false);
+  }
+
+  private void runTest(boolean newFrontend) throws CompilationFailedException {
+    testForD8()
+        .addProgramClassFileData(Dump.dump())
+        .noDesugaring()
+        .addOptionsModification(options -> options.enableCfFrontend = newFrontend)
+        .compile();
+  }
+
+  // Dump of class file from b/138952302, which is produced with Java 7 and contains too large a
+  // local scope for the local variable 'valueDiv'. The larger scope causes a debug read of an
+  // uninitialized value, thus the value can be of either type long or of type double depending on
+  // which execution path leads up to the local start. More recent javac compilers emit the smaller
+  // correct scope for the local variable.
+  public static class Dump implements Opcodes {
+
+    public static byte[] dump() {
+
+      ClassWriter cw = new ClassWriter(0);
+      FieldVisitor fv;
+      MethodVisitor mv;
+      cw.visit(V1_7, ACC_PUBLIC | ACC_SUPER, "TestClass", null, "java/lang/Object", null);
+      cw.visitSource("TestClass.java", null);
+      {
+        fv = cw.visitField(ACC_PUBLIC | ACC_STATIC, "DEFAULT_VALUE", "J", null, null);
+        fv.visitEnd();
+      }
+      {
+        mv =
+            cw.visitMethod(
+                ACC_PUBLIC | ACC_STATIC,
+                "foo",
+                "([Ljava/lang/Object;I)Ljava/lang/Object;",
+                null,
+                null);
+        mv.visitCode();
+        Label label0 = new Label();
+        Label label1 = new Label();
+        Label label2 = new Label();
+        mv.visitTryCatchBlock(label0, label1, label2, "java/lang/Throwable");
+        Label label3 = new Label();
+        Label label4 = new Label();
+        mv.visitTryCatchBlock(label3, label4, label2, "java/lang/Throwable");
+        Label label5 = new Label();
+        Label label6 = new Label();
+        mv.visitTryCatchBlock(label5, label6, label2, "java/lang/Throwable");
+        Label label7 = new Label();
+        Label label8 = new Label();
+        mv.visitTryCatchBlock(label7, label8, label2, "java/lang/Throwable");
+        Label label9 = new Label();
+        Label label10 = new Label();
+        mv.visitTryCatchBlock(label9, label10, label2, "java/lang/Throwable");
+        Label label11 = new Label();
+        Label label12 = new Label();
+        mv.visitTryCatchBlock(label11, label12, label2, "java/lang/Throwable");
+        Label label13 = new Label();
+        Label label14 = new Label();
+        mv.visitTryCatchBlock(label13, label14, label2, "java/lang/Throwable");
+        Label label15 = new Label();
+        Label label16 = new Label();
+        mv.visitTryCatchBlock(label15, label16, label2, "java/lang/Throwable");
+        mv.visitLabel(label0);
+        mv.visitLineNumber(23, label0);
+        mv.visitVarInsn(ALOAD, 0);
+        Label label17 = new Label();
+        mv.visitJumpInsn(IFNULL, label17);
+        mv.visitVarInsn(ALOAD, 0);
+        mv.visitInsn(ARRAYLENGTH);
+        mv.visitJumpInsn(IFNE, label3);
+        mv.visitLabel(label17);
+        mv.visitLineNumber(24, label17);
+        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+        mv.visitFieldInsn(GETSTATIC, "TestClass", "DEFAULT_VALUE", "J");
+        mv.visitMethodInsn(INVOKESTATIC, "java/lang/Long", "valueOf", "(J)Ljava/lang/Long;", false);
+        mv.visitLabel(label1);
+        mv.visitInsn(ARETURN);
+        mv.visitLabel(label3);
+        mv.visitLineNumber(26, label3);
+        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+        mv.visitVarInsn(ALOAD, 0);
+        mv.visitInsn(ARRAYLENGTH);
+        mv.visitVarInsn(ISTORE, 2);
+        Label label18 = new Label();
+        mv.visitLabel(label18);
+        mv.visitLineNumber(27, label18);
+        mv.visitInsn(ICONST_0);
+        mv.visitVarInsn(ISTORE, 3);
+        Label label19 = new Label();
+        mv.visitLabel(label19);
+        mv.visitLineNumber(28, label19);
+        mv.visitInsn(ICONST_0);
+        mv.visitVarInsn(ISTORE, 4);
+        Label label20 = new Label();
+        mv.visitLabel(label20);
+        mv.visitLineNumber(29, label20);
+        mv.visitInsn(DCONST_0);
+        mv.visitVarInsn(DSTORE, 5);
+        Label label21 = new Label();
+        mv.visitLabel(label21);
+        mv.visitLineNumber(30, label21);
+        mv.visitInsn(LCONST_0);
+        mv.visitVarInsn(LSTORE, 7);
+        Label label22 = new Label();
+        mv.visitLabel(label22);
+        mv.visitLineNumber(31, label22);
+        mv.visitFrame(
+            Opcodes.F_FULL,
+            7,
+            new Object[] {
+              "[Ljava/lang/Object;",
+              Opcodes.INTEGER,
+              Opcodes.INTEGER,
+              Opcodes.INTEGER,
+              Opcodes.INTEGER,
+              Opcodes.DOUBLE,
+              Opcodes.LONG
+            },
+            0,
+            new Object[] {});
+        mv.visitVarInsn(ILOAD, 3);
+        mv.visitVarInsn(ILOAD, 2);
+        Label label23 = new Label();
+        mv.visitJumpInsn(IF_ICMPGE, label23);
+        Label label24 = new Label();
+        mv.visitLabel(label24);
+        mv.visitLineNumber(32, label24);
+        mv.visitVarInsn(ALOAD, 0);
+        mv.visitVarInsn(ILOAD, 3);
+        mv.visitInsn(AALOAD);
+        mv.visitVarInsn(ASTORE, 9);
+        Label label25 = new Label();
+        mv.visitLabel(label25);
+        mv.visitLineNumber(33, label25);
+        mv.visitInsn(DCONST_0);
+        mv.visitVarInsn(DSTORE, 10);
+        Label label26 = new Label();
+        mv.visitLabel(label26);
+        mv.visitLineNumber(34, label26);
+        mv.visitInsn(LCONST_0);
+        mv.visitVarInsn(LSTORE, 12);
+        Label label27 = new Label();
+        mv.visitLabel(label27);
+        mv.visitLineNumber(36, label27);
+        mv.visitVarInsn(ALOAD, 9);
+        mv.visitTypeInsn(INSTANCEOF, "java/lang/String");
+        Label label28 = new Label();
+        mv.visitJumpInsn(IFEQ, label28);
+        Label label29 = new Label();
+        mv.visitLabel(label29);
+        mv.visitLineNumber(37, label29);
+        mv.visitVarInsn(ALOAD, 9);
+        mv.visitTypeInsn(CHECKCAST, "java/lang/String");
+        mv.visitVarInsn(ASTORE, 14);
+        Label label30 = new Label();
+        mv.visitLabel(label30);
+        mv.visitLineNumber(38, label30);
+        mv.visitVarInsn(ILOAD, 4);
+        Label label31 = new Label();
+        mv.visitJumpInsn(IFNE, label31);
+        mv.visitVarInsn(ALOAD, 14);
+        mv.visitMethodInsn(
+            INVOKESTATIC,
+            "NumberUtil",
+            "hasDigit",
+            "(Ljava/lang/String;)Z",
+            false);
+        Label label32 = new Label();
+        mv.visitJumpInsn(IFEQ, label32);
+        mv.visitLabel(label31);
+        mv.visitLineNumber(39, label31);
+        mv.visitFrame(
+            Opcodes.F_FULL,
+            11,
+            new Object[] {
+              "[Ljava/lang/Object;",
+              Opcodes.INTEGER,
+              Opcodes.INTEGER,
+              Opcodes.INTEGER,
+              Opcodes.INTEGER,
+              Opcodes.DOUBLE,
+              Opcodes.LONG,
+              "java/lang/Object",
+              Opcodes.DOUBLE,
+              Opcodes.LONG,
+              "java/lang/String"
+            },
+            0,
+            new Object[] {});
+        mv.visitVarInsn(ALOAD, 14);
+        mv.visitMethodInsn(
+            INVOKESTATIC,
+            "NumberUtil",
+            "parseDouble",
+            "(Ljava/lang/String;)D",
+            false);
+        mv.visitVarInsn(DSTORE, 10);
+        Label label33 = new Label();
+        mv.visitLabel(label33);
+        mv.visitLineNumber(40, label33);
+        mv.visitInsn(ICONST_1);
+        mv.visitVarInsn(ISTORE, 4);
+        Label label34 = new Label();
+        mv.visitJumpInsn(GOTO, label34);
+        mv.visitLabel(label32);
+        mv.visitLineNumber(42, label32);
+        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+        mv.visitVarInsn(ALOAD, 14);
+        mv.visitMethodInsn(
+            INVOKESTATIC,
+            "NumberUtil",
+            "parseLong",
+            "(Ljava/lang/String;)J",
+            false);
+        mv.visitVarInsn(LSTORE, 12);
+        mv.visitLabel(label34);
+        mv.visitLineNumber(44, label34);
+        mv.visitFrame(Opcodes.F_CHOP, 1, null, 0, null);
+        Label label35 = new Label();
+        mv.visitJumpInsn(GOTO, label35);
+        mv.visitLabel(label28);
+        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+        mv.visitVarInsn(ILOAD, 4);
+        Label label36 = new Label();
+        mv.visitJumpInsn(IFNE, label36);
+        mv.visitVarInsn(ALOAD, 9);
+        mv.visitMethodInsn(
+            INVOKESTATIC,
+            "NumberUtil",
+            "isFloatPointNum",
+            "(Ljava/lang/Object;)Z",
+            false);
+        Label label37 = new Label();
+        mv.visitJumpInsn(IFEQ, label37);
+        mv.visitLabel(label36);
+        mv.visitLineNumber(45, label36);
+        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+        mv.visitVarInsn(ALOAD, 9);
+        mv.visitTypeInsn(CHECKCAST, "java/lang/Number");
+        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Number", "doubleValue", "()D", false);
+        mv.visitVarInsn(DSTORE, 10);
+        Label label38 = new Label();
+        mv.visitLabel(label38);
+        mv.visitLineNumber(46, label38);
+        mv.visitInsn(ICONST_1);
+        mv.visitVarInsn(ISTORE, 4);
+        mv.visitJumpInsn(GOTO, label35);
+        mv.visitLabel(label37);
+        mv.visitLineNumber(47, label37);
+        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+        mv.visitVarInsn(ALOAD, 9);
+        mv.visitTypeInsn(INSTANCEOF, "java/lang/Integer");
+        Label label39 = new Label();
+        mv.visitJumpInsn(IFNE, label39);
+        mv.visitVarInsn(ALOAD, 9);
+        mv.visitTypeInsn(INSTANCEOF, "java/lang/Long");
+        Label label40 = new Label();
+        mv.visitJumpInsn(IFEQ, label40);
+        mv.visitLabel(label39);
+        mv.visitLineNumber(48, label39);
+        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+        mv.visitVarInsn(ALOAD, 9);
+        mv.visitTypeInsn(CHECKCAST, "java/lang/Number");
+        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Number", "longValue", "()J", false);
+        mv.visitVarInsn(LSTORE, 12);
+        mv.visitJumpInsn(GOTO, label35);
+        mv.visitLabel(label40);
+        mv.visitLineNumber(50, label40);
+        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+        mv.visitFieldInsn(GETSTATIC, "TestClass", "DEFAULT_VALUE", "J");
+        mv.visitVarInsn(LSTORE, 12);
+        mv.visitLabel(label35);
+        mv.visitLineNumber(53, label35);
+        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+        mv.visitVarInsn(ILOAD, 4);
+        Label label41 = new Label();
+        mv.visitJumpInsn(IFEQ, label41);
+        Label label42 = new Label();
+        mv.visitLabel(label42);
+        mv.visitLineNumber(54, label42);
+        mv.visitVarInsn(LLOAD, 7);
+        mv.visitInsn(LCONST_0);
+        mv.visitInsn(LCMP);
+        Label label43 = new Label();
+        mv.visitJumpInsn(IFEQ, label43);
+        Label label44 = new Label();
+        mv.visitLabel(label44);
+        mv.visitLineNumber(55, label44);
+        mv.visitVarInsn(LLOAD, 7);
+        mv.visitInsn(L2D);
+        mv.visitVarInsn(DSTORE, 5);
+        Label label45 = new Label();
+        mv.visitLabel(label45);
+        mv.visitLineNumber(56, label45);
+        mv.visitInsn(LCONST_0);
+        mv.visitVarInsn(LSTORE, 7);
+        mv.visitLabel(label43);
+        mv.visitLineNumber(58, label43);
+        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+        mv.visitVarInsn(ILOAD, 3);
+        Label label46 = new Label();
+        mv.visitJumpInsn(IFNE, label46);
+        Label label47 = new Label();
+        mv.visitLabel(label47);
+        mv.visitLineNumber(59, label47);
+        mv.visitVarInsn(DLOAD, 10);
+        mv.visitVarInsn(DSTORE, 5);
+        Label label48 = new Label();
+        mv.visitJumpInsn(GOTO, label48);
+        mv.visitLabel(label46);
+        mv.visitLineNumber(61, label46);
+        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+        mv.visitVarInsn(ILOAD, 1);
+        Label label49 = new Label();
+        Label label50 = new Label();
+        Label label51 = new Label();
+        Label label52 = new Label();
+        Label label53 = new Label();
+        Label label54 = new Label();
+        mv.visitTableSwitchInsn(
+            1, 5, label54, new Label[] {label49, label50, label51, label52, label53});
+        mv.visitLabel(label49);
+        mv.visitLineNumber(63, label49);
+        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+        mv.visitVarInsn(DLOAD, 5);
+        mv.visitVarInsn(DLOAD, 10);
+        mv.visitInsn(DADD);
+        mv.visitVarInsn(DSTORE, 5);
+        Label label55 = new Label();
+        mv.visitLabel(label55);
+        mv.visitLineNumber(64, label55);
+        mv.visitJumpInsn(GOTO, label54);
+        mv.visitLabel(label50);
+        mv.visitLineNumber(66, label50);
+        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+        mv.visitVarInsn(DLOAD, 5);
+        mv.visitVarInsn(DLOAD, 10);
+        mv.visitInsn(DSUB);
+        mv.visitVarInsn(DSTORE, 5);
+        Label label56 = new Label();
+        mv.visitLabel(label56);
+        mv.visitLineNumber(67, label56);
+        mv.visitJumpInsn(GOTO, label54);
+        mv.visitLabel(label51);
+        mv.visitLineNumber(69, label51);
+        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+        mv.visitVarInsn(DLOAD, 5);
+        mv.visitVarInsn(DLOAD, 10);
+        mv.visitInsn(DMUL);
+        mv.visitVarInsn(DSTORE, 5);
+        Label label57 = new Label();
+        mv.visitLabel(label57);
+        mv.visitLineNumber(70, label57);
+        mv.visitJumpInsn(GOTO, label54);
+        mv.visitLabel(label52);
+        mv.visitLineNumber(72, label52);
+        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+        mv.visitVarInsn(DLOAD, 10);
+        mv.visitVarInsn(DSTORE, 14);
+        Label label58 = new Label();
+        mv.visitLabel(label58);
+        mv.visitLineNumber(73, label58);
+        // start of 'valueDiv' ====================================
+        mv.visitVarInsn(DLOAD, 14);
+        mv.visitInsn(DCONST_0);
+        mv.visitInsn(DCMPL);
+        mv.visitJumpInsn(IFNE, label5);
+        Label label59 = new Label();
+        mv.visitLabel(label59);
+        mv.visitLineNumber(74, label59);
+        mv.visitFieldInsn(GETSTATIC, "TestClass", "DEFAULT_VALUE", "J");
+        mv.visitMethodInsn(INVOKESTATIC, "java/lang/Long", "valueOf", "(J)Ljava/lang/Long;", false);
+        mv.visitLabel(label4);
+        mv.visitInsn(ARETURN);
+        mv.visitLabel(label5);
+        mv.visitLineNumber(76, label5);
+        mv.visitFrame(Opcodes.F_APPEND, 1, new Object[] {Opcodes.DOUBLE}, 0, null);
+        mv.visitVarInsn(DLOAD, 5);
+        mv.visitVarInsn(DLOAD, 14);
+        mv.visitInsn(DDIV);
+        mv.visitVarInsn(DSTORE, 5);
+        Label label60 = new Label();
+        mv.visitLabel(label60);
+        mv.visitLineNumber(77, label60);
+        mv.visitJumpInsn(GOTO, label54);
+        mv.visitLabel(label53);
+        mv.visitLineNumber(79, label53);
+        mv.visitFrame(Opcodes.F_CHOP, 1, null, 0, null);
+        // **********************
+        // Entry to switch case for which 'valueDiv' has not been initialized.
+        // Reading slot 14 at this point will create a phi with operands of type long and double.
+        // **********************
+        mv.visitVarInsn(DLOAD, 10);
+        mv.visitVarInsn(DSTORE, 16);
+        Label label61 = new Label();
+        mv.visitLabel(label61);
+        mv.visitLineNumber(80, label61);
+        mv.visitVarInsn(DLOAD, 16);
+        mv.visitInsn(DCONST_0);
+        mv.visitInsn(DCMPL);
+        mv.visitJumpInsn(IFNE, label7);
+        Label label62 = new Label();
+        mv.visitLabel(label62);
+        mv.visitLineNumber(81, label62);
+        mv.visitFieldInsn(GETSTATIC, "TestClass", "DEFAULT_VALUE", "J");
+        mv.visitMethodInsn(INVOKESTATIC, "java/lang/Long", "valueOf", "(J)Ljava/lang/Long;", false);
+        mv.visitLabel(label6);
+        mv.visitInsn(ARETURN);
+        mv.visitLabel(label7);
+        mv.visitLineNumber(83, label7);
+        mv.visitFrame(
+            Opcodes.F_APPEND, 3, new Object[] {Opcodes.TOP, Opcodes.TOP, Opcodes.DOUBLE}, 0, null);
+        mv.visitVarInsn(DLOAD, 5);
+        mv.visitVarInsn(DLOAD, 16);
+        mv.visitInsn(DREM);
+        mv.visitVarInsn(DSTORE, 5);
+        // end of local 'valueDiv' ====================================
+        mv.visitLabel(label54);
+        mv.visitLineNumber(85, label54);
+        mv.visitFrame(Opcodes.F_CHOP, 3, null, 0, null);
+        mv.visitJumpInsn(GOTO, label48);
+        mv.visitLabel(label41);
+        mv.visitLineNumber(89, label41);
+        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+        mv.visitVarInsn(ILOAD, 3);
+        Label label63 = new Label();
+        mv.visitJumpInsn(IFNE, label63);
+        Label label64 = new Label();
+        mv.visitLabel(label64);
+        mv.visitLineNumber(90, label64);
+        mv.visitVarInsn(LLOAD, 12);
+        mv.visitVarInsn(LSTORE, 7);
+        mv.visitJumpInsn(GOTO, label48);
+        mv.visitLabel(label63);
+        mv.visitLineNumber(92, label63);
+        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+        mv.visitVarInsn(ILOAD, 1);
+        Label label65 = new Label();
+        Label label66 = new Label();
+        Label label67 = new Label();
+        Label label68 = new Label();
+        Label label69 = new Label();
+        mv.visitTableSwitchInsn(
+            1, 5, label48, new Label[] {label65, label66, label67, label68, label69});
+        mv.visitLabel(label65);
+        mv.visitLineNumber(94, label65);
+        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+        mv.visitVarInsn(LLOAD, 7);
+        mv.visitVarInsn(LLOAD, 12);
+        mv.visitInsn(LADD);
+        mv.visitVarInsn(LSTORE, 7);
+        Label label70 = new Label();
+        mv.visitLabel(label70);
+        mv.visitLineNumber(95, label70);
+        mv.visitJumpInsn(GOTO, label48);
+        mv.visitLabel(label66);
+        mv.visitLineNumber(97, label66);
+        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+        mv.visitVarInsn(LLOAD, 7);
+        mv.visitVarInsn(LLOAD, 12);
+        mv.visitInsn(LSUB);
+        mv.visitVarInsn(LSTORE, 7);
+        Label label71 = new Label();
+        mv.visitLabel(label71);
+        mv.visitLineNumber(98, label71);
+        mv.visitJumpInsn(GOTO, label48);
+        mv.visitLabel(label67);
+        mv.visitLineNumber(100, label67);
+        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+        mv.visitVarInsn(LLOAD, 7);
+        mv.visitVarInsn(LLOAD, 12);
+        mv.visitInsn(LMUL);
+        mv.visitVarInsn(LSTORE, 7);
+        Label label72 = new Label();
+        mv.visitLabel(label72);
+        mv.visitLineNumber(101, label72);
+        mv.visitJumpInsn(GOTO, label48);
+        mv.visitLabel(label68);
+        mv.visitLineNumber(103, label68);
+        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+        mv.visitVarInsn(LLOAD, 12);
+        mv.visitInsn(LCONST_0);
+        mv.visitInsn(LCMP);
+        mv.visitJumpInsn(IFNE, label9);
+        Label label73 = new Label();
+        mv.visitLabel(label73);
+        mv.visitLineNumber(104, label73);
+        mv.visitFieldInsn(GETSTATIC, "TestClass", "DEFAULT_VALUE", "J");
+        mv.visitMethodInsn(INVOKESTATIC, "java/lang/Long", "valueOf", "(J)Ljava/lang/Long;", false);
+        mv.visitLabel(label8);
+        mv.visitInsn(ARETURN);
+        mv.visitLabel(label9);
+        mv.visitLineNumber(106, label9);
+        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+        mv.visitVarInsn(LLOAD, 7);
+        mv.visitVarInsn(LLOAD, 12);
+        mv.visitInsn(LDIV);
+        mv.visitVarInsn(LSTORE, 7);
+        Label label74 = new Label();
+        mv.visitLabel(label74);
+        mv.visitLineNumber(107, label74);
+        mv.visitJumpInsn(GOTO, label48);
+        mv.visitLabel(label69);
+        mv.visitLineNumber(109, label69);
+        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+        mv.visitVarInsn(LLOAD, 12);
+        mv.visitVarInsn(LSTORE, 14);
+        Label label75 = new Label();
+        mv.visitLabel(label75);
+        mv.visitLineNumber(110, label75);
+        mv.visitVarInsn(LLOAD, 14);
+        mv.visitInsn(LCONST_0);
+        mv.visitInsn(LCMP);
+        mv.visitJumpInsn(IFNE, label11);
+        Label label76 = new Label();
+        mv.visitLabel(label76);
+        mv.visitLineNumber(111, label76);
+        mv.visitFieldInsn(GETSTATIC, "TestClass", "DEFAULT_VALUE", "J");
+        mv.visitMethodInsn(INVOKESTATIC, "java/lang/Long", "valueOf", "(J)Ljava/lang/Long;", false);
+        mv.visitLabel(label10);
+        mv.visitInsn(ARETURN);
+        mv.visitLabel(label11);
+        mv.visitLineNumber(113, label11);
+        mv.visitFrame(Opcodes.F_APPEND, 1, new Object[] {Opcodes.LONG}, 0, null);
+        mv.visitVarInsn(LLOAD, 7);
+        mv.visitVarInsn(LLOAD, 14);
+        mv.visitInsn(LREM);
+        mv.visitVarInsn(LSTORE, 7);
+        mv.visitLabel(label48);
+        mv.visitLineNumber(118, label48);
+        mv.visitFrame(Opcodes.F_CHOP, 1, null, 0, null);
+        mv.visitVarInsn(ILOAD, 4);
+        mv.visitJumpInsn(IFEQ, label13);
+        mv.visitVarInsn(DLOAD, 5);
+        mv.visitLdcInsn(new Double("Infinity"));
+        mv.visitInsn(DCMPL);
+        Label label77 = new Label();
+        mv.visitJumpInsn(IFEQ, label77);
+        mv.visitVarInsn(DLOAD, 5);
+        mv.visitLdcInsn(new Double("-Infinity"));
+        mv.visitInsn(DCMPL);
+        mv.visitJumpInsn(IFEQ, label77);
+        mv.visitLdcInsn(new Double("NaN"));
+        mv.visitVarInsn(DLOAD, 5);
+        mv.visitInsn(DCMPL);
+        mv.visitJumpInsn(IFNE, label13);
+        mv.visitLabel(label77);
+        mv.visitLineNumber(120, label77);
+        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+        mv.visitInsn(DCONST_0);
+        mv.visitMethodInsn(
+            INVOKESTATIC, "java/lang/Double", "valueOf", "(D)Ljava/lang/Double;", false);
+        mv.visitLabel(label12);
+        mv.visitInsn(ARETURN);
+        mv.visitLabel(label13);
+        mv.visitLineNumber(122, label13);
+        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+        mv.visitIincInsn(3, 1);
+        Label label78 = new Label();
+        mv.visitLabel(label78);
+        mv.visitLineNumber(123, label78);
+        mv.visitJumpInsn(GOTO, label22);
+        mv.visitLabel(label23);
+        mv.visitLineNumber(125, label23);
+        mv.visitFrame(Opcodes.F_CHOP, 3, null, 0, null);
+        mv.visitVarInsn(ILOAD, 4);
+        mv.visitJumpInsn(IFEQ, label15);
+        Label label79 = new Label();
+        mv.visitLabel(label79);
+        mv.visitLineNumber(126, label79);
+        mv.visitVarInsn(DLOAD, 5);
+        mv.visitMethodInsn(
+            INVOKESTATIC, "java/lang/Double", "valueOf", "(D)Ljava/lang/Double;", false);
+        mv.visitLabel(label14);
+        mv.visitInsn(ARETURN);
+        mv.visitLabel(label15);
+        mv.visitLineNumber(128, label15);
+        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+        mv.visitVarInsn(LLOAD, 7);
+        mv.visitMethodInsn(INVOKESTATIC, "java/lang/Long", "valueOf", "(J)Ljava/lang/Long;", false);
+        mv.visitLabel(label16);
+        mv.visitInsn(ARETURN);
+        mv.visitLabel(label2);
+        mv.visitLineNumber(130, label2);
+        mv.visitFrame(
+            Opcodes.F_FULL,
+            2,
+            new Object[] {"[Ljava/lang/Object;", Opcodes.INTEGER},
+            1,
+            new Object[] {"java/lang/Throwable"});
+        mv.visitVarInsn(ASTORE, 2);
+        Label label80 = new Label();
+        mv.visitLabel(label80);
+        mv.visitLineNumber(132, label80);
+        mv.visitFieldInsn(GETSTATIC, "TestClass", "DEFAULT_VALUE", "J");
+        mv.visitMethodInsn(INVOKESTATIC, "java/lang/Long", "valueOf", "(J)Ljava/lang/Long;", false);
+        mv.visitInsn(ARETURN);
+        Label label81 = new Label();
+        mv.visitLabel(label81);
+        mv.visitLocalVariable("numStr", "Ljava/lang/String;", null, label30, label34, 14);
+        mv.visitLocalVariable("valueMod", "D", null, label61, label54, 16);
+        mv.visitLocalVariable("valueDiv", "D", null, label58, label54, 14);
+        mv.visitLocalVariable("valueMod", "J", null, label75, label48, 14);
+        mv.visitLocalVariable("num", "Ljava/lang/Object;", null, label25, label78, 9);
+        mv.visitLocalVariable("dTmp", "D", null, label26, label78, 10);
+        mv.visitLocalVariable("lTmp", "J", null, label27, label78, 12);
+        mv.visitLocalVariable("len", "I", null, label18, label2, 2);
+        mv.visitLocalVariable("i", "I", null, label19, label2, 3);
+        mv.visitLocalVariable("needDouble", "Z", null, label20, label2, 4);
+        mv.visitLocalVariable("douRet", "D", null, label21, label2, 5);
+        mv.visitLocalVariable("lonRet", "J", null, label22, label2, 7);
+        mv.visitLocalVariable("e", "Ljava/lang/Throwable;", null, label80, label80, 2);
+        mv.visitLocalVariable("operationList", "[Ljava/lang/Object;", null, label0, label81, 0);
+        mv.visitLocalVariable("type", "I", null, label0, label81, 1);
+        mv.visitMaxs(4, 18);
+        mv.visitEnd();
+      }
+      {
+        mv = cw.visitMethod(ACC_STATIC, "<clinit>", "()V", null, null);
+        mv.visitCode();
+        Label label0 = new Label();
+        mv.visitLabel(label0);
+        mv.visitLineNumber(19, label0);
+        mv.visitInsn(LCONST_0);
+        mv.visitFieldInsn(PUTSTATIC, "TestClass", "DEFAULT_VALUE", "J");
+        mv.visitInsn(RETURN);
+        mv.visitMaxs(2, 0);
+        mv.visitEnd();
+      }
+      cw.visitEnd();
+      return cw.toByteArray();
+    }
+  }
+}