Example usage for org.objectweb.asm MethodVisitor visitTryCatchBlock

List of usage examples for org.objectweb.asm MethodVisitor visitTryCatchBlock

Introduction

In this page you can find the example usage for org.objectweb.asm MethodVisitor visitTryCatchBlock.

Prototype

public void visitTryCatchBlock(final Label start, final Label end, final Label handler, final String type) 

Source Link

Document

Visits a try catch block.

Usage

From source file:org.spongepowered.common.event.ClassEventListenerFactory.java

License:MIT License

private static byte[] generateClass(String name, Class<?> handle, Method method, Class<?> eventClass,
        Class<? extends EventFilter> filter) {
    name = name.replace('.', '/');
    final String handleName = Type.getInternalName(handle);
    final String handleDescriptor = Type.getDescriptor(handle);
    final String filterName = Type.getInternalName(filter);
    String eventDescriptor = "(";
    for (int i = 0; i < method.getParameterCount(); i++) {
        eventDescriptor += Type.getDescriptor(method.getParameterTypes()[i]);
    }/*  ww w  .  j  ava  2 s .  co  m*/
    eventDescriptor += ")V";

    ClassWriter cw = new ClassWriter(0);
    MethodVisitor mv;
    FieldVisitor fv;

    cw.visit(V1_6, ACC_PUBLIC + ACC_FINAL + ACC_SUPER, name, null, BASE_HANDLER, null);
    {
        fv = cw.visitField(ACC_PRIVATE + ACC_STATIC, "FILTER", "L" + filterName + ";", null, null);
        fv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_STATIC, "<clinit>", "()V", null, null);
        mv.visitCode();
        Label l0 = new Label();
        Label l1 = new Label();
        Label l2 = new Label();
        mv.visitTryCatchBlock(l0, l1, l2, "java/lang/Exception");
        mv.visitLabel(l0);
        mv.visitLdcInsn(Type.getType(filter));
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "newInstance", "()Ljava/lang/Object;", false);
        mv.visitTypeInsn(CHECKCAST, filterName);
        mv.visitFieldInsn(PUTSTATIC, name, "FILTER", "L" + filterName + ";");
        mv.visitLabel(l1);
        Label l3 = new Label();
        mv.visitJumpInsn(GOTO, l3);
        mv.visitLabel(l2);
        mv.visitFrame(F_SAME1, 0, null, 1, new Object[] { "java/lang/Exception" });
        mv.visitVarInsn(ASTORE, 0);
        mv.visitMethodInsn(INVOKESTATIC, Type.getInternalName(SpongeImpl.class), "getLogger",
                "()" + Type.getDescriptor(Logger.class), false);
        mv.visitLdcInsn("Error initializing event filter");
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKEINTERFACE, Type.getInternalName(Logger.class), "error",
                "(Ljava/lang/String;Ljava/lang/Throwable;)V", true);
        Label l5 = new Label();
        mv.visitLabel(l5);
        mv.visitLineNumber(220, l5);
        mv.visitInsn(ACONST_NULL);
        mv.visitFieldInsn(PUTSTATIC, name, "FILTER", "L" + filterName + ";");
        mv.visitLabel(l3);
        mv.visitFrame(F_SAME, 0, null, 0, null);
        mv.visitInsn(RETURN);
        mv.visitMaxs(3, 1);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "<init>", '(' + handleDescriptor + ")V", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKESPECIAL, BASE_HANDLER, "<init>", "(Ljava/lang/Object;)V", false);
        mv.visitInsn(RETURN);
        mv.visitMaxs(2, 2);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "handle", HANDLE_METHOD_DESCRIPTOR, null,
                new String[] { "java/lang/Exception" });
        mv.visitCode();
        mv.visitFieldInsn(GETSTATIC, name, "FILTER", "L" + filterName + ";");
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKEINTERFACE, Type.getInternalName(EventFilter.class), "filter",
                FILTER_DESCRIPTOR, true);
        mv.visitVarInsn(ASTORE, 2);
        mv.visitVarInsn(ALOAD, 2);
        Label l2 = new Label();
        mv.visitJumpInsn(IFNULL, l2);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, name, "handle", "Ljava/lang/Object;");
        mv.visitTypeInsn(CHECKCAST, handleName);
        for (int i = 0; i < method.getParameterCount(); i++) {
            mv.visitVarInsn(ALOAD, 2);
            mv.visitIntInsn(BIPUSH, i);
            mv.visitInsn(AALOAD);
            mv.visitTypeInsn(CHECKCAST, Type.getInternalName(method.getParameterTypes()[i]));
        }
        mv.visitMethodInsn(INVOKEVIRTUAL, handleName, method.getName(), eventDescriptor, false);
        mv.visitLabel(l2);
        mv.visitFrame(F_APPEND, 1, new Object[] { "[Ljava/lang/Object;" }, 0, null);
        mv.visitInsn(RETURN);
        mv.visitMaxs(4, 3);
        mv.visitEnd();
    }
    cw.visitEnd();

    return cw.toByteArray();
}

