diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/TernaryMod.java b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/TernaryMod.java index b32e9c080..a89638126 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/TernaryMod.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/TernaryMod.java @@ -31,13 +31,18 @@ public class TernaryMod extends AbstractRegionVisitor implements IRegionIterativ private static final TernaryMod INSTANCE = new TernaryMod(); public static void process(MethodNode mth) { - // first: convert all found ternary nodes in one iteration + boolean changed = false; + // convert all found ternary nodes in one iteration DepthRegionTraversal.traverse(mth, INSTANCE); if (mth.contains(AFlag.REQUEST_CODE_SHRINK)) { CodeShrinkVisitor.shrinkMethod(mth); + changed = true; + } + if (changed && mth.isConstructor()) { + // aggressive mode to help code inline before super call in constructor + // iterative runs with shrink after each change + DepthRegionTraversal.traverseIterative(mth, INSTANCE); } - // second: iterative runs with shrink after each change - DepthRegionTraversal.traverseIterative(mth, INSTANCE); } @Override diff --git a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions14.java b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions14.java index 80cb24c3b..3819df425 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions14.java +++ b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions14.java @@ -3,7 +3,8 @@ package jadx.tests.integration.conditions; import org.junit.jupiter.api.Test; import jadx.tests.api.IntegrationTest; -import jadx.tests.api.utils.assertj.JadxAssertions; + +import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; public class TestConditions14 extends IntegrationTest { @@ -22,9 +23,15 @@ public class TestConditions14 extends IntegrationTest { @Test public void test() { - JadxAssertions.assertThat(getClassNode(TestCls.class)) + assertThat(getClassNode(TestCls.class)) .code() - .containsOne("boolean r = a == null ? b != null : !a.equals(b);") + .containsLines(2, + "boolean r;", + "if (a == null) {", + indent() + "r = b != null;", + "} else {", + indent() + "r = !a.equals(b);", + "}") .containsOne("if (r) {") .containsOne("System.out.println(\"r=\" + r);"); } diff --git a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions22.java b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions22.java new file mode 100644 index 000000000..adb0bc118 --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions22.java @@ -0,0 +1,60 @@ +package jadx.tests.integration.conditions; + +import jadx.tests.api.IntegrationTest; +import jadx.tests.api.extensions.profiles.TestProfile; +import jadx.tests.api.extensions.profiles.TestWithProfiles; + +import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; + +public class TestConditions22 extends IntegrationTest { + + public static class TestCls { + + public static int test(int i, int j) { + int k; + if (i == 1) { + if (j == 2) { + k = 3; + } else { + k = 0; + } + } else if (i == 2) { + if (j == 3) { + k = 4; + } else { + k = 0; + } + } else if (i == 3) { + if (j == 4) { + k = 5; + } else { + k = 0; + } + } else { + k = 0; + } + System.out.println("k = " + k); + return k; + } + + public void check() { + assertThat(test(1, 2)).isEqualTo(3); + assertThat(test(1, 1)).isEqualTo(0); + assertThat(test(2, 3)).isEqualTo(4); + assertThat(test(2, 2)).isEqualTo(0); + assertThat(test(3, 4)).isEqualTo(5); + assertThat(test(3, 3)).isEqualTo(0); + assertThat(test(4, 4)).isEqualTo(0); + } + } + + @TestWithProfiles(TestProfile.JAVA17) + public void testJava() { + noDebugInfo(); + assertThat(getClassNode(TestCls.class)) + .code() + .containsOne(indent(2) + "if (") + .containsOne(indent(2) + "} else if (") + .containsOne(indent(2) + "} else {"); + } +}