diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/blocksmaker/BlockFinallyExtract.java b/jadx-core/src/main/java/jadx/core/dex/visitors/blocksmaker/BlockFinallyExtract.java index 27a249c56..a37a53a4c 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/blocksmaker/BlockFinallyExtract.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/blocksmaker/BlockFinallyExtract.java @@ -34,6 +34,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import static jadx.core.dex.visitors.blocksmaker.BlockSplitter.connect; +import static jadx.core.dex.visitors.blocksmaker.BlockSplitter.insertBlockBetween; import static jadx.core.dex.visitors.blocksmaker.BlockSplitter.removeConnection; public class BlockFinallyExtract extends AbstractVisitor { @@ -511,10 +512,11 @@ public class BlockFinallyExtract extends AbstractVisitor { // redirect input edges for (BlockNode pred : new ArrayList(remBlock.getPredecessors())) { - removeConnection(pred, remBlock); - connect(pred, startBlock); - addIgnoredEdge(pred, startBlock); - connect(pred, rOut); + BlockNode middle = insertBlockBetween(mth, pred, remBlock); + removeConnection(middle, remBlock); + connect(middle, startBlock); + addIgnoredEdge(middle, startBlock); + connect(middle, rOut); } // mark blocks for remove diff --git a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally5.java b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally5.java new file mode 100644 index 000000000..9beef05c8 --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally5.java @@ -0,0 +1,71 @@ +package jadx.tests.integration.trycatch; + +import jadx.core.dex.nodes.ClassNode; +import jadx.tests.api.IntegrationTest; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Test; + +import static jadx.tests.api.utils.JadxMatchers.containsOne; +import static org.junit.Assert.assertThat; + +public class TestTryCatchFinally5 extends IntegrationTest { + + public static class TestCls { + private List test(A a, B b) { + C c = p(a); + if (c == null) { + return null; + } + D d = b.f(c); + try { + if (!d.first()) { + return null; + } + List list = new ArrayList(); + do { + list.add(b.load(d)); + } while (d.toNext()); + return list; + } finally { + d.close(); + } + } + + private C p(A a) { + return (C) a; + } + + private interface A { + } + + private interface B { + D f(C c); + + T load(D d); + } + + private interface C { + } + + private interface D { + boolean first(); + + boolean toNext(); + + void close(); + } + } + + @Test + public void test() { + ClassNode cls = getClassNode(TestCls.class); + String code = cls.getCode().toString(); + + assertThat(code, containsOne("} finally {")); + // TODO: remove duplicates on multiple paths +// assertThat(code, containsOne("d.close();")); + } +}