From ca448fc4d88408727b42c3b197d1198b5a54dc35 Mon Sep 17 00:00:00 2001 From: Skylot Date: Mon, 10 Mar 2014 15:28:12 +0400 Subject: [PATCH] core: fix variable definitions for 'try' blocks --- .../jadx/core/dex/regions/AbstractRegion.java | 5 ++++- .../regions/ProcessTryCatchRegions.java | 9 ++++++++ .../visitors/regions/ProcessVariables.java | 2 +- .../internal/TestVariablesDefinitions.java | 21 ++++++++++++------- 4 files changed, 28 insertions(+), 9 deletions(-) diff --git a/jadx-core/src/main/java/jadx/core/dex/regions/AbstractRegion.java b/jadx-core/src/main/java/jadx/core/dex/regions/AbstractRegion.java index 7d51120d..75ba981d 100644 --- a/jadx-core/src/main/java/jadx/core/dex/regions/AbstractRegion.java +++ b/jadx-core/src/main/java/jadx/core/dex/regions/AbstractRegion.java @@ -5,7 +5,7 @@ import jadx.core.dex.nodes.IRegion; public abstract class AbstractRegion extends AttrNode implements IRegion { - private final IRegion parent; + private IRegion parent; public AbstractRegion(IRegion parent) { this.parent = parent; @@ -16,4 +16,7 @@ public abstract class AbstractRegion extends AttrNode implements IRegion { return parent; } + public void setParent(IRegion parent) { + this.parent = parent; + } } 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 ccdad9a3..a3d71c4e 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 @@ -5,6 +5,7 @@ import jadx.core.dex.nodes.BlockNode; import jadx.core.dex.nodes.IContainer; 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.trycatch.CatchAttr; import jadx.core.dex.trycatch.ExceptionHandler; @@ -144,6 +145,14 @@ public class ProcessTryCatchRegions extends AbstractRegionVisitor { region.getSubBlocks().removeAll(newRegion.getSubBlocks()); newRegion.getAttributes().add(tb.getCatchAttr()); + + // fix parents + for (IContainer cont : newRegion.getSubBlocks()) { + if (cont instanceof AbstractRegion) { + AbstractRegion aReg = (AbstractRegion) cont; + aReg.setParent(newRegion); + } + } } } 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 e882fd00..13dfccfa 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 @@ -60,7 +60,7 @@ public class ProcessVariables extends AbstractVisitor { @Override public String toString() { - return arg + " " + assigns + " " + usage; + return arg + ", a:" + assigns + ", u:" + usage; } } diff --git a/jadx-core/src/test/java/jadx/tests/internal/TestVariablesDefinitions.java b/jadx-core/src/test/java/jadx/tests/internal/TestVariablesDefinitions.java index 66a806fd..e8dec632 100644 --- a/jadx-core/src/test/java/jadx/tests/internal/TestVariablesDefinitions.java +++ b/jadx-core/src/test/java/jadx/tests/internal/TestVariablesDefinitions.java @@ -6,10 +6,16 @@ import jadx.core.dex.visitors.DepthTraverser; import jadx.core.dex.visitors.IDexTreeVisitor; import jadx.core.utils.exceptions.DecodeException; +import java.util.Iterator; import java.util.List; +import org.junit.Test; import org.slf4j.Logger; +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.not; +import static org.junit.Assert.assertThat; + public class TestVariablesDefinitions extends InternalJadxTest { public static class TestCls { @@ -20,23 +26,24 @@ public class TestVariablesDefinitions extends InternalJadxTest { public void run() { try { cls.load(); - for (IDexTreeVisitor visitor : passes) { - DepthTraverser.visit(visitor, cls); + Iterator iterator = passes.iterator(); + while (iterator.hasNext()) { + DepthTraverser.visit(iterator.next(), cls); } } catch (DecodeException e) { LOG.error("Decode exception: " + cls, e); - } finally { - cls.unload(); } } } - //@Test + @Test public void test() { ClassNode cls = getClassNode(TestCls.class); - String code = cls.getCode().toString(); - System.out.println(code); + + // 'iterator' variable must be declared inside 'try' block + assertThat(code, containsString(makeIndent(3) + "Iterator iterator = ")); + assertThat(code, not(containsString("iterator;"))); } } -- GitLab