From 76d0a39a0f052f0e966f1f4066fe772a82628ede Mon Sep 17 00:00:00 2001 From: Skylot Date: Tue, 1 Dec 2020 16:20:50 +0300 Subject: [PATCH] fix: handle empty loop body (#1040) --- .../java/jadx/core/dex/visitors/regions/RegionMaker.java | 9 ++++++++- .../jadx/tests/integration/loops/TestDoWhileBreak3.java | 5 ++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMaker.java b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMaker.java index 0622d212..1e6eae74 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMaker.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMaker.java @@ -8,6 +8,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Objects; import java.util.Optional; import java.util.Set; @@ -224,7 +225,13 @@ public class RegionMaker { } stack.addExit(out); BlockNode loopBody = condInfo.getThenBlock(); - Region body = makeRegion(loopBody, stack); + Region body; + if (Objects.equals(loopBody, loopStart)) { + // empty loop body + body = new Region(loopRegion); + } else { + body = makeRegion(loopBody, stack); + } // add blocks from loop start to first condition block BlockNode conditionBlock = condInfo.getIfBlock(); if (loopStart != conditionBlock) { diff --git a/jadx-core/src/test/java/jadx/tests/integration/loops/TestDoWhileBreak3.java b/jadx-core/src/test/java/jadx/tests/integration/loops/TestDoWhileBreak3.java index 786d0e9b..097a5d18 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/loops/TestDoWhileBreak3.java +++ b/jadx-core/src/test/java/jadx/tests/integration/loops/TestDoWhileBreak3.java @@ -4,7 +4,6 @@ import java.util.Iterator; import org.junit.jupiter.api.Test; -import jadx.NotYetImplemented; import jadx.tests.api.IntegrationTest; import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; @@ -23,11 +22,11 @@ public class TestDoWhileBreak3 extends IntegrationTest { } } - @NotYetImplemented @Test public void test() { assertThat(getClassNode(TestCls.class)) .code() - .containsOnlyOnce("while"); + .containsOne("while") + .containsLines(2, "while (this.it.hasNext() && this.it.next() != null) {", "}"); } } -- GitLab