Commit 61965517773a8e297947fddac908c0308258c83a

Authored by Mumfrey
1 parent b4c52de0

support handlers with return types in HandlerList, return null or zero

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;