From source file:org.spongepowered.test.decompile.SwitchTests.java

License:Open Source License

private static void generateSwitchSyntheticEclipse(ClassWriter cw) {

    MethodVisitor mv = cw.visitMethod(ACC_STATIC + ACC_SYNTHETIC,
            "$SWITCH_TABLE$org$spongepowered$test$decompile$SwitchTests$TestEnum", "()[I", null, null);
    mv.visitCode();/*from w w  w . j a v  a 2  s  .  c  o m*/
    Label l0 = new Label();
    Label l1 = new Label();
    Label l2 = new Label();
    mv.visitTryCatchBlock(l0, l1, l2, "java/lang/NoSuchFieldError");
    Label l3 = new Label();
    Label l4 = new Label();
    Label l5 = new Label();
    mv.visitTryCatchBlock(l3, l4, l5, "java/lang/NoSuchFieldError");
    Label l6 = new Label();
    Label l7 = new Label();
    Label l8 = new Label();
    mv.visitTryCatchBlock(l6, l7, l8, "java/lang/NoSuchFieldError");
    Label l9 = new Label();
    Label l10 = new Label();
    Label l11 = new Label();
    mv.visitTryCatchBlock(l9, l10, l11, "java/lang/NoSuchFieldError");
    Label l12 = new Label();
    Label l13 = new Label();
    Label l14 = new Label();
    mv.visitTryCatchBlock(l12, l13, l14, "java/lang/NoSuchFieldError");
    Label l15 = new Label();
    Label l16 = new Label();
    Label l17 = new Label();
    mv.visitTryCatchBlock(l15, l16, l17, "java/lang/NoSuchFieldError");
    Label l18 = new Label();
    Label l19 = new Label();
    Label l20 = new Label();
    mv.visitTryCatchBlock(l18, l19, l20, "java/lang/NoSuchFieldError");
    Label l21 = new Label();
    Label l22 = new Label();
    Label l23 = new Label();
    mv.visitTryCatchBlock(l21, l22, l23, "java/lang/NoSuchFieldError");
    Label l24 = new Label();
    Label l25 = new Label();
    Label l26 = new Label();
    mv.visitTryCatchBlock(l24, l25, l26, "java/lang/NoSuchFieldError");
    Label l27 = new Label();
    Label l28 = new Label();
    Label l29 = new Label();
    mv.visitTryCatchBlock(l27, l28, l29, "java/lang/NoSuchFieldError");
    Label l30 = new Label();
    mv.visitLabel(l30);
    mv.visitLineNumber(28, l30);
    mv.visitFieldInsn(GETSTATIC, "org/spongepowered/test/decompile/SwitchTests",
            "$SWITCH_TABLE$org$spongepowered$test$decompile$SwitchTests$TestEnum", "[I");
    Label l31 = new Label();
    mv.visitJumpInsn(IFNULL, l31);
    mv.visitFieldInsn(GETSTATIC, "org/spongepowered/test/decompile/SwitchTests",
            "$SWITCH_TABLE$org$spongepowered$test$decompile$SwitchTests$TestEnum", "[I");
    mv.visitInsn(ARETURN);
    mv.visitLabel(l31);
    mv.visitMethodInsn(INVOKESTATIC, "org/spongepowered/test/decompile/SwitchTests$TestEnum", "values",
            "()[Lorg/spongepowered/test/decompile/SwitchTests$TestEnum;", false);
    mv.visitInsn(ARRAYLENGTH);
    mv.visitIntInsn(NEWARRAY, T_INT);
    mv.visitVarInsn(ASTORE, 0);
    mv.visitLabel(l0);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(GETSTATIC, "org/spongepowered/test/decompile/SwitchTests$TestEnum", "EIGHT",
            "Lorg/spongepowered/test/decompile/SwitchTests$TestEnum;");
    mv.visitMethodInsn(INVOKEVIRTUAL, "org/spongepowered/test/decompile/SwitchTests$TestEnum", "ordinal", "()I",
            false);
    mv.visitIntInsn(BIPUSH, 8);
    mv.visitInsn(IASTORE);
    mv.visitLabel(l1);
    mv.visitJumpInsn(GOTO, l3);
    mv.visitLabel(l2);
    mv.visitInsn(POP);
    mv.visitLabel(l3);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(GETSTATIC, "org/spongepowered/test/decompile/SwitchTests$TestEnum", "FIVE",
            "Lorg/spongepowered/test/decompile/SwitchTests$TestEnum;");
    mv.visitMethodInsn(INVOKEVIRTUAL, "org/spongepowered/test/decompile/SwitchTests$TestEnum", "ordinal", "()I",
            false);
    mv.visitInsn(ICONST_5);
    mv.visitInsn(IASTORE);
    mv.visitLabel(l4);
    mv.visitJumpInsn(GOTO, l6);
    mv.visitLabel(l5);
    mv.visitInsn(POP);
    mv.visitLabel(l6);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(GETSTATIC, "org/spongepowered/test/decompile/SwitchTests$TestEnum", "FOUR",
            "Lorg/spongepowered/test/decompile/SwitchTests$TestEnum;");
    mv.visitMethodInsn(INVOKEVIRTUAL, "org/spongepowered/test/decompile/SwitchTests$TestEnum", "ordinal", "()I",
            false);
    mv.visitInsn(ICONST_4);
    mv.visitInsn(IASTORE);
    mv.visitLabel(l7);
    mv.visitJumpInsn(GOTO, l9);
    mv.visitLabel(l8);
    mv.visitInsn(POP);
    mv.visitLabel(l9);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(GETSTATIC, "org/spongepowered/test/decompile/SwitchTests$TestEnum", "NINE",
            "Lorg/spongepowered/test/decompile/SwitchTests$TestEnum;");
    mv.visitMethodInsn(INVOKEVIRTUAL, "org/spongepowered/test/decompile/SwitchTests$TestEnum", "ordinal", "()I",
            false);
    mv.visitIntInsn(BIPUSH, 9);
    mv.visitInsn(IASTORE);
    mv.visitLabel(l10);
    mv.visitJumpInsn(GOTO, l12);
    mv.visitLabel(l11);
    mv.visitInsn(POP);
    mv.visitLabel(l12);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(GETSTATIC, "org/spongepowered/test/decompile/SwitchTests$TestEnum", "ONE",
            "Lorg/spongepowered/test/decompile/SwitchTests$TestEnum;");
    mv.visitMethodInsn(INVOKEVIRTUAL, "org/spongepowered/test/decompile/SwitchTests$TestEnum", "ordinal", "()I",
            false);
    mv.visitInsn(ICONST_1);
    mv.visitInsn(IASTORE);
    mv.visitLabel(l13);
    mv.visitJumpInsn(GOTO, l15);
    mv.visitLabel(l14);
    mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { "java/lang/NoSuchFieldError" });
    mv.visitInsn(POP);
    mv.visitLabel(l15);
    mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(GETSTATIC, "org/spongepowered/test/decompile/SwitchTests$TestEnum", "SEVEN",
            "Lorg/spongepowered/test/decompile/SwitchTests$TestEnum;");
    mv.visitMethodInsn(INVOKEVIRTUAL, "org/spongepowered/test/decompile/SwitchTests$TestEnum", "ordinal", "()I",
            false);
    mv.visitIntInsn(BIPUSH, 7);
    mv.visitInsn(IASTORE);
    mv.visitLabel(l16);
    mv.visitJumpInsn(GOTO, l18);
    mv.visitLabel(l17);
    mv.visitInsn(POP);
    mv.visitLabel(l18);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(GETSTATIC, "org/spongepowered/test/decompile/SwitchTests$TestEnum", "SIX",
            "Lorg/spongepowered/test/decompile/SwitchTests$TestEnum;");
    mv.visitMethodInsn(INVOKEVIRTUAL, "org/spongepowered/test/decompile/SwitchTests$TestEnum", "ordinal", "()I",
            false);
    mv.visitIntInsn(BIPUSH, 6);
    mv.visitInsn(IASTORE);
    mv.visitLabel(l19);
    mv.visitJumpInsn(GOTO, l21);
    mv.visitLabel(l20);
    mv.visitInsn(POP);
    mv.visitLabel(l21);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(GETSTATIC, "org/spongepowered/test/decompile/SwitchTests$TestEnum", "TEN",
            "Lorg/spongepowered/test/decompile/SwitchTests$TestEnum;");
    mv.visitMethodInsn(INVOKEVIRTUAL, "org/spongepowered/test/decompile/SwitchTests$TestEnum", "ordinal", "()I",
            false);
    mv.visitIntInsn(BIPUSH, 10);
    mv.visitInsn(IASTORE);
    mv.visitLabel(l22);
    mv.visitJumpInsn(GOTO, l24);
    mv.visitLabel(l23);
    mv.visitInsn(POP);
    mv.visitLabel(l24);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(GETSTATIC, "org/spongepowered/test/decompile/SwitchTests$TestEnum", "THREE",
            "Lorg/spongepowered/test/decompile/SwitchTests$TestEnum;");
    mv.visitMethodInsn(INVOKEVIRTUAL, "org/spongepowered/test/decompile/SwitchTests$TestEnum", "ordinal", "()I",
            false);
    mv.visitInsn(ICONST_3);
    mv.visitInsn(IASTORE);
    mv.visitLabel(l25);
    mv.visitJumpInsn(GOTO, l27);
    mv.visitLabel(l26);
    mv.visitInsn(POP);
    mv.visitLabel(l27);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(GETSTATIC, "org/spongepowered/test/decompile/SwitchTests$TestEnum", "TWO",
            "Lorg/spongepowered/test/decompile/SwitchTests$TestEnum;");
    mv.visitMethodInsn(INVOKEVIRTUAL, "org/spongepowered/test/decompile/SwitchTests$TestEnum", "ordinal", "()I",
            false);
    mv.visitInsn(ICONST_2);
    mv.visitInsn(IASTORE);
    mv.visitLabel(l28);
    Label l32 = new Label();
    mv.visitJumpInsn(GOTO, l32);
    mv.visitLabel(l29);
    mv.visitInsn(POP);
    mv.visitLabel(l32);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitInsn(DUP);
    mv.visitFieldInsn(PUTSTATIC, "org/spongepowered/test/decompile/SwitchTests",
            "$SWITCH_TABLE$org$spongepowered$test$decompile$SwitchTests$TestEnum", "[I");
    mv.visitInsn(ARETURN);
    mv.visitMaxs(0, 0);
    mv.visitEnd();
}

