From 92777a817cf48ee18a1af31e244702c78279591a Mon Sep 17 00:00:00 2001 From: EpicPlayerA10 Date: Wed, 25 Sep 2024 22:55:01 +0200 Subject: [PATCH] rename InstructionContext to just InsnContext --- ...structionContext.java => InsnContext.java} | 8 +-- .../deobfuscator/api/asm/MethodContext.java | 4 +- .../deobfuscator/api/asm/matcher/Match.java | 14 ++-- .../api/asm/matcher/MatchContext.java | 16 ++--- .../api/asm/matcher/group/SequenceMatch.java | 4 +- .../api/helper/FramedInstructionsStream.java | 8 +-- .../PopUnUsedLocalVariablesTransformer.java | 6 +- .../peephole/UselessPopCleanTransformer.java | 4 +- .../universal/TryCatchRepairTransformer.java | 69 ++++++++----------- .../ZelixLongEncryptionMPCTransformer.java | 4 +- .../impl/zkm/ZelixParametersTransformer.java | 6 +- ...elixUselessTryCatchRemoverTransformer.java | 4 +- 12 files changed, 67 insertions(+), 80 deletions(-) rename deobfuscator-api/src/main/java/uwu/narumi/deobfuscator/api/asm/{InstructionContext.java => InsnContext.java} (87%) diff --git a/deobfuscator-api/src/main/java/uwu/narumi/deobfuscator/api/asm/InstructionContext.java b/deobfuscator-api/src/main/java/uwu/narumi/deobfuscator/api/asm/InsnContext.java similarity index 87% rename from deobfuscator-api/src/main/java/uwu/narumi/deobfuscator/api/asm/InstructionContext.java rename to deobfuscator-api/src/main/java/uwu/narumi/deobfuscator/api/asm/InsnContext.java index 3b2d3048..5a0c36f4 100644 --- a/deobfuscator-api/src/main/java/uwu/narumi/deobfuscator/api/asm/InstructionContext.java +++ b/deobfuscator-api/src/main/java/uwu/narumi/deobfuscator/api/asm/InsnContext.java @@ -10,17 +10,17 @@ /** * Instruction context. Holds all information relevant to the current instruction. */ -public class InstructionContext { +public class InsnContext { private final AbstractInsnNode insn; private final MethodContext methodContext; - InstructionContext(AbstractInsnNode insn, MethodContext methodContext) { + InsnContext(AbstractInsnNode insn, MethodContext methodContext) { this.insn = insn; this.methodContext = methodContext; } - public InstructionContext of(AbstractInsnNode insn) { - return new InstructionContext(insn, this.methodContext); + public InsnContext of(AbstractInsnNode insn) { + return new InsnContext(insn, this.methodContext); } public Frame frame() { diff --git a/deobfuscator-api/src/main/java/uwu/narumi/deobfuscator/api/asm/MethodContext.java b/deobfuscator-api/src/main/java/uwu/narumi/deobfuscator/api/asm/MethodContext.java index 3183f5d3..a412cb19 100644 --- a/deobfuscator-api/src/main/java/uwu/narumi/deobfuscator/api/asm/MethodContext.java +++ b/deobfuscator-api/src/main/java/uwu/narumi/deobfuscator/api/asm/MethodContext.java @@ -49,8 +49,8 @@ public MethodNode methodNode() { return frames; } - public InstructionContext newInsnContext(AbstractInsnNode insn) { - return new InstructionContext(insn, this); + public InsnContext newInsnContext(AbstractInsnNode insn) { + return new InsnContext(insn, this); } /** diff --git a/deobfuscator-api/src/main/java/uwu/narumi/deobfuscator/api/asm/matcher/Match.java b/deobfuscator-api/src/main/java/uwu/narumi/deobfuscator/api/asm/matcher/Match.java index 51529b8c..ad32fc19 100644 --- a/deobfuscator-api/src/main/java/uwu/narumi/deobfuscator/api/asm/matcher/Match.java +++ b/deobfuscator-api/src/main/java/uwu/narumi/deobfuscator/api/asm/matcher/Match.java @@ -1,7 +1,7 @@ package uwu.narumi.deobfuscator.api.asm.matcher; import org.objectweb.asm.tree.AbstractInsnNode; -import uwu.narumi.deobfuscator.api.asm.InstructionContext; +import uwu.narumi.deobfuscator.api.asm.InsnContext; import uwu.narumi.deobfuscator.api.asm.MethodContext; import java.util.ArrayList; @@ -25,7 +25,7 @@ public abstract class Match { * @param insnContext Instruction context * @return If matches */ - public boolean matches(InstructionContext insnContext) { + public boolean matches(InsnContext insnContext) { return this.matchResult(insnContext) != null; } @@ -36,7 +36,7 @@ public boolean matches(InstructionContext insnContext) { * @param currentMatchContext Match context to merge into * @return If matches */ - public boolean matchAndMerge(InstructionContext insnContext, MatchContext currentMatchContext) { + public boolean matchAndMerge(InsnContext insnContext, MatchContext currentMatchContext) { MatchContext result = this.matchResult(insnContext); if (result != null) { currentMatchContext.merge(result); @@ -54,7 +54,7 @@ public List findAllMatches(MethodContext methodContext) { List allMatches = new ArrayList<>(); for (AbstractInsnNode insn : methodContext.methodNode().instructions) { - InstructionContext insnContext = methodContext.newInsnContext(insn); + InsnContext insnContext = methodContext.newInsnContext(insn); MatchContext match = this.matchResult(insnContext); if (match != null) { allMatches.add(match); @@ -67,7 +67,7 @@ public List findAllMatches(MethodContext methodContext) { /** * @return {@link MatchContext} if matches or {@code null} if it does not match */ - public MatchContext matchResult(InstructionContext insnContext) { + public MatchContext matchResult(InsnContext insnContext) { // Create MatchContext MatchContext context = MatchContext.of(insnContext); @@ -91,7 +91,7 @@ public MatchContext matchResult(InstructionContext insnContext) { } /** - * @see #matches(InstructionContext) + * @see #matches(InsnContext) */ protected abstract boolean test(MatchContext context); @@ -149,6 +149,6 @@ public interface Transformation { * @param context Current instruction context * @return If changed */ - boolean transform(InstructionContext context); + boolean transform(InsnContext context); } } diff --git a/deobfuscator-api/src/main/java/uwu/narumi/deobfuscator/api/asm/matcher/MatchContext.java b/deobfuscator-api/src/main/java/uwu/narumi/deobfuscator/api/asm/matcher/MatchContext.java index fb6f0ce3..56e9117c 100644 --- a/deobfuscator-api/src/main/java/uwu/narumi/deobfuscator/api/asm/matcher/MatchContext.java +++ b/deobfuscator-api/src/main/java/uwu/narumi/deobfuscator/api/asm/matcher/MatchContext.java @@ -3,7 +3,7 @@ import org.objectweb.asm.tree.AbstractInsnNode; import org.objectweb.asm.tree.analysis.Frame; import org.objectweb.asm.tree.analysis.OriginalSourceValue; -import uwu.narumi.deobfuscator.api.asm.InstructionContext; +import uwu.narumi.deobfuscator.api.asm.InsnContext; import java.util.ArrayList; import java.util.Collections; @@ -15,17 +15,17 @@ * Immutable match context. After matching process, the context is frozen by {@link MatchContext#freeze()} */ public class MatchContext { - private final InstructionContext insnContext; + private final InsnContext insnContext; private final Map captures; private final List collectedInsns; - private MatchContext(InstructionContext insnContext, Map captures, List collectedInsns) { + private MatchContext(InsnContext insnContext, Map captures, List collectedInsns) { this.insnContext = insnContext; this.captures = captures; this.collectedInsns = collectedInsns; } - public static MatchContext of(InstructionContext insnContext) { + public static MatchContext of(InsnContext insnContext) { return new MatchContext(insnContext, new HashMap<>(), new ArrayList<>()); } @@ -36,7 +36,7 @@ public MatchContext freeze() { /** * Merges other {@link MatchContext} into this {@link MatchContext}. * - * @see Match#matchAndMerge(InstructionContext, MatchContext) + * @see Match#matchAndMerge(InsnContext, MatchContext) */ void merge(MatchContext other) { this.captures.putAll(other.captures); @@ -49,14 +49,14 @@ void merge(MatchContext other) { } /** - * @see InstructionContext#insn() + * @see InsnContext#insn() */ public AbstractInsnNode insn() { return this.insnContext.insn(); } /** - * @see InstructionContext#frame() + * @see InsnContext#frame() */ public Frame frame() { return this.insnContext.frame(); @@ -65,7 +65,7 @@ public Frame frame() { /** * Instruction context */ - public InstructionContext insnContext() { + public InsnContext insnContext() { return insnContext; } diff --git a/deobfuscator-api/src/main/java/uwu/narumi/deobfuscator/api/asm/matcher/group/SequenceMatch.java b/deobfuscator-api/src/main/java/uwu/narumi/deobfuscator/api/asm/matcher/group/SequenceMatch.java index 9e02b994..d7441175 100644 --- a/deobfuscator-api/src/main/java/uwu/narumi/deobfuscator/api/asm/matcher/group/SequenceMatch.java +++ b/deobfuscator-api/src/main/java/uwu/narumi/deobfuscator/api/asm/matcher/group/SequenceMatch.java @@ -4,7 +4,7 @@ import org.objectweb.asm.tree.FrameNode; import org.objectweb.asm.tree.LabelNode; import org.objectweb.asm.tree.LineNumberNode; -import uwu.narumi.deobfuscator.api.asm.InstructionContext; +import uwu.narumi.deobfuscator.api.asm.InsnContext; import uwu.narumi.deobfuscator.api.asm.matcher.Match; import uwu.narumi.deobfuscator.api.asm.matcher.MatchContext; @@ -73,7 +73,7 @@ protected boolean test(MatchContext context) { return false; } - InstructionContext currentInsnContext = context.insnContext().of(currentInsn); + InsnContext currentInsnContext = context.insnContext().of(currentInsn); if (this.skipMatches.stream().anyMatch(match -> match.matches(currentInsnContext))) { // Skip instruction currentInsn = currentInsn.getNext(); diff --git a/deobfuscator-api/src/main/java/uwu/narumi/deobfuscator/api/helper/FramedInstructionsStream.java b/deobfuscator-api/src/main/java/uwu/narumi/deobfuscator/api/helper/FramedInstructionsStream.java index 46c1b817..03913939 100644 --- a/deobfuscator-api/src/main/java/uwu/narumi/deobfuscator/api/helper/FramedInstructionsStream.java +++ b/deobfuscator-api/src/main/java/uwu/narumi/deobfuscator/api/helper/FramedInstructionsStream.java @@ -4,7 +4,7 @@ import org.objectweb.asm.tree.AbstractInsnNode; import org.objectweb.asm.tree.MethodNode; import uwu.narumi.deobfuscator.api.asm.ClassWrapper; -import uwu.narumi.deobfuscator.api.asm.InstructionContext; +import uwu.narumi.deobfuscator.api.asm.InsnContext; import uwu.narumi.deobfuscator.api.asm.MethodContext; import uwu.narumi.deobfuscator.api.context.Context; @@ -14,7 +14,7 @@ import java.util.stream.Stream; /** - * Framed instructions stream that gives {@link InstructionContext} and computing all frames for you. Also, this class + * Framed instructions stream that gives {@link InsnContext} and computing all frames for you. Also, this class * iterate over classes and methods ASYNC, and instructions SYNC. This can really speed up computing frames for methods. */ public class FramedInstructionsStream { @@ -52,7 +52,7 @@ public FramedInstructionsStream editInstructionsStream(Function consumer) { + public void forEach(Consumer consumer) { // Iterate over classes in parallel this.classesStreamModifier.apply(this.context.classes(this.scope).parallelStream()) // Iterate over methods in parallel @@ -67,7 +67,7 @@ public void forEach(Consumer consumer) { // Iterate over instructions SYNC instructionsStreamModifier.apply(Arrays.stream(methodNode.instructions.toArray())) .forEach(insn -> { - InstructionContext insnContext = methodContext.newInsnContext(insn); + InsnContext insnContext = methodContext.newInsnContext(insn); // Check if frame exists if (insnContext.frame() == null) return; diff --git a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/clean/peephole/PopUnUsedLocalVariablesTransformer.java b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/clean/peephole/PopUnUsedLocalVariablesTransformer.java index af21d209..f1875e6b 100644 --- a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/clean/peephole/PopUnUsedLocalVariablesTransformer.java +++ b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/clean/peephole/PopUnUsedLocalVariablesTransformer.java @@ -6,7 +6,7 @@ import org.objectweb.asm.tree.analysis.Frame; import org.objectweb.asm.tree.analysis.OriginalSourceValue; import uwu.narumi.deobfuscator.api.asm.ClassWrapper; -import uwu.narumi.deobfuscator.api.asm.InstructionContext; +import uwu.narumi.deobfuscator.api.asm.InsnContext; import uwu.narumi.deobfuscator.api.asm.MethodContext; import uwu.narumi.deobfuscator.api.context.Context; import uwu.narumi.deobfuscator.api.transformer.Transformer; @@ -26,7 +26,7 @@ protected void transform(ClassWrapper scope, Context context) throws Exception { // Find all local variables in use for (AbstractInsnNode insn : methodNode.instructions.toArray()) { if ((insn instanceof VarInsnNode && !insn.isVarStore()) || insn instanceof IincInsnNode) { - InstructionContext insnContext = methodContext.newInsnContext(insn); + InsnContext insnContext = methodContext.newInsnContext(insn); Frame frame = insnContext.frame(); if (frame == null) return; @@ -52,7 +52,7 @@ protected void transform(ClassWrapper scope, Context context) throws Exception { for (AbstractInsnNode insn : methodNode.instructions.toArray()) { if (insn instanceof VarInsnNode varInsnNode && insn.isVarStore()) { if (!varStoresInUse.contains(varInsnNode)) { - InstructionContext insnContext = methodContext.newInsnContext(insn); + InsnContext insnContext = methodContext.newInsnContext(insn); // Pop the value from the stack insnContext.pop(1); diff --git a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/clean/peephole/UselessPopCleanTransformer.java b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/clean/peephole/UselessPopCleanTransformer.java index 79095c72..5381e552 100644 --- a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/clean/peephole/UselessPopCleanTransformer.java +++ b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/clean/peephole/UselessPopCleanTransformer.java @@ -4,7 +4,7 @@ import org.objectweb.asm.tree.MethodNode; import org.objectweb.asm.tree.analysis.OriginalSourceValue; import uwu.narumi.deobfuscator.api.asm.ClassWrapper; -import uwu.narumi.deobfuscator.api.asm.InstructionContext; +import uwu.narumi.deobfuscator.api.asm.InsnContext; import uwu.narumi.deobfuscator.api.context.Context; import uwu.narumi.deobfuscator.api.helper.FramedInstructionsStream; import uwu.narumi.deobfuscator.api.transformer.Transformer; @@ -39,7 +39,7 @@ protected void transform(ClassWrapper scope, Context context) throws Exception { * @param insnContext Instructon context * @return If removed */ - private boolean tryRemovePop(InstructionContext insnContext) { + private boolean tryRemovePop(InsnContext insnContext) { AbstractInsnNode insn = insnContext.insn(); OriginalSourceValue firstValue = insnContext.frame().getStack(insnContext.frame().getStackSize() - 1); diff --git a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/universal/TryCatchRepairTransformer.java b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/universal/TryCatchRepairTransformer.java index 2c3975a0..1cc6be75 100644 --- a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/universal/TryCatchRepairTransformer.java +++ b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/universal/TryCatchRepairTransformer.java @@ -8,48 +8,35 @@ // TODO: Will probably shit itself public class TryCatchRepairTransformer extends Transformer { - private boolean changed = false; - @Override protected void transform(ClassWrapper scope, Context context) throws Exception { - context.classes(scope).stream() - .flatMap(classWrapper -> classWrapper.methods().stream()) - .forEach( - methodNode -> { - this.changed |= methodNode.tryCatchBlocks.removeIf( - tbce -> { - if (tbce.start.equals(tbce.end) - || tbce.start.equals(tbce.handler) - || tbce.end.equals(tbce.handler)) return true; - - LabelNode start = tbce.start; - LabelNode handler = tbce.handler; - LabelNode end = tbce.end; - - if (methodNode.instructions.indexOf(start) == -1 - || methodNode.instructions.indexOf(handler) == -1 - || methodNode.instructions.indexOf(end) == -1) return true; - else if (end.getNext() != null - && end.getNext().getNext() != null - && end.getNext().getOpcode() == ACONST_NULL - && end.getNext().getNext().getOpcode() == ATHROW) return true; - else - return methodNode.instructions.indexOf(start) - >= methodNode.instructions.indexOf(handler) - || methodNode.instructions.indexOf(start) - >= methodNode.instructions.indexOf(end) - || methodNode.instructions.indexOf(handler) - <= methodNode.instructions.indexOf(end); - }); - - this.changed |= methodNode.exceptions.removeIf( - exception -> - methodNode.tryCatchBlocks.stream() - .noneMatch(tbce -> tbce.type != null && tbce.type.equals(exception))); - }); - - if (changed) { - this.markChange(); - } + context.classes(scope).forEach(classWrapper -> classWrapper.methods().forEach(methodNode -> { + methodNode.tryCatchBlocks.removeIf(tryCatchBlock -> { + LabelNode start = tryCatchBlock.start; + LabelNode handler = tryCatchBlock.handler; + LabelNode end = tryCatchBlock.end; + + if (start.equals(end) || start.equals(handler) || end.equals(handler)) { + // Try-catch has overlapping labels. Remove it. + markChange(); + return true; + } + + // Check if try-catch labels exist + if (methodNode.instructions.indexOf(start) == -1 || methodNode.instructions.indexOf(handler) == -1 || methodNode.instructions.indexOf(end) == -1) { + return true; + } + + // Check if try-catch labels are in the correct order + return methodNode.instructions.indexOf(start) >= methodNode.instructions.indexOf(handler) + || methodNode.instructions.indexOf(start) >= methodNode.instructions.indexOf(end) + || methodNode.instructions.indexOf(handler) <= methodNode.instructions.indexOf(end); + }); + + // Remove exceptions that are already caught by try-catch blocks + methodNode.exceptions.removeIf(exception -> + methodNode.tryCatchBlocks.stream().noneMatch(tryCatch -> tryCatch.type != null && tryCatch.type.equals(exception)) + ); + })); } } diff --git a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/zkm/ZelixLongEncryptionMPCTransformer.java b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/zkm/ZelixLongEncryptionMPCTransformer.java index d4995089..fabded68 100644 --- a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/zkm/ZelixLongEncryptionMPCTransformer.java +++ b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/zkm/ZelixLongEncryptionMPCTransformer.java @@ -8,7 +8,7 @@ import org.objectweb.asm.tree.MethodInsnNode; import org.objectweb.asm.tree.MethodNode; import uwu.narumi.deobfuscator.api.asm.ClassWrapper; -import uwu.narumi.deobfuscator.api.asm.InstructionContext; +import uwu.narumi.deobfuscator.api.asm.InsnContext; import uwu.narumi.deobfuscator.api.asm.MethodContext; import uwu.narumi.deobfuscator.api.asm.matcher.Match; import uwu.narumi.deobfuscator.api.asm.matcher.MatchContext; @@ -148,7 +148,7 @@ private void decryptEncryptedLongs(Context context, ClassWrapper classWrapper) { MethodContext methodContext = MethodContext.framed(classWrapper, clinit); for (AbstractInsnNode insn : clinit.instructions) { - InstructionContext insnContext = methodContext.newInsnContext(insn); + InsnContext insnContext = methodContext.newInsnContext(insn); if (insnContext.frame() == null) return; MatchContext result = DECRYPT_LONG_MATCHER.matchResult(insnContext); diff --git a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/zkm/ZelixParametersTransformer.java b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/zkm/ZelixParametersTransformer.java index 2de625a2..5dd1e015 100644 --- a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/zkm/ZelixParametersTransformer.java +++ b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/zkm/ZelixParametersTransformer.java @@ -8,7 +8,7 @@ import org.objectweb.asm.tree.TypeInsnNode; import org.objectweb.asm.tree.VarInsnNode; import uwu.narumi.deobfuscator.api.asm.ClassWrapper; -import uwu.narumi.deobfuscator.api.asm.InstructionContext; +import uwu.narumi.deobfuscator.api.asm.InsnContext; import uwu.narumi.deobfuscator.api.asm.MethodContext; import uwu.narumi.deobfuscator.api.asm.matcher.Match; import uwu.narumi.deobfuscator.api.asm.matcher.MatchContext; @@ -123,7 +123,7 @@ private List decomposeObjectArrayToTypes(MethodContext methodContext, Map< // Find all casts from that Object array for (AbstractInsnNode insn : methodContext.methodNode().instructions.toArray()) { - InstructionContext insnContext = methodContext.newInsnContext(insn); + InsnContext insnContext = methodContext.newInsnContext(insn); MatchContext matchContext = OBJECT_ARRAY_VAR_USAGE.matchResult(insnContext); if (matchContext == null) continue; @@ -170,7 +170,7 @@ private List decomposeObjectArrayToTypes(MethodContext methodContext, Map< private boolean removeObjectArrayAccess(MethodContext methodContext) { // Remove all object array accesses for (AbstractInsnNode insn : methodContext.methodNode().instructions.toArray()) { - InstructionContext insnContext = methodContext.newInsnContext(insn); + InsnContext insnContext = methodContext.newInsnContext(insn); MatchContext matchContext = OBJECT_ARRAY_POP.matchResult(insnContext); if (matchContext == null) continue; diff --git a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/zkm/ZelixUselessTryCatchRemoverTransformer.java b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/zkm/ZelixUselessTryCatchRemoverTransformer.java index dd91cc1e..2e9d8e46 100644 --- a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/zkm/ZelixUselessTryCatchRemoverTransformer.java +++ b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/zkm/ZelixUselessTryCatchRemoverTransformer.java @@ -2,7 +2,7 @@ import org.objectweb.asm.tree.MethodInsnNode; import uwu.narumi.deobfuscator.api.asm.ClassWrapper; -import uwu.narumi.deobfuscator.api.asm.InstructionContext; +import uwu.narumi.deobfuscator.api.asm.InsnContext; import uwu.narumi.deobfuscator.api.asm.MethodContext; import uwu.narumi.deobfuscator.api.asm.MethodRef; import uwu.narumi.deobfuscator.api.asm.matcher.Match; @@ -73,7 +73,7 @@ protected void transform(ClassWrapper scope, Context context) throws Exception { MethodContext framelessContext = MethodContext.frameless(classWrapper, methodNode); methodNode.tryCatchBlocks.removeIf(tryBlock -> { - InstructionContext start = framelessContext.newInsnContext(tryBlock.handler.getNext()); + InsnContext start = framelessContext.newInsnContext(tryBlock.handler.getNext()); MatchContext result = INVOKE_AND_RETURN.matchResult(start); if (result != null) { MethodRef methodRef = MethodRef.of((MethodInsnNode) result.insn());