From 4c74e8e300025339dd3d199bf473aeddf6442a36 Mon Sep 17 00:00:00 2001 From: Ahmet Bilal Can Date: Sun, 3 Nov 2024 00:38:57 +0300 Subject: [PATCH] feat: give ability to plugins to edit blocks before locking (PR #2336) Plugins can use `.before('BlockFinisher')` to edit blocks before they are locked. --- jadx-core/src/main/java/jadx/core/Jadx.java | 2 ++ .../core/dex/visitors/blocks/BlockFinisher.java | 17 +++++++++++++++++ .../dex/visitors/blocks/BlockProcessor.java | 3 --- 3 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 jadx-core/src/main/java/jadx/core/dex/visitors/blocks/BlockFinisher.java diff --git a/jadx-core/src/main/java/jadx/core/Jadx.java b/jadx-core/src/main/java/jadx/core/Jadx.java index 03f555f56ae..377d8c7f3e8 100644 --- a/jadx-core/src/main/java/jadx/core/Jadx.java +++ b/jadx-core/src/main/java/jadx/core/Jadx.java @@ -47,6 +47,7 @@ import jadx.core.dex.visitors.ShadowFieldVisitor; import jadx.core.dex.visitors.SignatureProcessor; import jadx.core.dex.visitors.SimplifyVisitor; +import jadx.core.dex.visitors.blocks.BlockFinisher; import jadx.core.dex.visitors.blocks.BlockProcessor; import jadx.core.dex.visitors.blocks.BlockSplitter; import jadx.core.dex.visitors.debuginfo.DebugInfoApplyVisitor; @@ -131,6 +132,7 @@ public static List getRegionsModePasses(JadxArgs args) { // blocks IR passes.add(new BlockSplitter()); passes.add(new BlockProcessor()); + passes.add(new BlockFinisher()); if (args.isRawCFGOutput()) { passes.add(DotGraphVisitor.dumpRaw()); } diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/blocks/BlockFinisher.java b/jadx-core/src/main/java/jadx/core/dex/visitors/blocks/BlockFinisher.java new file mode 100644 index 00000000000..1983f87206e --- /dev/null +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/blocks/BlockFinisher.java @@ -0,0 +1,17 @@ +package jadx.core.dex.visitors.blocks; + +import jadx.core.dex.attributes.AFlag; +import jadx.core.dex.nodes.MethodNode; +import jadx.core.dex.visitors.AbstractVisitor; + +public class BlockFinisher extends AbstractVisitor { + @Override + public void visit(MethodNode mth) { + if (mth.isNoCode() || mth.getBasicBlocks().isEmpty()) { + return; + } + if (!mth.contains(AFlag.DISABLE_BLOCKS_LOCK)) { + mth.finishBasicBlocks(); + } + } +} diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/blocks/BlockProcessor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/blocks/BlockProcessor.java index 41406dccb2e..12760dca897 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/blocks/BlockProcessor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/blocks/BlockProcessor.java @@ -92,9 +92,6 @@ private static void processBlocksTree(MethodNode mth) { PostDominatorTree.compute(mth); updateCleanSuccessors(mth); - if (!mth.contains(AFlag.DISABLE_BLOCKS_LOCK)) { - mth.finishBasicBlocks(); - } } static void updateCleanSuccessors(MethodNode mth) {