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