Commit 61965517773a8e297947fddac908c0308258c83a
1 parent
b4c52de0
support handlers with return types in HandlerList, return null or zero
Showing
1 changed file
with
28 additions
and
7 deletions
java/common/com/mumfrey/liteloader/core/event/HandlerList.java
@@ -754,15 +754,15 @@ public class HandlerList<T> extends LinkedList<T> implements FastIterableDeque<T | @@ -754,15 +754,15 @@ public class HandlerList<T> extends LinkedList<T> implements FastIterableDeque<T | ||
754 | Type returnType = Type.getReturnType(method.desc); | 754 | Type returnType = Type.getReturnType(method.desc); |
755 | Type[] args = Type.getArgumentTypes(method.desc); | 755 | Type[] args = Type.getArgumentTypes(method.desc); |
756 | 756 | ||
757 | - if (returnType.equals(Type.VOID_TYPE)) | 757 | + if (returnType.equals(Type.BOOLEAN_TYPE)) |
758 | { | 758 | { |
759 | method.access = Opcodes.ACC_PUBLIC; | 759 | method.access = Opcodes.ACC_PUBLIC; |
760 | - this.populateVoidInvokationChain(classNode, method, args); | 760 | + this.populateBooleanInvokationChain(classNode, method, args); |
761 | } | 761 | } |
762 | - else if (returnType.equals(Type.BOOLEAN_TYPE)) | 762 | + else |
763 | { | 763 | { |
764 | method.access = Opcodes.ACC_PUBLIC; | 764 | method.access = Opcodes.ACC_PUBLIC; |
765 | - this.populateBooleanInvokationChain(classNode, method, args); | 765 | + this.populateVoidInvokationChain(classNode, method, args, returnType); |
766 | } | 766 | } |
767 | } | 767 | } |
768 | 768 | ||
@@ -771,14 +771,35 @@ public class HandlerList<T> extends LinkedList<T> implements FastIterableDeque<T | @@ -771,14 +771,35 @@ public class HandlerList<T> extends LinkedList<T> implements FastIterableDeque<T | ||
771 | * @param method | 771 | * @param method |
772 | * @param args | 772 | * @param args |
773 | */ | 773 | */ |
774 | - private void populateVoidInvokationChain(ClassNode classNode, MethodNode method, Type[] args) | 774 | + private void populateVoidInvokationChain(ClassNode classNode, MethodNode method, Type[] args, Type returnType) |
775 | { | 775 | { |
776 | + int returnSize = returnType.getSize(); | ||
776 | for (int handlerIndex = 0; handlerIndex < this.size; handlerIndex++) | 777 | for (int handlerIndex = 0; handlerIndex < this.size; handlerIndex++) |
777 | { | 778 | { |
778 | this.invokeHandler(handlerIndex, classNode, method, args); | 779 | this.invokeHandler(handlerIndex, classNode, method, args); |
779 | - } | 780 | + if (returnSize > 0) |
781 | + { | ||
782 | + method.instructions.add(new InsnNode(returnSize == 1 ? Opcodes.POP : Opcodes.POP2)); | ||
783 | + } | ||
784 | + } | ||
785 | + | ||
786 | + if (returnSize > 0) | ||
787 | + { | ||
788 | + if (returnType.getSort() == Type.OBJECT) | ||
789 | + { | ||
790 | + method.instructions.add(new InsnNode(Opcodes.ACONST_NULL)); | ||
791 | + } | ||
792 | + else if (returnSize == 1) | ||
793 | + { | ||
794 | + method.instructions.add(new InsnNode(Opcodes.ICONST_0)); | ||
795 | + } | ||
796 | + else if (returnSize == 2) | ||
797 | + { | ||
798 | + method.instructions.add(new InsnNode(Opcodes.DCONST_0)); | ||
799 | + } | ||
800 | + } | ||
780 | 801 | ||
781 | - method.instructions.add(new InsnNode(Opcodes.RETURN)); | 802 | + method.instructions.add(new InsnNode(returnType.getOpcode(Opcodes.IRETURN))); |
782 | 803 | ||
783 | method.maxLocals = args.length + 1; | 804 | method.maxLocals = args.length + 1; |
784 | method.maxStack = args.length + 1; | 805 | method.maxStack = args.length + 1; |