Skip to content

Commit ab81514

Browse files
committed
Fix do while loops inside of other loops
1 parent cb7f62e commit ab81514

File tree

4 files changed

+112
-7
lines changed

4 files changed

+112
-7
lines changed

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: 91 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+
System.out.println();// 71
66+
System.out.println();// 72
67+
if (!(1.0 < Math.random())) {// 73
68+
}
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,67 @@ 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 64
275+
9 64
276+
a 64
277+
b 64
278+
c 64
279+
d 64
280+
e 65
281+
f 65
282+
10 65
283+
11 65
284+
12 65
285+
13 65
286+
14 66
287+
15 66
288+
16 66
289+
17 66
290+
18 66
291+
19 66
292+
1a 66
293+
1b 66
294+
1f 69
295+
}
219296
}
220297

221298
Lines mapping:
@@ -245,5 +322,15 @@ Lines mapping:
245322
50 <-> 44
246323
54 <-> 48
247324
57 <-> 51
325+
60 <-> 54
326+
61 <-> 55
327+
63 <-> 58
328+
64 <-> 59
329+
66 <-> 61
330+
69 <-> 64
331+
71 <-> 65
332+
72 <-> 66
333+
73 <-> 67
334+
75 <-> 70
248335
Not mapped:
249336
51

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)