|  | // 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 test() throws CompilationFailedException { | 
|  | testForD8() | 
|  | .addProgramClassFileData(Dump.dump()) | 
|  | .noDesugaring() | 
|  | .compileWithExpectedDiagnostics( | 
|  | diagnotics -> { | 
|  | diagnotics.assertOnlyInfos(); | 
|  | assertTrue( | 
|  | diagnotics.getInfos().stream() | 
|  | .anyMatch( | 
|  | d -> d.getDiagnosticMessage().contains("invalid locals information"))); | 
|  | }); | 
|  | } | 
|  |  | 
|  | // 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(); | 
|  | } | 
|  | } | 
|  | } |