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 | +} |