From source file:org.spongepowered.test.decompile.TryCatchTests.java

License:Open Source License

@Test
public void testTryCatch() {
    TestMethodBuilder builder = new TestMethodBuilder("test_mth", "()V");
    MethodVisitor mv = builder.getGenerator();
    Label l0 = new Label();
    Label l1 = new Label();
    Label l2 = new Label();
    Label l4 = new Label();
    mv.visitTryCatchBlock(l0, l1, l2, "java/lang/NullPointerException");
    mv.visitLabel(l0);//from   w  ww  .j av a 2s.  c  o  m
    mv.visitMethodInsn(INVOKESTATIC, THIS_TYPE.getInternalName(), "body", "()V", false);
    mv.visitLabel(l1);
    mv.visitJumpInsn(GOTO, l4);
    mv.visitLabel(l2);
    mv.visitVarInsn(ASTORE, 2);
    mv.visitVarInsn(ALOAD, 2);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/NullPointerException", "printStackTrace", "()V", false);
    mv.visitLabel(l4);
    mv.visitInsn(RETURN);
    Label l5 = new Label();
    mv.visitLabel(l5);
    mv.visitLocalVariable("e", "Ljava/lang/NullPointerException;", null, l2, l5, 2);

    String insn = TestHelper.getAsString(builder.finish(), "test_mth");
    String good = "try {\n" + "    org.spongepowered.test.decompile.TryCatchTests.body();\n"
            + "} catch (NullPointerException e) {\n" + "    e.printStackTrace();\n" + "}";
    Assert.assertEquals(good, insn);
}

