From d281126337b42f96a717dafbdf390e5d98cd3761 Mon Sep 17 00:00:00 2001 From: Skylot Date: Sat, 27 Sep 2014 20:09:25 +0400 Subject: [PATCH] core: fix processing try/catch in loop --- .../java/jadx/core/dex/regions/loops/LoopRegion.java | 11 ++++++++--- .../dex/visitors/regions/ProcessTryCatchRegions.java | 9 ++++++++- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/jadx-core/src/main/java/jadx/core/dex/regions/loops/LoopRegion.java b/jadx-core/src/main/java/jadx/core/dex/regions/loops/LoopRegion.java index b7b6bd25b..2623672c3 100644 --- a/jadx-core/src/main/java/jadx/core/dex/regions/loops/LoopRegion.java +++ b/jadx-core/src/main/java/jadx/core/dex/regions/loops/LoopRegion.java @@ -20,7 +20,7 @@ public final class LoopRegion extends AbstractRegion { private final BlockNode conditionBlock; // instruction which must be executed before condition in every loop private BlockNode preCondition; - private IContainer body; + private IRegion body; private final boolean conditionAtEnd; private LoopType type; @@ -44,11 +44,11 @@ public final class LoopRegion extends AbstractRegion { return conditionBlock; } - public IContainer getBody() { + public IRegion getBody() { return body; } - public void setBody(IContainer body) { + public void setBody(IRegion body) { this.body = body; } @@ -144,6 +144,11 @@ public final class LoopRegion extends AbstractRegion { return Collections.unmodifiableList(all); } + @Override + public boolean replaceSubBlock(IContainer oldBlock, IContainer newBlock) { + return false; + } + @Override public String baseString() { return body.baseString(); 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 c79781b1c..8ab48c04b 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 @@ -7,6 +7,7 @@ import jadx.core.dex.nodes.IRegion; import jadx.core.dex.nodes.MethodNode; import jadx.core.dex.regions.AbstractRegion; import jadx.core.dex.regions.Region; +import jadx.core.dex.regions.loops.LoopRegion; import jadx.core.dex.trycatch.CatchAttr; import jadx.core.dex.trycatch.ExceptionHandler; import jadx.core.dex.trycatch.TryCatchBlock; @@ -121,7 +122,13 @@ public class ProcessTryCatchRegions extends AbstractRegionVisitor { /** * Extract all block dominated by 'dominator' to separate region and mark as try/catch block */ - private static boolean wrapBlocks(IRegion region, TryCatchBlock tb, BlockNode dominator) { + private static boolean wrapBlocks(IRegion replaceRegion, TryCatchBlock tb, BlockNode dominator) { + IRegion region = replaceRegion; + if (region instanceof LoopRegion) { + LoopRegion loop = (LoopRegion) region; + region = loop.getBody(); + } + Region newRegion = new Region(region); List subBlocks = region.getSubBlocks(); for (IContainer cont : subBlocks) {