From 3bd11fa56203a19ce7b930f563eec91e33db6a44 Mon Sep 17 00:00:00 2001 From: Skylot Date: Thu, 28 Mar 2013 23:42:35 +0400 Subject: [PATCH] Improve loops parsing --- .../visitors/regions/MarkTryCatchRegions.java | 3 ++ .../dex/visitors/regions/RegionMaker.java | 30 ++++++++++++------- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/main/java/jadx/dex/visitors/regions/MarkTryCatchRegions.java b/src/main/java/jadx/dex/visitors/regions/MarkTryCatchRegions.java index d2eb1214b..19a59b566 100644 --- a/src/main/java/jadx/dex/visitors/regions/MarkTryCatchRegions.java +++ b/src/main/java/jadx/dex/visitors/regions/MarkTryCatchRegions.java @@ -92,6 +92,9 @@ public class MarkTryCatchRegions extends AbstractRegionVisitor { if (tryBlocksMap.isEmpty()) return; + if (!(region instanceof Region)) + return; + // search dominator blocks in this region (don't need to go deeper) for (BlockNode dominator : tryBlocksMap.keySet()) { if (region.getSubBlocks().contains(dominator)) { diff --git a/src/main/java/jadx/dex/visitors/regions/RegionMaker.java b/src/main/java/jadx/dex/visitors/regions/RegionMaker.java index 2a8ddfa0e..9dfaa6a3a 100644 --- a/src/main/java/jadx/dex/visitors/regions/RegionMaker.java +++ b/src/main/java/jadx/dex/visitors/regions/RegionMaker.java @@ -147,21 +147,31 @@ public class RegionMaker { InsnNode insn = exit.getInstructions().get(0); if (insn.getType() == InsnType.IF) { + boolean found = true; ifnode = (IfNode) insn; condBlock = exit; loopRegion = new LoopRegion(curRegion, condBlock, condBlock == loop.getEnd()); - if (!loopRegion.isConditionAtEnd() && condBlock != loop.getStart() - && condBlock.getPredecessors().contains(loopStart)) { - loopRegion.setPreCondition(loopStart); - // if we can't merge pre-condition this is not correct header - if (!loopRegion.checkPreCondition()) { - ifnode = null; - loopRegion = null; - // try another exit - continue; + + if (loopRegion.isConditionAtEnd()) { + // TODO: add some checks + } else { + if (condBlock != loop.getStart()) { + if (condBlock.getPredecessors().contains(loopStart)) { + loopRegion.setPreCondition(loopStart); + // if we can't merge pre-condition this is not correct header + found = loopRegion.checkPreCondition(); + } else { + found = false; + } } } - break; + if (!found) { + ifnode = null; + loopRegion = null; + condBlock = null; + // try another exit + } else + break; } }