summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/de/fernflower/modules/decompiler/stats/SwitchStatement.java17
1 files changed, 11 insertions, 6 deletions
diff --git a/src/de/fernflower/modules/decompiler/stats/SwitchStatement.java b/src/de/fernflower/modules/decompiler/stats/SwitchStatement.java
index 21fdfcf..f3d2231 100644
--- a/src/de/fernflower/modules/decompiler/stats/SwitchStatement.java
+++ b/src/de/fernflower/modules/decompiler/stats/SwitchStatement.java
@@ -266,15 +266,20 @@ public class SwitchStatement extends Statement {
setPreds.remove(first);
if(!setPreds.isEmpty()) {
- Statement pred = setPreds.iterator().next(); // at most one predecessor node besides the head
- for(int j=index+1;j<nodes.size();j++) {
- if(nodes.get(j) == pred) {
+ Statement pred = setPreds.iterator().next(); // assumption: at most one predecessor node besides the head. May not hold true for obfuscated code.
+ for(int j=0;j<nodes.size();j++) {
+ if(j != (index - 1) && nodes.get(j) == pred) {
nodes.add(j+1, stat);
edges.add(j+1, edges.get(index));
- nodes.remove(index);
- edges.remove(index);
- index--;
+ if(j > index) {
+ nodes.remove(index);
+ edges.remove(index);
+ index--;
+ } else {
+ nodes.remove(index + 1);
+ edges.remove(index + 1);
+ }
break;
}
}