From source file:org.spongepowered.test.decompile.TryCatchTests.java

License:Open Source License

@Test
public void testTryMultiCatch() {
    TestMethodBuilder builder = new TestMethodBuilder("test_mth", "()V");
    MethodVisitor mv = builder.getGenerator();
    Label l0 = new Label();
    Label l1 = new Label();
    Label l2 = new Label();
    Label l3 = new Label();
    Label l4 = new Label();
    mv.visitTryCatchBlock(l0, l1, l2, "java/lang/NullPointerException");
    mv.visitTryCatchBlock(l0, l1, l3, "java/lang/OutOfMemoryError");
    mv.visitLabel(l0);/*ww  w  .  j  a  v a 2s  .  c o  m*/
    mv.visitMethodInsn(INVOKESTATIC, THIS_TYPE.getInternalName(), "body", "()V", false);
    mv.visitLabel(l1);
    mv.visitJumpInsn(GOTO, l4);
    mv.visitLabel(l2);
    mv.visitVarInsn(ASTORE, 2);
    mv.visitVarInsn(ALOAD, 2);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/NullPointerException", "printStackTrace", "()V", false);
    mv.visitJumpInsn(GOTO, l4);
    mv.visitLabel(l3);
    mv.visitVarInsn(ASTORE, 2);
    mv.visitVarInsn(ALOAD, 2);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/OutOfMemoryError", "printStackTrace", "()V", false);
    mv.visitLabel(l4);
    mv.visitInsn(RETURN);
    Label l5 = new Label();
    mv.visitLabel(l5);
    mv.visitLocalVariable("e", "Ljava/lang/NullPointerException;", null, l2, l3, 2);
    mv.visitLocalVariable("e", "Ljava/lang/OutOfMemoryError;", null, l3, l4, 2);

    String insn = TestHelper.getAsString(builder.finish(), "test_mth");
    String good = "try {\n" + "    org.spongepowered.test.decompile.TryCatchTests.body();\n"
            + "} catch (NullPointerException e) {\n" + "    e.printStackTrace();\n"
            + "} catch (OutOfMemoryError e) {\n" + "    e.printStackTrace();\n" + "}";
    Assert.assertEquals(good, insn);
}

