diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/AbstractRegionVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/AbstractRegionVisitor.java index 2e8e67b50..7e6f773d2 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/AbstractRegionVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/AbstractRegionVisitor.java @@ -7,7 +7,8 @@ import jadx.core.dex.nodes.MethodNode; public abstract class AbstractRegionVisitor implements IRegionVisitor { @Override - public void enterRegion(MethodNode mth, IRegion region) { + public boolean enterRegion(MethodNode mth, IRegion region) { + return true; } @Override diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/CheckRegions.java b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/CheckRegions.java index 9c4b02435..e5f08c294 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/CheckRegions.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/CheckRegions.java @@ -64,13 +64,14 @@ public class CheckRegions extends AbstractVisitor { // check loop conditions DepthRegionTraversal.traverse(mth, new AbstractRegionVisitor() { @Override - public void enterRegion(MethodNode mth, IRegion region) { + public boolean enterRegion(MethodNode mth, IRegion region) { if (region instanceof LoopRegion) { BlockNode loopHeader = ((LoopRegion) region).getHeader(); if (loopHeader != null && loopHeader.getInstructions().size() != 1) { ErrorsCounter.methodError(mth, "Incorrect condition in loop: " + loopHeader); } } + return true; } }); } diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/CleanRegions.java b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/CleanRegions.java index 57621da7c..3ab15eae2 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/CleanRegions.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/CleanRegions.java @@ -23,9 +23,9 @@ public class CleanRegions { } IRegionVisitor removeEmptyBlocks = new AbstractRegionVisitor() { @Override - public void enterRegion(MethodNode mth, IRegion region) { + public boolean enterRegion(MethodNode mth, IRegion region) { if (!(region instanceof Region)) { - return; + return true; } for (Iterator it = region.getSubBlocks().iterator(); it.hasNext(); ) { @@ -42,6 +42,7 @@ public class CleanRegions { } } + return true; } }; DepthRegionTraversal.traverse(mth, removeEmptyBlocks); diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/DepthRegionTraversal.java b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/DepthRegionTraversal.java index 58164ab3d..d67e77cb8 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/DepthRegionTraversal.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/DepthRegionTraversal.java @@ -53,9 +53,10 @@ public class DepthRegionTraversal { visitor.processBlock(mth, (IBlock) container); } else if (container instanceof IRegion) { IRegion region = (IRegion) container; - visitor.enterRegion(mth, region); - for (IContainer subCont : region.getSubBlocks()) { - traverseInternal(mth, visitor, subCont); + if (visitor.enterRegion(mth, region)) { + for (IContainer subCont : region.getSubBlocks()) { + traverseInternal(mth, visitor, subCont); + } } visitor.leaveRegion(mth, region); } diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/IRegionVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/IRegionVisitor.java index c586f6750..2e9c4e4e1 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/IRegionVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/IRegionVisitor.java @@ -8,7 +8,10 @@ public interface IRegionVisitor { void processBlock(MethodNode mth, IBlock container); - void enterRegion(MethodNode mth, IRegion region); + /** + * @return true for traverse sub-blocks, false otherwise. + */ + boolean enterRegion(MethodNode mth, IRegion region); void leaveRegion(MethodNode mth, IRegion region); diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/IfRegionVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/IfRegionVisitor.java index 1be9d1a97..db0f79453 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/IfRegionVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/IfRegionVisitor.java @@ -38,10 +38,11 @@ public class IfRegionVisitor extends AbstractVisitor implements IRegionVisitor, } @Override - public void enterRegion(MethodNode mth, IRegion region) { + public boolean enterRegion(MethodNode mth, IRegion region) { if (region instanceof IfRegion) { processIfRegion(mth, (IfRegion) region); } + return true; } @Override diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/LoopRegionVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/LoopRegionVisitor.java index e75025af7..1a3a7c085 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/LoopRegionVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/LoopRegionVisitor.java @@ -47,10 +47,11 @@ public class LoopRegionVisitor extends AbstractVisitor implements IRegionVisitor } @Override - public void enterRegion(MethodNode mth, IRegion region) { + public boolean enterRegion(MethodNode mth, IRegion region) { if (region instanceof LoopRegion) { processLoopRegion(mth, (LoopRegion) region); } + return true; } private static void processLoopRegion(MethodNode mth, LoopRegion loopRegion) { diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/TracedRegionVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/TracedRegionVisitor.java index 404e19253..3af219739 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/TracedRegionVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/TracedRegionVisitor.java @@ -12,12 +12,13 @@ public abstract class TracedRegionVisitor implements IRegionVisitor { protected final Deque regionStack = new ArrayDeque(); @Override - public final void enterRegion(MethodNode mth, IRegion region) { + public boolean enterRegion(MethodNode mth, IRegion region) { regionStack.push(region); + return true; } @Override - public final void processBlock(MethodNode mth, IBlock container) { + public void processBlock(MethodNode mth, IBlock container) { IRegion curRegion = regionStack.peek(); processBlockTraced(mth, container, curRegion); } @@ -25,7 +26,7 @@ public abstract class TracedRegionVisitor implements IRegionVisitor { public abstract void processBlockTraced(MethodNode mth, IBlock container, IRegion currentRegion); @Override - public final void leaveRegion(MethodNode mth, IRegion region) { + public void leaveRegion(MethodNode mth, IRegion region) { regionStack.pop(); } }