diff --git a/src/org/jetbrains/java/decompiler/modules/decompiler/stats/CatchStatement.java b/src/org/jetbrains/java/decompiler/modules/decompiler/stats/CatchStatement.java index 0d782cd..8d56042 100644 --- a/src/org/jetbrains/java/decompiler/modules/decompiler/stats/CatchStatement.java +++ b/src/org/jetbrains/java/decompiler/modules/decompiler/stats/CatchStatement.java @@ -16,6 +16,7 @@ package org.jetbrains.java.decompiler.modules.decompiler.stats; import org.jetbrains.java.decompiler.code.CodeConstants; +import org.jetbrains.java.decompiler.code.cfg.BasicBlock; import org.jetbrains.java.decompiler.main.DecompilerContext; import org.jetbrains.java.decompiler.main.TextBuffer; import org.jetbrains.java.decompiler.main.collectors.BytecodeMappingTracer; @@ -167,9 +168,17 @@ public class CatchStatement extends Statement { buf.appendIndent(indent).append("}"); for (int i = 1; i < stats.size(); i++) { - List exception_types = exctstrings.get(i - 1); + Statement stat = stats.get(i); + // map first instruction storing the exception to the catch statement + BasicBlock block = stat.getBasichead().getBlock(); + if (!block.getSeq().isEmpty() && block.getInstruction(0).opcode == CodeConstants.opc_astore) { + Integer offset = block.getOldOffset(0); + if (offset > -1) tracer.addMapping(offset); + } buf.append(" catch ("); + + List exception_types = exctstrings.get(i - 1); if (exception_types.size() > 1) { // multi-catch, Java 7 style for (int exc_index = 1; exc_index < exception_types.size(); ++exc_index) { VarType exc_type = new VarType(CodeConstants.TYPE_OBJECT, 0, exception_types.get(exc_index)); @@ -181,7 +190,7 @@ public class CatchStatement extends Statement { buf.append(vars.get(i - 1).toJava(indent, tracer)); buf.append(") {").appendLineSeparator(); tracer.incrementCurrentSourceLine(); - buf.append(ExprProcessor.jmpWrapper(stats.get(i), indent + 1, true, tracer)).appendIndent(indent) + buf.append(ExprProcessor.jmpWrapper(stat, indent + 1, true, tracer)).appendIndent(indent) .append("}"); } buf.appendLineSeparator(); diff --git a/testData/results/TestClassSimpleBytecodeMapping.dec b/testData/results/TestClassSimpleBytecodeMapping.dec index c450205..a48375a 100644 --- a/testData/results/TestClassSimpleBytecodeMapping.dec +++ b/testData/results/TestClassSimpleBytecodeMapping.dec @@ -21,7 +21,7 @@ public class TestClassSimpleBytecodeMapping { public void test2(String var1) { try { Integer.parseInt(var1);// 34 - } catch (Exception var6) { + } catch (Exception var6) {// 35 System.out.println(var6);// 36 } finally { System.out.println("Finally");// 38 @@ -81,6 +81,7 @@ class 'pkg/TestClassSimpleBytecodeMapping' { method 'test2 (Ljava/lang/String;)V' { 1 22 + 10 23 11 24 15 24 23 26 @@ -125,6 +126,7 @@ Lines mapping: 27 <-> 16 28 <-> 17 34 <-> 23 +35 <-> 24 36 <-> 25 38 <-> 27 40 <-> 30 @@ -135,5 +137,4 @@ Lines mapping: 54 <-> 38 55 <-> 39 Not mapped: -35 39 diff --git a/testData/results/TestTryCatchFinally.dec b/testData/results/TestTryCatchFinally.dec index cb59619..4203478 100644 --- a/testData/results/TestTryCatchFinally.dec +++ b/testData/results/TestTryCatchFinally.dec @@ -7,7 +7,7 @@ public class TestTryCatchFinally { } catch (Exception var9) { try { System.out.println("sout2");// 27 - } catch (Exception var8) { + } catch (Exception var8) {// 28 ; } } finally { @@ -30,7 +30,7 @@ public class TestTryCatchFinally { try { int var2 = Integer.parseInt(var1);// 51 return var2; - } catch (Exception var6) { + } catch (Exception var6) {// 52 System.out.println("Error" + var6);// 53 } finally { System.out.println("Finally");// 55 @@ -48,6 +48,7 @@ class 'pkg/TestTryCatchFinally' { 14 8 17 8 19 8 + 1f 9 2b 13 2d 13 30 13 @@ -68,6 +69,7 @@ class 'pkg/TestTryCatchFinally' { 1 30 4 30 e 31 + f 32 10 33 1a 33 23 33 @@ -83,6 +85,7 @@ class 'pkg/TestTryCatchFinally' { Lines mapping: 24 <-> 6 27 <-> 9 +28 <-> 10 34 <-> 14 36 <-> 17 39 <-> 20 @@ -91,13 +94,12 @@ Lines mapping: 42 <-> 23 45 <-> 25 51 <-> 31 +52 <-> 33 53 <-> 34 55 <-> 36 56 <-> 39 57 <-> 39 Not mapped: 25 -28 32 35 -52