From source file:org.spongepowered.test.decompile.TryCatchTests.java

License:Open Source License

@Test
public void testTryPipeCatch() {
    TestMethodBuilder builder = new TestMethodBuilder("test_mth", "()V");
    MethodVisitor mv = builder.getGenerator();
    Label l0 = new Label();
    Label l1 = new Label();
    Label l2 = new Label();
    Label l4 = new Label();
    mv.visitTryCatchBlock(l0, l1, l2, "java/lang/NullPointerException");
    mv.visitTryCatchBlock(l0, l1, l2, "java/lang/OutOfMemoryError");
    mv.visitLabel(l0);//w w  w  . ja  va2s  .  co  m
    mv.visitMethodInsn(INVOKESTATIC, THIS_TYPE.getInternalName(), "body", "()V", false);
    mv.visitLabel(l1);
    mv.visitJumpInsn(GOTO, l4);
    mv.visitLabel(l2);
    mv.visitVarInsn(ASTORE, 2);
    mv.visitVarInsn(ALOAD, 2);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/NullPointerException", "printStackTrace", "()V", false);
    mv.visitLabel(l4);
    mv.visitInsn(RETURN);
    Label l5 = new Label();
    mv.visitLabel(l5);
    mv.visitLocalVariable("e", "Ljava/lang/NullPointerException;", null, l2, l4, 2);

    String insn = TestHelper.getAsString(builder.finish(), "test_mth");
    String good = "try {\n" + "    org.spongepowered.test.decompile.TryCatchTests.body();\n"
            + "} catch (NullPointerException | OutOfMemoryError e) {\n" + "    e.printStackTrace();\n" + "}";
    Assert.assertEquals(good, insn);
}

From source file:org.spongepowered.test.decompile.TryCatchTests.java

License:Open Source License

