From 0bcd7fba5c3dd17ca901245adccaff3835a7d6ec Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Mon, 20 Oct 2014 18:06:14 +0400 Subject: [PATCH] decompiler: fixed line mapping for try-catch and nested classes --- .../java/decompiler/main/ClassWriter.java | 7 +- .../decompiler/main/ClassesProcessor.java | 1 + .../decompiler/stats/CatchStatement.java | 1 - ...lassSimpleBytecodeMapping$InnerClass.class | Bin 0 -> 647 bytes ...assSimpleBytecodeMapping$InnerClass2.class | Bin 0 -> 650 bytes .../pkg/TestClassSimpleBytecodeMapping.class | Bin 838 -> 1234 bytes .../TestClassSimpleBytecodeMapping.dec | 80 ++++++++++++++---- .../pkg/TestClassSimpleBytecodeMapping.java | 22 +++++ 8 files changed, 92 insertions(+), 19 deletions(-) create mode 100644 testData/classes/pkg/TestClassSimpleBytecodeMapping$InnerClass.class create mode 100644 testData/classes/pkg/TestClassSimpleBytecodeMapping$InnerClass2.class diff --git a/src/org/jetbrains/java/decompiler/main/ClassWriter.java b/src/org/jetbrains/java/decompiler/main/ClassWriter.java index 0bdd8a8..ad6a952 100644 --- a/src/org/jetbrains/java/decompiler/main/ClassWriter.java +++ b/src/org/jetbrains/java/decompiler/main/ClassWriter.java @@ -254,8 +254,11 @@ public class ClassWriter { if (hasContent) { buffer.appendLineSeparator(); + startLine++; } - classToJava(inner, buffer, indent + 1, tracer); + BytecodeMappingTracer class_tracer = new BytecodeMappingTracer(startLine); + classToJava(inner, buffer, indent + 1, class_tracer); + startLine = buffer.countLines(); hasContent = true; } @@ -840,7 +843,7 @@ public class ClassWriter { // save total lines // TODO: optimize - tracer.setCurrentSourceLine(buffer.countLines(start_index_method)); + //tracer.setCurrentSourceLine(buffer.countLines(start_index_method)); return !hideMethod; } diff --git a/src/org/jetbrains/java/decompiler/main/ClassesProcessor.java b/src/org/jetbrains/java/decompiler/main/ClassesProcessor.java index 66cfa63..20d6942 100644 --- a/src/org/jetbrains/java/decompiler/main/ClassesProcessor.java +++ b/src/org/jetbrains/java/decompiler/main/ClassesProcessor.java @@ -280,6 +280,7 @@ public class ClassesProcessor { } //buffer.append(lineSeparator); + total_offset_lines = buffer.countLines(); buffer.append(classBuffer); if (DecompilerContext.getOption(IFernflowerPreferences.BYTECODE_SOURCE_MAPPING)) { 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 1cddbbc..f6287c2 100644 --- a/src/org/jetbrains/java/decompiler/modules/decompiler/stats/CatchStatement.java +++ b/src/org/jetbrains/java/decompiler/modules/decompiler/stats/CatchStatement.java @@ -187,7 +187,6 @@ public class CatchStatement extends Statement { tracer.incrementCurrentSourceLine(); buf.append(ExprProcessor.jmpWrapper(stats.get(i), indent + 1, true, tracer)).append(indstr) .append("}"); - tracer.incrementCurrentSourceLine(); } buf.append(new_line_separator); diff --git a/testData/classes/pkg/TestClassSimpleBytecodeMapping$InnerClass.class b/testData/classes/pkg/TestClassSimpleBytecodeMapping$InnerClass.class new file mode 100644 index 0000000000000000000000000000000000000000..bd3481b595d2962323804b5798c3af2f8536d2af GIT binary patch literal 647 zcma)3%TB^j5IvVyX{}O0e7}GaD@5zUoyLVECMNhuAnps^;KjByZ871qG*J^5et;ik zoK_Q97;!UmXXc!lIdeZg-`)WnqADYUyaEXY84D<8v8Z4P%Mw;4Y%pZPI}zvy40_YM z@0o2LgbmvYf|hVRo1czC-W}ZX3(NC_+dCrsv2aCr!mwlfhp>CYkZMo|hFnv){Br1Y zxZk!qHf7SDFWitJX+$ukH5mF`ekP()Nwy5gBHy-ZOiSMSDilZ(()6j)+h+MLwW{7DioVBSPabT zNM@+5qR*D--SP+DIffV1B34OEfij7NdBm_NyR;ebTC@COuMIFbo#tY`+sX0W6$RUk~AFAMXnWs z#ZbQtlp4Ov%>kL1{iV$yhjv&t@hYFha0;;k>jR4l)0H4k|1HzkvvfM}hfWg6TqG%K zR28U}D67@oN3iNMr27Dk8H#brK%L?&QeXIT$On`ML^9DQ#3pbxe5gTV_UV)+s)RYL NQC5i@$1+yIJ^&h?oT2~# literal 0 HcmV?d00001 diff --git a/testData/classes/pkg/TestClassSimpleBytecodeMapping.class b/testData/classes/pkg/TestClassSimpleBytecodeMapping.class index 4e4f8fbe16f8cdbe2322c0edac4f018a2fe316ce..010c748a4b0e901939b82ec4ac0a9fd151508f08 100644 GIT binary patch literal 1234 zcmb7D%Tg0T6g`~>9VSD7KmbuhlK@Ew1Q787zIaI#&@vR3%SmWsAep2l6HC6tom)3- zaDk{*et;ikd1i<;vQWxd^zFWV?m74Nz4PPe*Y5!4@l-=E#yT;Mi4am6(#S|mY6v2$ zp$AhTOglEGVFt4y%xSoRd5N12av_XcxGix<;;zJ^Ksaxj%37%!&E}kd?wwRqVo5;r zJOUj{6|-XB7x1Ujy8?lg`koT#-mI8vyHzVHYsV;7=?U1XX}hSrKv%&wN(Wm;qkS24 zE~ynuZSEUyja=0*%ejJWRm}2YdY5@J&}x|igMR{Ev`o_>Cxl5A>Mg6J)+>%!VuyTg z0fkDfQB})_wkk0(DmKVD?TF|Y#E`^29ry8obrjX>x}_u@>Ue}vfn?*LoclLVa@HYP z)^Qzi0m0K%j7qHNSj8G0GZO1M9%DnG&#Pn-{0xb~WOayJgsK*e1&`_v%gtsr0HquXmp}ZBF$vf;O1>3~|hjz%bVi*BRn^8CSSE(54#-EPR45 z>OVms^9{jQjO#do%tS*c=sblMdH(@j4kAp1|H#?#CJ;CxgU{uTBgDPVHG+P`=o>_w z31z5~rQSRhM~Lu4WGT&IY$vcy0zWT$Cr_cj{D|-t*|R5z923A2$k^4^7~lzH4PuPm z1UixA1B|=8621+IYmxv?e49H#>!U|benGc@_Y#`x&hbTNxJwY?BUeA|Fq4UrwU41O K+5uWemESM=G7i1~ delta 423 zcmYL^OHKko6h%)ppK99XBO>?(gythCilPIjPSj|kaRr({Vq!3X1?Uz?51hFI2I|1y zz@Y<8jB)G^+=KCT$HX_d_tvfVUfuePyoC2&f1aL!7V8#KrXox;V=`-zC8x<-gqX9i zDOeP7OiCu@5h_$Q^O~B%-tKnWz0K33e!o4q*cyBv=HetYb(;ki72)G{=d9P(G;Eew zRygjvDmYHlCXPUwjAq4Vm6k%uy=rRKJU`*SsSUSd91K3vAw{LS>rJ{}M#s0_Hn-YSfa+(!Z!lBwd>PCbjDH!%mQ*exwpx1gr(07;J>p<%K0W)@aMf4UU8Mz}E z7<$SQ6&y;l;jhV}McbIfWX(7;64N0=nMoQ 0.0D) { System.out.println("0"); return 0; @@ -17,9 +18,30 @@ public class TestClassSimpleBytecodeMapping { } } + public void test2(String var1) { + try { + Integer.parseInt(var1); + } catch (Exception var3) { + System.out.println(var3); + } + + } + void run(Runnable var1) { var1.run(); } + + public class InnerClass2 { + public void print() { + System.out.println("Inner2"); + } + } + + public class InnerClass { + public void print() { + System.out.println("Inner"); + } + } } class 'pkg/TestClassSimpleBytecodeMapping$1' { @@ -36,24 +58,46 @@ class 'pkg/TestClassSimpleBytecodeMapping' { 3 4 5 4 11 5 - 14 10 + 15 10 17 10 - 18 10 - 19 10 - 1c 11 + 1a 11 + 1d 11 + 1e 11 1f 11 - 21 11 - 24 12 + 22 12 25 12 - 26 14 - 29 14 - 2b 14 - 2e 15 + 27 12 + 2a 13 + 2b 13 + 2c 15 2f 15 + 31 15 + 34 16 + 35 16 + } + + method 'test2 (Ljava/lang/String;)V' { + 1 22 } method 'run (Ljava/lang/Runnable;)V' { - 1 20 + 1 30 + } +} + +class 'pkg/TestClassSimpleBytecodeMapping$InnerClass2' { + method 'print ()V' { + 0 35 + 3 35 + 5 35 + } +} + +class 'pkg/TestClassSimpleBytecodeMapping$InnerClass' { + method 'print ()V' { + 0 41 + 3 41 + 5 41 } } @@ -62,8 +106,12 @@ Lines mapping: 14 <-> 6 17 <-> 8 21 <-> 11 -22 <-> 12 -23 <-> 13 -25 <-> 15 -26 <-> 16 -31 <-> 21 +23 <-> 12 +24 <-> 13 +25 <-> 14 +27 <-> 16 +28 <-> 17 +34 <-> 23 +42 <-> 42 +47 <-> 31 +52 <-> 36 diff --git a/testData/src/pkg/TestClassSimpleBytecodeMapping.java b/testData/src/pkg/TestClassSimpleBytecodeMapping.java index 0e9ecc2..bc07e46 100644 --- a/testData/src/pkg/TestClassSimpleBytecodeMapping.java +++ b/testData/src/pkg/TestClassSimpleBytecodeMapping.java @@ -18,6 +18,8 @@ public class TestClassSimpleBytecodeMapping { } }); + test2("1"); + if(Math.random() > 0) { System.out.println("0"); return 0; @@ -27,7 +29,27 @@ public class TestClassSimpleBytecodeMapping { } } + public void test2(String a) { + try { + Integer.parseInt(a); + } catch (Exception e) { + System.out.println(e); + } + } + + public class InnerClass { + public void print() { + System.out.println("Inner"); + } + } + void run(Runnable r) { r.run(); } + + public class InnerClass2 { + public void print() { + System.out.println("Inner2"); + } + } }