fix: added empty predicates edge case to find function, and single-instruction constructor to InsnSequence

This commit is contained in:
zaaarf 2023-03-04 11:52:40 +01:00
parent 3185d840c4
commit c9ea715ba1
No known key found for this signature in database
GPG key ID: AD8563472FD43386
2 changed files with 23 additions and 13 deletions

View file

@ -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.

View file

@ -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!");
}