@Test
public void testTryCatchNested() {
    TestMethodBuilder builder = new TestMethodBuilder("test_mth", "()V");
    MethodVisitor mv = builder.getGenerator();
    Label l0 = new Label();
    Label l1 = new Label();
    Label l2 = new Label();
    Label l3 = new Label();
    Label l4 = new Label();
    mv.visitTryCatchBlock(l0, l1, l2, "java/lang/Exception");
    mv.visitTryCatchBlock(l0, l3, l4, "java/lang/NullPointerException");
    mv.visitLabel(l0);//from  w  ww  .ja v a2  s .  c  o  m
    mv.visitMethodInsn(INVOKESTATIC, THIS_TYPE.getInternalName(), "body", "()V", false);
    mv.visitLabel(l1);
    Label l5 = new Label();
    mv.visitJumpInsn(GOTO, l5);
    mv.visitLabel(l2);
    mv.visitVarInsn(ASTORE, 3);
    Label l6 = new Label();
    mv.visitLabel(l6);
    mv.visitVarInsn(ALOAD, 3);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Exception", "printStackTrace", "()V", false);
    mv.visitLabel(l3);
    mv.visitJumpInsn(GOTO, l5);
    mv.visitLabel(l4);
    mv.visitVarInsn(ASTORE, 3);
    Label l7 = new Label();
    mv.visitLabel(l7);
    mv.visitVarInsn(ALOAD, 3);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/NullPointerException", "printStackTrace", "()V", false);
    mv.visitLabel(l5);
    mv.visitInsn(RETURN);
    Label l8 = new Label();
    mv.visitLabel(l8);
    mv.visitLocalVariable("e", "Ljava/lang/Exception;", null, l6, l3, 3);
    mv.visitLocalVariable("e", "Ljava/lang/NullPointerException;", null, l7, l5, 3);

    String insn = TestHelper.getAsString(builder.finish(), "test_mth");
    String good = "try {\n" + "    try {\n" + "        org.spongepowered.test.decompile.TryCatchTests.body();\n"
            + "    } catch (Exception e) {\n" + "        e.printStackTrace();\n" + "    }\n"
            + "} catch (NullPointerException e) {\n" + "    e.printStackTrace();\n" + "}";
    Assert.assertEquals(good, insn);
}

From source file:org.spongepowered.test.decompile.TryCatchTests.java

License:Open Source License

@Test
public void testTryCatchWithControlFlow() {
    TestMethodBuilder builder = new TestMethodBuilder("test_mth", "()V");
    MethodVisitor mv = builder.getGenerator();
    Label l0 = new Label();
    Label l1 = new Label();
    Label l2 = new Label();
    Label l4 = new Label();
    mv.visitTryCatchBlock(l0, l1, l2, "java/lang/NullPointerException");
    mv.visitLabel(l0);/*w w  w.j av a 2  s. c om*/
    mv.visitMethodInsn(INVOKESTATIC, THIS_TYPE.getInternalName(), "body", "()V", false);
    mv.visitLabel(l1);
    mv.visitJumpInsn(GOTO, l4);
    mv.visitLabel(l2);
    mv.visitVarInsn(ASTORE, 2);
    mv.visitVarInsn(ALOAD, 2);
    mv.visitJumpInsn(IFNULL, l4);
    mv.visitVarInsn(ALOAD, 2);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/NullPointerException", "printStackTrace", "()V", false);
    mv.visitLabel(l4);
    mv.visitInsn(RETURN);
    Label l5 = new Label();
    mv.visitLabel(l5);
    mv.visitLocalVariable("e", "Ljava/lang/NullPointerException;", null, l2, l5, 2);

    String insn = TestHelper.getAsString(builder.finish(), "test_mth");
    String good = "try {\n" + "    org.spongepowered.test.decompile.TryCatchTests.body();\n"
            + "} catch (NullPointerException e) {\n" + "    if (e != null) {\n"
            + "        e.printStackTrace();\n" + "    }\n" + "}";
    Assert.assertEquals(good, insn);
}

From source file:org.spongepowered.test.decompile.TryCatchTests.java

License:Open Source License

