Commit 67d33bd9302bd6dad07d02b32918363491a6a650

Authored by Mumfrey
1 parent ba1cc312

HandlerList add OR_BREAK_ON_TRUE logic op - closes #62

java/common/com/mumfrey/liteloader/core/event/HandlerList.java
@@ -47,31 +47,59 @@ public class HandlerList<T> extends LinkedList<T> implements FastIterableDeque<T @@ -47,31 +47,59 @@ public class HandlerList<T> extends LinkedList<T> implements FastIterableDeque<T
47 /** 47 /**
48 * Logical OR applied between handlers, return FALSE unless one or more handlers returns TRUE 48 * Logical OR applied between handlers, return FALSE unless one or more handlers returns TRUE
49 */ 49 */
50 - OR, 50 + OR(true, false),
  51 +
  52 + /**
  53 + * Logical OR, returns TRUE at the first handler to return TRUE and doesn't process any further handlers
  54 + */
  55 + OR_BREAK_ON_TRUE(true, true),
51 56
52 /** 57 /**
53 * Logical OR, but with the difference than an EMPTY handler list will return TRUE 58 * Logical OR, but with the difference than an EMPTY handler list will return TRUE
54 */ 59 */
55 - OR_ASSUME_TRUE, 60 + OR_ASSUME_TRUE(true, false, true),
56 61
57 /** 62 /**
58 * Logical AND, returns TRUE if the list is empty or if all handlers return TRUE 63 * Logical AND, returns TRUE if the list is empty or if all handlers return TRUE
59 */ 64 */
60 - AND, 65 + AND(false, false),
61 66
62 /** 67 /**
63 * Logical AND, returns FALSE at the first handler to return FALSE and doesn't process any further handlers 68 * Logical AND, returns FALSE at the first handler to return FALSE and doesn't process any further handlers
64 */ 69 */
65 - AND_BREAK_ON_FALSE; 70 + AND_BREAK_ON_FALSE(false, true);
  71 +
  72 + private final boolean isOr;
  73 +
  74 + private final boolean breakOnMatch;
  75 +
  76 + private final boolean assumeTrue;
  77 +
  78 + private ReturnLogicOp(boolean isOr, boolean breakOnMatch)
  79 + {
  80 + this(isOr, breakOnMatch, false);
  81 + }
  82 +
  83 + private ReturnLogicOp(boolean isOr, boolean breakOnMatch, boolean assumeTrue)
  84 + {
  85 + this.isOr = isOr;
  86 + this.breakOnMatch = breakOnMatch;
  87 + this.assumeTrue = assumeTrue;
  88 + }
66 89
67 boolean isOr() 90 boolean isOr()
68 { 91 {
69 - return this == OR || this == OR_ASSUME_TRUE; 92 + return this.isOr;
  93 + }
  94 +
  95 + public boolean breakOnMatch()
  96 + {
  97 + return this.breakOnMatch;
70 } 98 }
71 99
72 boolean assumeTrue() 100 boolean assumeTrue()
73 { 101 {
74 - return this == OR_ASSUME_TRUE; 102 + return this.assumeTrue;
75 } 103 }
76 } 104 }
77 105
@@ -813,7 +841,7 @@ public class HandlerList<T> extends LinkedList<T> implements FastIterableDeque<T @@ -813,7 +841,7 @@ public class HandlerList<T> extends LinkedList<T> implements FastIterableDeque<T
813 private void populateBooleanInvokationChain(ClassNode classNode, MethodNode method, Type[] args) 841 private void populateBooleanInvokationChain(ClassNode classNode, MethodNode method, Type[] args)
814 { 842 {
815 boolean isOrOperation = this.logicOp.isOr(); 843 boolean isOrOperation = this.logicOp.isOr();
816 - boolean breakOnFalse = this.logicOp == ReturnLogicOp.AND_BREAK_ON_FALSE; 844 + boolean breakOnMatch = this.logicOp.breakOnMatch();
817 int initialValue = isOrOperation && (!this.logicOp.assumeTrue() || this.size > 0) ? Opcodes.ICONST_0 : Opcodes.ICONST_1; 845 int initialValue = isOrOperation && (!this.logicOp.assumeTrue() || this.size > 0) ? Opcodes.ICONST_0 : Opcodes.ICONST_1;
818 int localIndex = this.getFirstLocalIndex(args); 846 int localIndex = this.getFirstLocalIndex(args);
819 847
@@ -830,7 +858,7 @@ public class HandlerList<T> extends LinkedList<T> implements FastIterableDeque<T @@ -830,7 +858,7 @@ public class HandlerList<T> extends LinkedList<T> implements FastIterableDeque<T
830 LabelNode lbl = new LabelNode(); 858 LabelNode lbl = new LabelNode();
831 method.instructions.add(new JumpInsnNode(jumpCondition, lbl)); // jump over the set/return based on the condition 859 method.instructions.add(new JumpInsnNode(jumpCondition, lbl)); // jump over the set/return based on the condition
832 method.instructions.add(new InsnNode(semaphore)); // push TRUE or FALSE onto the stack 860 method.instructions.add(new InsnNode(semaphore)); // push TRUE or FALSE onto the stack
833 - method.instructions.add(breakOnFalse ? new InsnNode(Opcodes.IRETURN) : new VarInsnNode(Opcodes.ISTORE, localIndex)); // set local or return 861 + method.instructions.add(breakOnMatch ? new InsnNode(Opcodes.IRETURN) : new VarInsnNode(Opcodes.ISTORE, localIndex)); // set local or return
834 method.instructions.add(lbl); // jump here 862 method.instructions.add(lbl); // jump here
835 } 863 }
836 864