List of usage examples for org.objectweb.asm MethodVisitor visitTryCatchBlock
public void visitTryCatchBlock(final Label start, final Label end, final Label handler, final String type)
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(); }