Commit c939f39ca1cce8f4efc7f85a1ba547a5262d3a7c
1 parent
b29e8bbb
adding BeforeStringInvoke injection point class
Showing
2 changed files
with
93 additions
and
12 deletions
java/common/com/mumfrey/liteloader/transformers/event/inject/BeforeInvoke.java
| @@ -24,30 +24,30 @@ public class BeforeInvoke extends InjectionPoint | @@ -24,30 +24,30 @@ public class BeforeInvoke extends InjectionPoint | ||
| 24 | /** | 24 | /** |
| 25 | * Method name(s) to search for, usually this will contain the different names of the method for different obfuscations (mcp, srg, notch) | 25 | * Method name(s) to search for, usually this will contain the different names of the method for different obfuscations (mcp, srg, notch) |
| 26 | */ | 26 | */ |
| 27 | - private final String[] methodNames; | 27 | + protected final String[] methodNames; |
| 28 | 28 | ||
| 29 | /** | 29 | /** |
| 30 | * Method owner(s) to search for, the values in this array MUST much the equivalent indices in methodNames, if the array is NULL then | 30 | * Method owner(s) to search for, the values in this array MUST much the equivalent indices in methodNames, if the array is NULL then |
| 31 | * all owners are valid | 31 | * all owners are valid |
| 32 | */ | 32 | */ |
| 33 | - private final String[] methodOwners; | 33 | + protected final String[] methodOwners; |
| 34 | 34 | ||
| 35 | /** | 35 | /** |
| 36 | * Method signature(s) to search for, the values in this array MUST much the equivalent indices in methodNames, if the array is NULL | 36 | * Method signature(s) to search for, the values in this array MUST much the equivalent indices in methodNames, if the array is NULL |
| 37 | * then all signatures are valid | 37 | * then all signatures are valid |
| 38 | */ | 38 | */ |
| 39 | - private final String[] methodSignatures; | 39 | + protected final String[] methodSignatures; |
| 40 | 40 | ||
| 41 | /** | 41 | /** |
| 42 | * This strategy can be used to identify a particular invokation if the same method is invoked at multiple points, if this value is -1 | 42 | * This strategy can be used to identify a particular invokation if the same method is invoked at multiple points, if this value is -1 |
| 43 | * then the strategy returns ALL invokations of the method. | 43 | * then the strategy returns ALL invokations of the method. |
| 44 | */ | 44 | */ |
| 45 | - private final int ordinal; | 45 | + protected final int ordinal; |
| 46 | 46 | ||
| 47 | /** | 47 | /** |
| 48 | * True to turn on strategy debugging to the console | 48 | * True to turn on strategy debugging to the console |
| 49 | */ | 49 | */ |
| 50 | - private boolean logging = false; | 50 | + protected boolean logging = false; |
| 51 | 51 | ||
| 52 | /** | 52 | /** |
| 53 | * Match all occurrences of the specified method or methods | 53 | * Match all occurrences of the specified method or methods |
| @@ -220,27 +220,36 @@ public class BeforeInvoke extends InjectionPoint | @@ -220,27 +220,36 @@ public class BeforeInvoke extends InjectionPoint | ||
| 220 | if (index > -1 && ownerIndex == index && descIndex == index) | 220 | if (index > -1 && ownerIndex == index && descIndex == index) |
| 221 | { | 221 | { |
| 222 | if (this.logging) LiteLoaderLogger.info("BeforeInvoke found a matching invoke, checking ordinal..."); | 222 | if (this.logging) LiteLoaderLogger.info("BeforeInvoke found a matching invoke, checking ordinal..."); |
| 223 | - if (this.ordinal == -1) | 223 | + if (this.matchesInsn(node, ordinal)) |
| 224 | { | 224 | { |
| 225 | if (this.logging) LiteLoaderLogger.info("BeforeInvoke found a matching invoke at ordinal %d", ordinal); | 225 | if (this.logging) LiteLoaderLogger.info("BeforeInvoke found a matching invoke at ordinal %d", ordinal); |
| 226 | nodes.add(node); | 226 | nodes.add(node); |
| 227 | found = true; | 227 | found = true; |
| 228 | - } | ||
| 229 | - else if (this.ordinal == ordinal) | ||
| 230 | - { | ||
| 231 | - if (this.logging) LiteLoaderLogger.info("BeforeInvoke found a matching invoke at ordinal %d", ordinal); | ||
| 232 | - nodes.add(node); | ||
| 233 | - return true; | 228 | + |
| 229 | + if (this.ordinal == ordinal) | ||
| 230 | + break; | ||
| 234 | } | 231 | } |
| 235 | 232 | ||
| 236 | ordinal++; | 233 | ordinal++; |
| 237 | } | 234 | } |
| 238 | } | 235 | } |
| 236 | + | ||
| 237 | + this.inspectInsn(desc, insns, insn); | ||
| 239 | } | 238 | } |
| 240 | 239 | ||
| 241 | return found; | 240 | return found; |
| 242 | } | 241 | } |
| 243 | 242 | ||
| 243 | + protected void inspectInsn(String desc, InsnList insns, AbstractInsnNode insn) | ||
| 244 | + { | ||
| 245 | + // stub for subclasses | ||
| 246 | + } | ||
| 247 | + | ||
| 248 | + protected boolean matchesInsn(MethodInsnNode node, int ordinal) | ||
| 249 | + { | ||
| 250 | + return this.ordinal == -1 || this.ordinal == ordinal; | ||
| 251 | + } | ||
| 252 | + | ||
| 244 | /** | 253 | /** |
| 245 | * Special version of contains which returns TRUE if the haystack array is null, which is an odd behaviour we actually | 254 | * Special version of contains which returns TRUE if the haystack array is null, which is an odd behaviour we actually |
| 246 | * want here because null indicates that the value is not important | 255 | * want here because null indicates that the value is not important |
java/common/com/mumfrey/liteloader/transformers/event/inject/BeforeStringInvoke.java
0 → 100644
| 1 | +package com.mumfrey.liteloader.transformers.event.inject; | ||
| 2 | + | ||
| 3 | +import java.util.Collection; | ||
| 4 | + | ||
| 5 | +import org.objectweb.asm.tree.AbstractInsnNode; | ||
| 6 | +import org.objectweb.asm.tree.InsnList; | ||
| 7 | +import org.objectweb.asm.tree.LdcInsnNode; | ||
| 8 | +import org.objectweb.asm.tree.MethodInsnNode; | ||
| 9 | + | ||
| 10 | +import com.mumfrey.liteloader.transformers.event.Event; | ||
| 11 | +import com.mumfrey.liteloader.transformers.event.MethodInfo; | ||
| 12 | +import com.mumfrey.liteloader.util.log.LiteLoaderLogger; | ||
| 13 | + | ||
| 14 | +/** | ||
| 15 | + * An injection point which searches for a matching String LDC insn immediately prior to a qualifying invoke | ||
| 16 | + * | ||
| 17 | + * @author Adam Mummery-Smith | ||
| 18 | + */ | ||
| 19 | +public class BeforeStringInvoke extends BeforeInvoke | ||
| 20 | +{ | ||
| 21 | + private static final String STRING_VOID_SIG = "(Ljava/lang/String;)V"; | ||
| 22 | + | ||
| 23 | + private final String ldcValue; | ||
| 24 | + | ||
| 25 | + private boolean foundLdc; | ||
| 26 | + | ||
| 27 | + public BeforeStringInvoke(String ldcValue, MethodInfo method) | ||
| 28 | + { | ||
| 29 | + this(ldcValue, method, -1); | ||
| 30 | + } | ||
| 31 | + | ||
| 32 | + public BeforeStringInvoke(String ldcValue, MethodInfo method, int ordinal) | ||
| 33 | + { | ||
| 34 | + super(method, ordinal); | ||
| 35 | + this.ldcValue = ldcValue; | ||
| 36 | + | ||
| 37 | + for (int i = 0; i < this.methodSignatures.length; i++) | ||
| 38 | + if (!STRING_VOID_SIG.equals(this.methodSignatures[i])) | ||
| 39 | + throw new IllegalArgumentException("BeforeStringInvoke requires method with with signature " + STRING_VOID_SIG); | ||
| 40 | + } | ||
| 41 | + | ||
| 42 | + @Override | ||
| 43 | + public boolean find(String desc, InsnList insns, Collection<AbstractInsnNode> nodes, Event event) | ||
| 44 | + { | ||
| 45 | + this.foundLdc = false; | ||
| 46 | + | ||
| 47 | + return super.find(desc, insns, nodes, event); | ||
| 48 | + } | ||
| 49 | + | ||
| 50 | + @Override | ||
| 51 | + protected void inspectInsn(String desc, InsnList insns, AbstractInsnNode insn) | ||
| 52 | + { | ||
| 53 | + if (insn instanceof LdcInsnNode) | ||
| 54 | + { | ||
| 55 | + LdcInsnNode node = (LdcInsnNode)insn; | ||
| 56 | + if (node.cst instanceof String && this.ldcValue.equals(node.cst)) | ||
| 57 | + { | ||
| 58 | + if (this.logging) LiteLoaderLogger.info("BeforeInvoke found a matching LDC with value %s", node.cst); | ||
| 59 | + this.foundLdc = true; | ||
| 60 | + return; | ||
| 61 | + } | ||
| 62 | + } | ||
| 63 | + | ||
| 64 | + this.foundLdc = false; | ||
| 65 | + } | ||
| 66 | + | ||
| 67 | + @Override | ||
| 68 | + protected boolean matchesInsn(MethodInsnNode node, int ordinal) | ||
| 69 | + { | ||
| 70 | + return this.foundLdc && super.matchesInsn(node, ordinal); | ||
| 71 | + } | ||
| 72 | +} |