| // 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 com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage; |
| import static org.hamcrest.CoreMatchers.containsString; |
| |
| 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 { |
| |
| @Parameterized.Parameters(name = "{0}") |
| public static TestParametersCollection data() { |
| return getTestParameters().withNoneRuntime().build(); |
| } |
| |
| public SwitchDebugLocalsConflictTest(TestParameters parameters) { |
| parameters.assertNoneRuntime(); |
| } |
| |
| @Test |
| public void test() throws CompilationFailedException { |
| testForD8() |
| .addProgramClassFileData(Dump.dump()) |
| .disableDesugaring() |
| .compileWithExpectedDiagnostics( |
| diagnotics -> { |
| diagnotics.assertNoErrors(); |
| diagnotics.assertInfoThatMatches( |
| diagnosticMessage(containsString("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(); |
| } |
| } |
| } |