From c9ea715ba1caf0efb8b6ae0f805e0cff391e9b03 Mon Sep 17 00:00:00 2001 From: zaaarf Date: Sat, 4 Mar 2023 11:52:40 +0100 Subject: fix: added empty predicates edge case to find function, and single-instruction constructor to InsnSequence --- src/main/java/ftbsc/lll/tools/InsnSequence.java | 10 +++++++++ src/main/java/ftbsc/lll/tools/PatternMatcher.java | 26 +++++++++++------------ 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/main/java/ftbsc/lll/tools/InsnSequence.java b/src/main/java/ftbsc/lll/tools/InsnSequence.java index 1a915ca..2038155 100644 --- a/src/main/java/ftbsc/lll/tools/InsnSequence.java +++ b/src/main/java/ftbsc/lll/tools/InsnSequence.java @@ -19,6 +19,16 @@ public class InsnSequence extends InsnList { super(); } + /** + * Public constructor for list with single item. + * Must be given a single non-null node. + * @param node the node in question + */ + public InsnSequence(AbstractInsnNode node) { + super(); + super.add(node); + } + /** * Public constructor. * Must be given two non-null, connected nodes. diff --git a/src/main/java/ftbsc/lll/tools/PatternMatcher.java b/src/main/java/ftbsc/lll/tools/PatternMatcher.java index 161a3fa..a941b72 100644 --- a/src/main/java/ftbsc/lll/tools/PatternMatcher.java +++ b/src/main/java/ftbsc/lll/tools/PatternMatcher.java @@ -85,25 +85,25 @@ public class PatternMatcher { if(ignoreLabels && cur.getType() == AbstractInsnNode.LABEL) continue; if(ignoreFrames && cur.getType() == AbstractInsnNode.FRAME) continue; if(ignoreLineNumbers && cur.getType() == AbstractInsnNode.LINE) continue; - if(predicates.get(match).test(cur)) { - match++; - if(first == null) - first = cur; - } else { //reset - first = null; - match = 0; + if(predicates.get(match) != null) { + if(predicates.get(match).test(cur)) { + match++; + if (first == null) + first = cur; + } else { //reset + first = null; + match = 0; + } } //check if we found the last one if(match == predicates.size()) { + if(match == 0) + return new InsnSequence(cur); //match whatever last = cur; - break; + if(reverse) return new InsnSequence(last, first); //we are matching backwards + else return new InsnSequence(first, last); } } - //only return value if we found both a start and an end - if(first != null && last != null) { - if(reverse) return new InsnSequence(last, first); //we are matching backwards - else return new InsnSequence(first, last); - } } throw new PatternNotFoundException("Failed to find pattern!"); } -- cgit v1.2.3-56-ga3b1