From ab81514ba45797cabe86091cac99d01e2bd051a0 Mon Sep 17 00:00:00 2001 From: coehlrich Date: Sat, 12 Jul 2025 15:51:12 +1200 Subject: [PATCH 1/3] Fix do while loops inside of other loops --- .../modules/decompiler/MergeHelper.java | 2 +- testData/results/pkg/TestDoWhileMerge.dec | 95 ++++++++++++++++++- testData/results/pkg/TestNestedLoops.dec | 4 +- testData/src/java8/pkg/TestDoWhileMerge.java | 18 ++++ 4 files changed, 112 insertions(+), 7 deletions(-) diff --git a/src/org/jetbrains/java/decompiler/modules/decompiler/MergeHelper.java b/src/org/jetbrains/java/decompiler/modules/decompiler/MergeHelper.java index 5188dfff3c..e33d3fc3fd 100644 --- a/src/org/jetbrains/java/decompiler/modules/decompiler/MergeHelper.java +++ b/src/org/jetbrains/java/decompiler/modules/decompiler/MergeHelper.java @@ -100,7 +100,7 @@ && isLastInLoop(stat) && isDirectPath(stat, ifedge.getDestination())) stat.setLooptype(DoStatement.Type.DO_WHILE); IfExprent ifexpr = (IfExprent)lastif.getHeadexprent().copy(); - if (ifedge.getType() == StatEdge.TYPE_BREAK) { + if (elseedge.getType() == StatEdge.TYPE_CONTINUE && elseedge.closure == stat) { ifexpr.negateIf(); } diff --git a/testData/results/pkg/TestDoWhileMerge.dec b/testData/results/pkg/TestDoWhileMerge.dec index 7a832054db..311c230a36 100644 --- a/testData/results/pkg/TestDoWhileMerge.dec +++ b/testData/results/pkg/TestDoWhileMerge.dec @@ -25,7 +25,7 @@ public class TestDoWhileMerge { if (++i == 30) {// 28 30 return;// 31 } - } while (!b || i >= 40);// 33 + } while (b && i < 40);// 33 } System.out.println("after");// 36 @@ -49,6 +49,25 @@ public class TestDoWhileMerge { } } }// 57 + + public void test3() { + while (1.0 < Math.random()) {// 60 + System.out.println();// 61 + + do { + System.out.println();// 63 + } while (1.0 < Math.random());// 64 + } + }// 66 + + public void test4() { + while (1.0 > Math.random()) {// 69 + System.out.println();// 71 + System.out.println();// 72 + if (!(1.0 < Math.random())) {// 73 + } + } + }// 75 } class 'pkg/TestDoWhileMerge' { @@ -139,9 +158,6 @@ class 'pkg/TestDoWhileMerge' { 1d 24 1e 25 1f 27 - 20 27 - 21 27 - 22 27 23 27 24 27 25 27 @@ -216,6 +232,67 @@ class 'pkg/TestDoWhileMerge' { 38 34 3c 50 } + + method 'test3 ()V' { + 0 53 + 1 53 + 2 53 + 3 53 + 4 53 + 5 53 + 6 53 + 7 53 + 8 54 + 9 54 + a 54 + b 54 + c 54 + d 54 + e 57 + f 57 + 10 57 + 11 57 + 12 57 + 13 57 + 14 58 + 15 58 + 16 58 + 17 58 + 18 58 + 1f 60 + } + + method 'test4 ()V' { + 0 63 + 1 63 + 2 63 + 3 63 + 4 63 + 5 63 + 6 63 + 7 63 + 8 64 + 9 64 + a 64 + b 64 + c 64 + d 64 + e 65 + f 65 + 10 65 + 11 65 + 12 65 + 13 65 + 14 66 + 15 66 + 16 66 + 17 66 + 18 66 + 19 66 + 1a 66 + 1b 66 + 1f 69 + } } Lines mapping: @@ -245,5 +322,15 @@ Lines mapping: 50 <-> 44 54 <-> 48 57 <-> 51 +60 <-> 54 +61 <-> 55 +63 <-> 58 +64 <-> 59 +66 <-> 61 +69 <-> 64 +71 <-> 65 +72 <-> 66 +73 <-> 67 +75 <-> 70 Not mapped: 51 diff --git a/testData/results/pkg/TestNestedLoops.dec b/testData/results/pkg/TestNestedLoops.dec index eab27f8882..59a9db6a43 100644 --- a/testData/results/pkg/TestNestedLoops.dec +++ b/testData/results/pkg/TestNestedLoops.dec @@ -16,7 +16,7 @@ public class TestNestedLoops { for (int j = 0; j < 20; j++) {// 13 do { s.substring(j);// 15 - } while (s.length() >= j);// 16 + } while (s.length() < j);// 16 } } @@ -34,7 +34,7 @@ public class TestNestedLoops { for (int j = 0; j < 20; j++) {// 33 do { s.substring(j);// 35 - } while (s.length() >= j);// 36 + } while (s.length() < j);// 36 } } diff --git a/testData/src/java8/pkg/TestDoWhileMerge.java b/testData/src/java8/pkg/TestDoWhileMerge.java index 50f5ec632c..04b31e80e9 100644 --- a/testData/src/java8/pkg/TestDoWhileMerge.java +++ b/testData/src/java8/pkg/TestDoWhileMerge.java @@ -55,4 +55,22 @@ public void test2(boolean b, int j) { } } } + + public void test3() { + while (1F < Math.random()) { + System.out.println(); + do { + System.out.println(); + } while (1F < Math.random()); + } + } + + public void test4() { + while (1F > Math.random()) { + do { + System.out.println(); + System.out.println(); + } while (1F < Math.random()); + } + } } From 96f44a6f22bef14c31f90bf29578208966cf68f1 Mon Sep 17 00:00:00 2001 From: coehlrich Date: Sat, 12 Jul 2025 16:12:28 +1200 Subject: [PATCH 2/3] Fix testjava11stringconcat --- testData/results/pkg/TestJava11StringConcat.dec | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/testData/results/pkg/TestJava11StringConcat.dec b/testData/results/pkg/TestJava11StringConcat.dec index 70f4848b9f..47f7725614 100644 --- a/testData/results/pkg/TestJava11StringConcat.dec +++ b/testData/results/pkg/TestJava11StringConcat.dec @@ -34,12 +34,12 @@ class 'pkg/TestJava11StringConcat' { 0 8 1 8 2 8 - 3 8 - 4 8 - 5 8 6 8 7 8 8 8 + 9 8 + a 8 + b 8 } method 'testEmptyPrefix (I)Ljava/lang/String;' { From e231a385f9244112b504f75e3d1b3ed4cda56ff4 Mon Sep 17 00:00:00 2001 From: coehlrich Date: Sat, 12 Jul 2025 23:30:36 +1200 Subject: [PATCH 3/3] Fix test4 --- .../modules/decompiler/LabelHelper.java | 2 +- testData/results/pkg/TestDoWhileMerge.dec | 51 +++++++++---------- 2 files changed, 25 insertions(+), 28 deletions(-) diff --git a/src/org/jetbrains/java/decompiler/modules/decompiler/LabelHelper.java b/src/org/jetbrains/java/decompiler/modules/decompiler/LabelHelper.java index d677686a1e..7cc2824a10 100644 --- a/src/org/jetbrains/java/decompiler/modules/decompiler/LabelHelper.java +++ b/src/org/jetbrains/java/decompiler/modules/decompiler/LabelHelper.java @@ -108,7 +108,7 @@ public static void lowContinueLabels(Statement stat, HashSet edges) { if (!ok) { DoStatement dostat = (DoStatement)stat; ok = dostat.getLooptype() == DoStatement.Type.INFINITE || - dostat.getLooptype() == DoStatement.Type.WHILE || + dostat.getLooptype() == DoStatement.Type.WHILE && dostat.getConditionExprent() == null || (dostat.getLooptype() == DoStatement.Type.FOR && dostat.getIncExprent() == null); } diff --git a/testData/results/pkg/TestDoWhileMerge.dec b/testData/results/pkg/TestDoWhileMerge.dec index 311c230a36..644666ef50 100644 --- a/testData/results/pkg/TestDoWhileMerge.dec +++ b/testData/results/pkg/TestDoWhileMerge.dec @@ -62,10 +62,10 @@ public class TestDoWhileMerge { public void test4() { while (1.0 > Math.random()) {// 69 - System.out.println();// 71 - System.out.println();// 72 - if (!(1.0 < Math.random())) {// 73 - } + do { + System.out.println();// 71 + System.out.println();// 72 + } while (1.0 < Math.random());// 73 } }// 75 } @@ -271,26 +271,23 @@ class 'pkg/TestDoWhileMerge' { 5 63 6 63 7 63 - 8 64 - 9 64 - a 64 - b 64 - c 64 - d 64 - e 65 - f 65 - 10 65 - 11 65 - 12 65 - 13 65 - 14 66 - 15 66 - 16 66 - 17 66 - 18 66 - 19 66 - 1a 66 - 1b 66 + 8 65 + 9 65 + a 65 + b 65 + c 65 + d 65 + e 66 + f 66 + 10 66 + 11 66 + 12 66 + 13 66 + 14 67 + 15 67 + 16 67 + 17 67 + 18 67 1f 69 } } @@ -328,9 +325,9 @@ Lines mapping: 64 <-> 59 66 <-> 61 69 <-> 64 -71 <-> 65 -72 <-> 66 -73 <-> 67 +71 <-> 66 +72 <-> 67 +73 <-> 68 75 <-> 70 Not mapped: 51