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 754 Type returnType = Type.getReturnType(method.desc);
755 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 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 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 771 * @param method
772 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 777 for (int handlerIndex = 0; handlerIndex < this.size; handlerIndex++)
777 778 {
778 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 804 method.maxLocals = args.length + 1;
784 805 method.maxStack = args.length + 1;
... ...