Skip to content

Commit cd60d64

Browse files
authored
Fix do while loops inside of other loops being negated (#486)
* Fix do while loops inside of other loops * Fix testjava11stringconcat * Fix test4
1 parent fec7cd2 commit cd60d64

File tree

6 files changed

+113
-11
lines changed

6 files changed

+113
-11
lines changed

src/org/jetbrains/java/decompiler/modules/decompiler/LabelHelper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ public static void lowContinueLabels(Statement stat, HashSet<StatEdge> edges) {
108108
if (!ok) {
109109
DoStatement dostat = (DoStatement)stat;
110110
ok = dostat.getLooptype() == DoStatement.Type.INFINITE ||
111-
dostat.getLooptype() == DoStatement.Type.WHILE ||
111+
dostat.getLooptype() == DoStatement.Type.WHILE && dostat.getConditionExprent() == null ||
112112
(dostat.getLooptype() == DoStatement.Type.FOR && dostat.getIncExprent() == null);
113113
}
114114

src/org/jetbrains/java/decompiler/modules/decompiler/MergeHelper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ && isLastInLoop(stat) && isDirectPath(stat, ifedge.getDestination()))
100100
stat.setLooptype(DoStatement.Type.DO_WHILE);
101101

102102
IfExprent ifexpr = (IfExprent)lastif.getHeadexprent().copy();
103-
if (ifedge.getType() == StatEdge.TYPE_BREAK) {
103+
if (elseedge.getType() == StatEdge.TYPE_CONTINUE && elseedge.closure == stat) {
104104
ifexpr.negateIf();
105105
}
106106

testData/results/pkg/TestDoWhileMerge.dec

Lines changed: 88 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public class TestDoWhileMerge {
2525
if (++i == 30) {// 28 30
2626
return;// 31
2727
}
28-
} while (!b || i >= 40);// 33
28+
} while (b && i < 40);// 33
2929
}
3030

3131
System.out.println("after");// 36
@@ -49,6 +49,25 @@ public class TestDoWhileMerge {
4949
}
5050
}
5151
}// 57
52+
53+
public void test3() {
54+
while (1.0 < Math.random()) {// 60
55+
System.out.println();// 61
56+
57+
do {
58+
System.out.println();// 63
59+
} while (1.0 < Math.random());// 64
60+
}
61+
}// 66
62+
63+
public void test4() {
64+
while (1.0 > Math.random()) {// 69
65+
do {
66+
System.out.println();// 71
67+
System.out.println();// 72
68+
} while (1.0 < Math.random());// 73
69+
}
70+
}// 75
5271
}
5372

5473
class 'pkg/TestDoWhileMerge' {
@@ -139,9 +158,6 @@ class 'pkg/TestDoWhileMerge' {
139158
1d 24
140159
1e 25
141160
1f 27
142-
20 27
143-
21 27
144-
22 27
145161
23 27
146162
24 27
147163
25 27
@@ -216,6 +232,64 @@ class 'pkg/TestDoWhileMerge' {
216232
38 34
217233
3c 50
218234
}
235+
236+
method 'test3 ()V' {
237+
0 53
238+
1 53
239+
2 53
240+
3 53
241+
4 53
242+
5 53
243+
6 53
244+
7 53
245+
8 54
246+
9 54
247+
a 54
248+
b 54
249+
c 54
250+
d 54
251+
e 57
252+
f 57
253+
10 57
254+
11 57
255+
12 57
256+
13 57
257+
14 58
258+
15 58
259+
16 58
260+
17 58
261+
18 58
262+
1f 60
263+
}
264+
265+
method 'test4 ()V' {
266+
0 63
267+
1 63
268+
2 63
269+
3 63
270+
4 63
271+
5 63
272+
6 63
273+
7 63
274+
8 65
275+
9 65
276+
a 65
277+
b 65
278+
c 65
279+
d 65
280+
e 66
281+
f 66
282+
10 66
283+
11 66
284+
12 66
285+
13 66
286+
14 67
287+
15 67
288+
16 67
289+
17 67
290+
18 67
291+
1f 69
292+
}
219293
}
220294

221295
Lines mapping:
@@ -245,5 +319,15 @@ Lines mapping:
245319
50 <-> 44
246320
54 <-> 48
247321
57 <-> 51
322+
60 <-> 54
323+
61 <-> 55
324+
63 <-> 58
325+
64 <-> 59
326+
66 <-> 61
327+
69 <-> 64
328+
71 <-> 66
329+
72 <-> 67
330+
73 <-> 68
331+
75 <-> 70
248332
Not mapped:
249333
51

testData/results/pkg/TestJava11StringConcat.dec

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,12 @@ class 'pkg/TestJava11StringConcat' {
3434
0 8
3535
1 8
3636
2 8
37-
3 8
38-
4 8
39-
5 8
4037
6 8
4138
7 8
4239
8 8
40+
9 8
41+
a 8
42+
b 8
4343
}
4444

4545
method 'testEmptyPrefix (I)Ljava/lang/String;' {

testData/results/pkg/TestNestedLoops.dec

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public class TestNestedLoops {
1616
for (int j = 0; j < 20; j++) {// 13
1717
do {
1818
s.substring(j);// 15
19-
} while (s.length() >= j);// 16
19+
} while (s.length() < j);// 16
2020
}
2121
}
2222

@@ -34,7 +34,7 @@ public class TestNestedLoops {
3434
for (int j = 0; j < 20; j++) {// 33
3535
do {
3636
s.substring(j);// 35
37-
} while (s.length() >= j);// 36
37+
} while (s.length() < j);// 36
3838
}
3939
}
4040

testData/src/java8/pkg/TestDoWhileMerge.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,22 @@ public void test2(boolean b, int j) {
5555
}
5656
}
5757
}
58+
59+
public void test3() {
60+
while (1F < Math.random()) {
61+
System.out.println();
62+
do {
63+
System.out.println();
64+
} while (1F < Math.random());
65+
}
66+
}
67+
68+
public void test4() {
69+
while (1F > Math.random()) {
70+
do {
71+
System.out.println();
72+
System.out.println();
73+
} while (1F < Math.random());
74+
}
75+
}
5876
}

0 commit comments

Comments
 (0)