@Test
public void testTryCatchReturnedTernary() {
    TestMethodBuilder builder = new TestMethodBuilder("test_mth", "(Z)I");
    MethodVisitor mv = builder.getGenerator();
    Label l0 = new Label();
    Label l1 = new Label();
    Label l2 = new Label();
    mv.visitTryCatchBlock(l0, l1, l2, "java/lang/Exception");
    mv.visitLabel(l0);//from w w w. jav a2 s  .c  o  m
    mv.visitVarInsn(ILOAD, 1);
    Label l3 = new Label();
    mv.visitJumpInsn(IFEQ, l3);
    mv.visitIntInsn(BIPUSH, 6);
    mv.visitJumpInsn(GOTO, l1);
    mv.visitLabel(l3);
    mv.visitInsn(ICONST_3);
    mv.visitLabel(l1);
    mv.visitInsn(IRETURN);
    mv.visitLabel(l2);
    mv.visitVarInsn(ASTORE, 2);
    Label l4 = new Label();
    mv.visitLabel(l4);
    mv.visitInsn(ICONST_0);
    mv.visitInsn(IRETURN);
    Label l5 = new Label();
    mv.visitLabel(l5);
    mv.visitLocalVariable("a", "Z", null, l0, l5, 1);
    mv.visitLocalVariable("e", "Ljava/lang/Exception;", null, l4, l5, 2);

    String insn = TestHelper.getAsString(builder.finish(), "test_mth");
    String good = "try {\n" + "    return a ? 6 : 3;\n" + "} catch (Exception e) {\n" + "    return 0;\n" + "}";
    Assert.assertEquals(good, insn);
}

From source file:org.springframework.migrationanalyzer.contributions.bytecode.DelegatingMethodVisitor.java

License:Apache License

@Override
public void visitTryCatchBlock(Label start, Label end, Label handler, String type) {
    for (MethodVisitor delegate : this.delegates) {
        delegate.visitTryCatchBlock(start, end, handler, type);
    }//from w  ww  .  ja v  a 2 s.c o m
}

From source file:org.springsource.loaded.SystemClassReflectionRewriter.java

License:Apache License

public static void generateJLRF_GetLong(ClassWriter cw, String classname) {
    FieldVisitor fv = cw.visitField(ACC_PUBLIC + ACC_STATIC, jlrfGetLongMember, "Ljava/lang/reflect/Method;",
            null, null);//from w w  w  .  j a  v  a2s. c o  m
    fv.visitEnd();

    MethodVisitor mv = cw.visitMethod(ACC_PRIVATE + ACC_STATIC, jlrfGetLongMember, jlrfGetLongDescriptor, null,
            new String[] { "java/lang/IllegalAccessException", "java/lang/IllegalArgumentException" });
    mv.visitCode();
    Label l0 = new Label();
    Label l1 = new Label();
    Label l2 = new Label();
    mv.visitTryCatchBlock(l0, l1, l2, "java/lang/Exception");
    Label l3 = new Label();
    mv.visitLabel(l3);
    mv.visitFieldInsn(GETSTATIC, classname, jlrfGetLongMember, "Ljava/lang/reflect/Method;");
    mv.visitJumpInsn(IFNONNULL, l0);
    Label l4 = new Label();
    mv.visitLabel(l4);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitVarInsn(ALOAD, 1);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Field", "getLong", "(Ljava/lang/Object;)J");
    mv.visitInsn(LRETURN);
    mv.visitLabel(l0);
    mv.visitFieldInsn(GETSTATIC, classname, jlrfGetLongMember, "Ljava/lang/reflect/Method;");
    mv.visitInsn(ACONST_NULL);
    mv.visitInsn(ICONST_2);
    mv.visitTypeInsn(ANEWARRAY, "java/lang/Object");
    mv.visitInsn(DUP);
    mv.visitInsn(ICONST_0);
    mv.visitVarInsn(ALOAD, 0); // target field
    mv.visitInsn(AASTORE);
    mv.visitInsn(DUP);
    mv.visitInsn(ICONST_1);
    mv.visitVarInsn(ALOAD, 1); // instance on which to get the field
    mv.visitInsn(AASTORE);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Method", "invoke",
            "(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;");
    mv.visitLabel(l1);
    mv.visitTypeInsn(CHECKCAST, "java/lang/Long");
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Long", "longValue", "()J");
    mv.visitInsn(LRETURN);
    mv.visitLabel(l2);
    mv.visitVarInsn(ASTORE, 2);
    Label l5 = new Label();
    mv.visitLabel(l5);
    Label l6 = new Label();
    mv.visitLabel(l6);
    mv.visitLdcInsn(0L);
    mv.visitInsn(LRETURN);
    Label l7 = new Label();
    mv.visitLabel(l7);
    mv.visitMaxs(8, 4);
    mv.visitEnd();
}