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 | 24 | /** |
25 | 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 | 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 | 31 | * all owners are valid |
32 | 32 | */ |
33 | - private final String[] methodOwners; | |
33 | + protected final String[] methodOwners; | |
34 | 34 | |
35 | 35 | /** |
36 | 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 | 37 | * then all signatures are valid |
38 | 38 | */ |
39 | - private final String[] methodSignatures; | |
39 | + protected final String[] methodSignatures; | |
40 | 40 | |
41 | 41 | /** |
42 | 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 | 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 | 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 | 53 | * Match all occurrences of the specified method or methods |
... | ... | @@ -220,27 +220,36 @@ public class BeforeInvoke extends InjectionPoint |
220 | 220 | if (index > -1 && ownerIndex == index && descIndex == index) |
221 | 221 | { |
222 | 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 | 225 | if (this.logging) LiteLoaderLogger.info("BeforeInvoke found a matching invoke at ordinal %d", ordinal); |
226 | 226 | nodes.add(node); |
227 | 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 | 233 | ordinal++; |
237 | 234 | } |
238 | 235 | } |
236 | + | |
237 | + this.inspectInsn(desc, insns, insn); | |
239 | 238 | } |
240 | 239 | |
241 | 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 | 254 | * Special version of contains which returns TRUE if the haystack array is null, which is an odd behaviour we actually |
246 | 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 | +} | ... | ... |