Improve safety of IFEQ/IFNE check in OpaquePredicateTransformer

bzip2
Graham 5 years ago
parent c4e08242aa
commit 248cad99e3
  1. 18
      deob/src/main/java/dev/openrs2/deob/transform/OpaquePredicateTransformer.kt

@ -88,13 +88,17 @@ class OpaquePredicateTransformer : Transformer() {
// find and fix opaque predicates
for (match in OPAQUE_PREDICATE_MATCHER.match(method).filter { isOpaquePredicate(method, it) }) {
val branch = match[1] as JumpInsnNode
if (branch.opcode == Opcodes.IFEQ) {
// branch is always taken
method.instructions.remove(match[0])
branch.opcode = Opcodes.GOTO
} else { // IFNE
// branch is never taken
match.forEach(method.instructions::remove)
when (branch.opcode) {
Opcodes.IFEQ -> {
// branch is always taken
method.instructions.remove(match[0])
branch.opcode = Opcodes.GOTO
}
Opcodes.IFNE -> {
// branch is never taken
match.forEach(method.instructions::remove)
}
else -> error("Invalid opcode")
}
opaquePredicates++

Loading…
Cancel
Save