diff --git a/src/org/jetbrains/java/decompiler/main/TextBuffer.java b/src/org/jetbrains/java/decompiler/main/TextBuffer.java index 93e5193..95afc50 100644 --- a/src/org/jetbrains/java/decompiler/main/TextBuffer.java +++ b/src/org/jetbrains/java/decompiler/main/TextBuffer.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -150,9 +150,12 @@ public class TextBuffer { while ((lineEnd = myStringBuilder.indexOf(myLineSeparator, lineStart)) > 0) { ++count; sb.append(myStringBuilder.substring(lineStart, lineEnd)); - Integer integer = myLineMapping.get(count); - if (integer != null) { - sb.append("// ").append(integer); + Set integers = myLineMapping.get(count); + if (integers != null) { + sb.append("//"); + for (Integer integer : integers) { + sb.append(' ').append(integer); + } } sb.append(myLineSeparator); lineStart = lineEnd + length; @@ -302,17 +305,18 @@ public class TextBuffer { return myStringBuilder; } - private Map myLineMapping = null; // new to original + private Map> myLineMapping = null; // new to original public void dumpOriginalLineNumbers(int[] lineMapping) { if (lineMapping.length > 0) { - myLineMapping = new HashMap(); + myLineMapping = new HashMap>(); for (int i = 0; i < lineMapping.length; i+=2) { int key = lineMapping[i + 1]; - int value = lineMapping[i]; - Integer existing = myLineMapping.get(key); - if (existing == null || value < existing) { - myLineMapping.put(key, value); + Set existing = myLineMapping.get(key); + if (existing == null) { + existing = new TreeSet(); + myLineMapping.put(key, existing); } + existing.add(lineMapping[i]); } } } diff --git a/src/org/jetbrains/java/decompiler/modules/decompiler/exps/IfExprent.java b/src/org/jetbrains/java/decompiler/modules/decompiler/exps/IfExprent.java index f471d45..059270f 100644 --- a/src/org/jetbrains/java/decompiler/modules/decompiler/exps/IfExprent.java +++ b/src/org/jetbrains/java/decompiler/modules/decompiler/exps/IfExprent.java @@ -89,7 +89,7 @@ public class IfExprent extends Exprent { condition = stack.pop(); } else { - condition = new FunctionExprent(FUNC_TYPES[ifType], stack, null); + condition = new FunctionExprent(FUNC_TYPES[ifType], stack, bytecodeOffsets); } } diff --git a/testData/classes/pkg/TestClassLoop.class b/testData/classes/pkg/TestClassLoop.class index 1afdebf..b7abc53 100644 Binary files a/testData/classes/pkg/TestClassLoop.class and b/testData/classes/pkg/TestClassLoop.class differ diff --git a/testData/results/TestClassLambda.dec b/testData/results/TestClassLambda.dec index 4b6e65f..751537c 100644 --- a/testData/results/TestClassLambda.dec +++ b/testData/results/TestClassLambda.dec @@ -84,7 +84,7 @@ public class TestClassLambda { System.out.println("hello2" + var1); };// 87 System.out.println("hello1" + var1);// 88 - };// 86 + };// 86 89 }// 90 } @@ -180,7 +180,9 @@ class 'pkg/TestClassLambda' { method 'lambda$testLambda6$4 (IILjava/lang/String;)Z' { 2 59 + 5 59 9 59 + d 59 15 59 } diff --git a/testData/results/TestClassLoop.dec b/testData/results/TestClassLoop.dec index 7e4df12..0ea725e 100644 --- a/testData/results/TestClassLoop.dec +++ b/testData/results/TestClassLoop.dec @@ -40,6 +40,39 @@ public class TestClassLoop { System.out.println("4");// 58 } } + + public static int testWhileCombined(String var0) { + int var1 = var0.length();// 63 + int var2 = 0;// 64 + boolean var3 = false;// 65 + boolean var4 = false;// 66 + int var5 = 0;// 67 + int var7 = 0;// 69 + + for(boolean var8 = false; var2 < var1; ++var2) {// 70 73 90 + char var6 = var0.charAt(var2);// 74 + if(var6 == 48) {// 75 + ++var7;// 76 + } else { + if(var6 != 46) {// 77 + break; + } + + if(var3) {// 78 + throw new NumberFormatException("multiple points");// 80 + } + + var5 = var2;// 82 + if(var4) {// 83 + var5 = var2 - 1;// 84 + } + + var3 = true;// 86 + } + } + + return var5;// 92 + } } class 'pkg/TestClassLoop' { @@ -77,6 +110,41 @@ class 'pkg/TestClassLoop' { 3a 39 3c 39 } + + method 'testWhileCombined (Ljava/lang/String;)I' { + 1 44 + 4 44 + 5 45 + 6 45 + 7 46 + 8 46 + 9 47 + a 47 + c 48 + d 48 + f 49 + 10 49 + 12 51 + 13 51 + 17 51 + 1c 52 + 1f 52 + 23 53 + 25 53 + 28 54 + 30 56 + 32 56 + 36 60 + 3d 61 + 42 61 + 44 64 + 48 65 + 4b 66 + 4e 69 + 4f 69 + 50 51 + 58 73 + } } Lines mapping: @@ -91,5 +159,25 @@ Lines mapping: 53 <-> 34 54 <-> 35 58 <-> 40 +63 <-> 45 +64 <-> 46 +65 <-> 47 +66 <-> 48 +67 <-> 49 +69 <-> 50 +70 <-> 52 +73 <-> 52 +74 <-> 53 +75 <-> 54 +76 <-> 55 +77 <-> 57 +78 <-> 61 +80 <-> 62 +82 <-> 65 +83 <-> 66 +84 <-> 67 +86 <-> 70 +90 <-> 52 +92 <-> 74 Not mapped: 39 diff --git a/testData/results/TestClassTypes.dec b/testData/results/TestClassTypes.dec index 4f10a71..c957f3f 100644 --- a/testData/results/TestClassTypes.dec +++ b/testData/results/TestClassTypes.dec @@ -79,6 +79,7 @@ class 'pkg/TestClassTypes' { 1 22 2 22 3 22 + 4 22 c 22 } diff --git a/testData/results/TestClassVar.dec b/testData/results/TestClassVar.dec index 37aa5ec..548c6f4 100644 --- a/testData/results/TestClassVar.dec +++ b/testData/results/TestClassVar.dec @@ -27,7 +27,7 @@ public class TestClassVar { while(var1 < 10) {// 47 int var2; - for(var2 = var1; var1 < 10 && var1 == 0; ++var1) {// 49 + for(var2 = var1; var1 < 10 && var1 == 0; ++var1) {// 49 51 ; } @@ -44,6 +44,7 @@ class 'pkg/TestClassVar' { 0 7 1 7 3 7 + 5 7 8 9 b 9 1f 11 @@ -65,8 +66,11 @@ class 'pkg/TestClassVar' { 0 25 1 25 3 27 + 5 27 9 29 b 29 + d 29 + 11 29 14 29 1c 33 1f 34 diff --git a/testData/results/TestTryCatchFinally.dec b/testData/results/TestTryCatchFinally.dec index 4203478..772a76e 100644 --- a/testData/results/TestTryCatchFinally.dec +++ b/testData/results/TestTryCatchFinally.dec @@ -36,7 +36,7 @@ public class TestTryCatchFinally { System.out.println("Finally");// 55 } - return -1;// 56 + return -1;// 56 57 } } diff --git a/testData/src/pkg/TestClassLoop.java b/testData/src/pkg/TestClassLoop.java index 0ecab7d..cf2d883 100644 --- a/testData/src/pkg/TestClassLoop.java +++ b/testData/src/pkg/TestClassLoop.java @@ -58,4 +58,37 @@ public class TestClassLoop { System.out.println("4"); } } + + public static int testWhileCombined(String in) { + int len = in.length(); + int i = 0; + boolean decSeen = false; + boolean signSeen = false; + int decPt = 0; + char c; + int nLeadZero = 0; + int nTrailZero= 0; + + skipLeadingZerosLoop: + while (i < len) { + c = in.charAt(i); + if (c == '0') { + nLeadZero++; + } else if (c == '.') { + if (decSeen) { + // already saw one ., this is the 2nd. + throw new NumberFormatException("multiple points"); + } + decPt = i; + if (signSeen) { + decPt -= 1; + } + decSeen = true; + } else { + break skipLeadingZerosLoop; + } + i++; + } + return decPt; + } }