From 08ea61f4dff74f8de9a55655dce4c3dca81c4d62 Mon Sep 17 00:00:00 2001 From: Skylot Date: Wed, 31 Dec 2014 19:37:40 +0300 Subject: [PATCH] core: don't traverse exception handlers twice (includes in TryCatchRegion) --- .../dex/visitors/regions/CheckRegions.java | 4 ++-- .../dex/visitors/regions/CleanRegions.java | 2 +- .../regions/DepthRegionTraversal.java | 18 +++----------- .../dex/visitors/regions/IfRegionVisitor.java | 24 ++++++++++--------- .../visitors/regions/LoopRegionVisitor.java | 2 +- .../regions/ProcessTryCatchRegions.java | 2 +- .../visitors/regions/ProcessVariables.java | 2 +- 7 files changed, 22 insertions(+), 32 deletions(-) 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 421b285c4..8a5e95c3b 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 @@ -67,7 +67,7 @@ public class CheckRegions extends AbstractVisitor { } // check loop conditions - DepthRegionTraversal.traverseAll(mth, new AbstractRegionVisitor() { + DepthRegionTraversal.traverse(mth, new AbstractRegionVisitor() { @Override public void enterRegion(MethodNode mth, IRegion region) { if (region instanceof LoopRegion) { @@ -82,7 +82,7 @@ public class CheckRegions extends AbstractVisitor { private static void printRegionsWithBlock(MethodNode mth, final BlockNode block) { final Set regions = new LinkedHashSet(); - DepthRegionTraversal.traverseAll(mth, new TracedRegionVisitor() { + DepthRegionTraversal.traverse(mth, new TracedRegionVisitor() { @Override public void processBlockTraced(MethodNode mth, IBlock container, IRegion currentRegion) { if (block.equals(container)) { 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 139c3e1c1..57621da7c 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 @@ -44,6 +44,6 @@ public class CleanRegions { } } }; - DepthRegionTraversal.traverseAll(mth, removeEmptyBlocks); + 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 7d4a07086..513f57646 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 @@ -18,18 +18,18 @@ public class DepthRegionTraversal { traverseInternal(mth, visitor, mth.getRegion()); } - public static void traverseAll(MethodNode mth, IRegionVisitor visitor) { + public static void traverseIncludingExcHandlers(MethodNode mth, IRegionVisitor visitor) { traverseInternal(mth, visitor, mth.getRegion()); for (ExceptionHandler h : mth.getExceptionHandlers()) { traverseInternal(mth, visitor, h.getHandlerRegion()); } } - public static void traverseAllIterative(MethodNode mth, IRegionIterativeVisitor visitor) { + public static void traverseIterative(MethodNode mth, IRegionIterativeVisitor visitor) { boolean repeat; int k = 0; do { - repeat = traverseAllIterativeInternal(mth, visitor); + repeat = traverseIterativeInternal(mth, visitor, mth.getRegion()); if (k++ > ITERATIVE_LIMIT) { throw new JadxOverflowException("Iterative traversal limit reached, method: " + mth); } @@ -49,18 +49,6 @@ public class DepthRegionTraversal { } } - private static boolean traverseAllIterativeInternal(MethodNode mth, IRegionIterativeVisitor visitor) { - if (traverseIterativeInternal(mth, visitor, mth.getRegion())) { - return true; - } - for (ExceptionHandler h : mth.getExceptionHandlers()) { - if (traverseIterativeInternal(mth, visitor, h.getHandlerRegion())) { - return true; - } - } - return false; - } - private static boolean traverseIterativeInternal(MethodNode mth, IRegionIterativeVisitor visitor, IContainer container) { if (container instanceof IRegion) { 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 d8b8df9c6..1be9d1a97 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 @@ -19,20 +19,22 @@ import static jadx.core.utils.RegionUtils.insnsCount; public class IfRegionVisitor extends AbstractVisitor implements IRegionVisitor, IRegionIterativeVisitor { + private static final TernaryVisitor TERNARY_VISITOR = new TernaryVisitor(); + @Override public void visit(MethodNode mth) { // collapse ternary operators - DepthRegionTraversal.traverseAllIterative(mth, new IRegionIterativeVisitor() { - @Override - public boolean visitRegion(MethodNode mth, IRegion region) { - if (region instanceof IfRegion) { - return TernaryMod.makeTernaryInsn(mth, (IfRegion) region); - } - return false; - } - }); - DepthRegionTraversal.traverseAll(mth, this); - DepthRegionTraversal.traverseAllIterative(mth, this); + DepthRegionTraversal.traverseIterative(mth, TERNARY_VISITOR); + DepthRegionTraversal.traverse(mth, this); + DepthRegionTraversal.traverseIterative(mth, this); + } + + private static class TernaryVisitor implements IRegionIterativeVisitor { + @Override + public boolean visitRegion(MethodNode mth, IRegion region) { + return region instanceof IfRegion + && TernaryMod.makeTernaryInsn(mth, (IfRegion) region); + } } @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 ab2df63af..450e36d19 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 @@ -43,7 +43,7 @@ public class LoopRegionVisitor extends AbstractVisitor implements IRegionVisitor @Override public void visit(MethodNode mth) { - DepthRegionTraversal.traverseAll(mth, this); + DepthRegionTraversal.traverse(mth, this); } @Override diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/ProcessTryCatchRegions.java b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/ProcessTryCatchRegions.java index a19a54e89..51e504dcf 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/ProcessTryCatchRegions.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/ProcessTryCatchRegions.java @@ -44,7 +44,7 @@ public class ProcessTryCatchRegions extends AbstractRegionVisitor { int k = 0; while (!tryBlocksMap.isEmpty()) { - DepthRegionTraversal.traverseAll(mth, new AbstractRegionVisitor() { + DepthRegionTraversal.traverseIncludingExcHandlers(mth, new AbstractRegionVisitor() { @Override public void leaveRegion(MethodNode mth, IRegion region) { checkAndWrap(mth, tryBlocksMap, region); diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/ProcessVariables.java b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/ProcessVariables.java index 173c5409e..ce9743356 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/ProcessVariables.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/ProcessVariables.java @@ -186,7 +186,7 @@ public class ProcessVariables extends AbstractVisitor { // collect all variables usage IRegionVisitor collect = new CollectUsageRegionVisitor(usageMap); - DepthRegionTraversal.traverseAll(mth, collect); + DepthRegionTraversal.traverse(mth, collect); // reduce assigns map List mthArgs = mth.getArguments(true);