From c7a162d827bcd72644831c195d396dfe12af7ed4 Mon Sep 17 00:00:00 2001 From: Skylot <118523+skylot@users.noreply.github.com> Date: Thu, 2 Apr 2026 21:22:03 +0100 Subject: [PATCH] fix: resolve minor decompilation issues (#2835) --- .../dex/visitors/blocks/BlockProcessor.java | 27 +++++++++++-------- .../visitors/regions/PostProcessRegions.java | 5 +--- 2 files changed, 17 insertions(+), 15 deletions(-) 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 cae57c51e..5209ed80c 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 @@ -127,18 +127,25 @@ public class BlockProcessor extends AbstractVisitor { } private static void checkForUnreachableBlocks(MethodNode mth) { - for (BlockNode block : mth.getBasicBlocks()) { - if (block.getPredecessors().isEmpty() && block != mth.getEnterBlock()) { - // Sometimes a split cross block will have all it's predecessors moved elsewhere after it's been - // created. This is usually detected at the time of it's creation, but in certain edge cases it - // is difficult to do so. In those cases it will be cleanly removed here, along with the associated - // bottom splitter. - if (block.contains(AType.EXC_SPLIT_CROSS) && fixUnreachableSplitCross(mth, block)) { - mth.addInfoComment("Removed unreachable split cross block " + block.toString()); - } else { + while (true) { + boolean fixed = false; + for (BlockNode block : mth.getBasicBlocks()) { + if (block.getPredecessors().isEmpty() && block != mth.getEnterBlock()) { + // Sometimes a split cross block will have all it's predecessors moved elsewhere after it's been + // created. This is usually detected at the time of it's creation, but in certain edge cases it + // is difficult to do so. In those cases it will be cleanly removed here, along with the associated + // bottom splitter. + if (block.contains(AType.EXC_SPLIT_CROSS) && fixUnreachableSplitCross(mth, block)) { + mth.addInfoComment("Removed unreachable split cross block " + block); + fixed = true; + break; + } throw new JadxRuntimeException("Unreachable block: " + block); } } + if (!fixed) { + break; + } } } @@ -159,7 +166,6 @@ public class BlockProcessor extends AbstractVisitor { break; } } - if (bottomSplitter == null || bottomSplitter.getPredecessors().size() != 1) { return false; } @@ -167,7 +173,6 @@ public class BlockProcessor extends AbstractVisitor { removeSet.add(bottomSplitter); removeSet.add(splitCross); removeFromMethod(removeSet, mth); - return true; } diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/PostProcessRegions.java b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/PostProcessRegions.java index 8e5242841..7a42cc826 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/PostProcessRegions.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/PostProcessRegions.java @@ -1,6 +1,5 @@ package jadx.core.dex.visitors.regions; -import java.util.Collections; import java.util.List; import jadx.core.dex.attributes.AType; @@ -9,7 +8,6 @@ import jadx.core.dex.nodes.BlockNode; import jadx.core.dex.nodes.IContainer; import jadx.core.dex.nodes.IRegion; import jadx.core.dex.nodes.InsnContainer; -import jadx.core.dex.nodes.InsnNode; import jadx.core.dex.nodes.MethodNode; import jadx.core.dex.regions.Region; import jadx.core.dex.regions.SwitchRegion; @@ -60,8 +58,7 @@ public final class PostProcessRegions extends AbstractRegionVisitor { return; } } - List insns = Collections.singletonList(insnAttr.getInsn()); - region.add(new InsnContainer(insns)); + region.add(new InsnContainer(insnAttr.getInsn())); } private PostProcessRegions() {