From 4e79d160ca382125d76bab3f1d18414d6308d614 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Thu, 4 Sep 2014 19:02:10 +0400 Subject: [PATCH] java-decompiler: code attributes reading restored --- .../java/decompiler/struct/StructMethod.java | 16 +++++++---- .../java/decompiler/SingleClassesTest.java | 1 + testData/classes/pkg/TestDebugSymbols.class | Bin 0 -> 878 bytes testData/results/TestDebugSymbols.dec | 11 +++++++ testData/src/pkg/TestDebugSymbols.java | 27 ++++++++++++++++++ 5 files changed, 49 insertions(+), 6 deletions(-) create mode 100644 testData/classes/pkg/TestDebugSymbols.class create mode 100644 testData/results/TestDebugSymbols.dec create mode 100644 testData/src/pkg/TestDebugSymbols.java diff --git a/src/org/jetbrains/java/decompiler/struct/StructMethod.java b/src/org/jetbrains/java/decompiler/struct/StructMethod.java index b055df6..3ca4a32 100644 --- a/src/org/jetbrains/java/decompiler/struct/StructMethod.java +++ b/src/org/jetbrains/java/decompiler/struct/StructMethod.java @@ -18,7 +18,6 @@ package org.jetbrains.java.decompiler.struct; import org.jetbrains.java.decompiler.code.*; import org.jetbrains.java.decompiler.struct.attr.StructGeneralAttribute; import org.jetbrains.java.decompiler.struct.consts.ConstantPool; -import org.jetbrains.java.decompiler.struct.lazy.LazyLoader; import org.jetbrains.java.decompiler.util.DataInputFullStream; import org.jetbrains.java.decompiler.util.VBStyleCollection; @@ -55,7 +54,7 @@ public class StructMethod extends StructMember { private int codeFullLength = 0; private InstructionSequence seq; private boolean expanded = false; - + private VBStyleCollection codeAttributes; public StructMethod(DataInputFullStream in, StructClass clStruct) throws IOException { classStruct = clStruct; @@ -70,6 +69,10 @@ public class StructMethod extends StructMember { descriptor = values[1]; attributes = readAttributes(in, pool); + if (codeAttributes != null) { + attributes.addAllWithKey(codeAttributes); + codeAttributes = null; + } } @Override @@ -87,12 +90,12 @@ public class StructMethod extends StructMember { localVariables = in.readUnsignedShort(); codeLength = in.readInt(); in.discard(codeLength); - int exc_length = in.readUnsignedShort(); - in.discard(exc_length * 8); - codeFullLength = codeLength + exc_length * 8 + 2; + int excLength = in.readUnsignedShort(); + in.discard(excLength * 8); + codeFullLength = codeLength + excLength * 8 + 2; } - LazyLoader.skipAttributes(in); + codeAttributes = readAttributes(in, pool); return null; } @@ -115,6 +118,7 @@ public class StructMethod extends StructMember { } } + @SuppressWarnings("AssignmentToForLoopParameter") private InstructionSequence parseBytecode(DataInputFullStream in, int length, ConstantPool pool) throws IOException { VBStyleCollection instructions = new VBStyleCollection(); diff --git a/test/org/jetbrains/java/decompiler/SingleClassesTest.java b/test/org/jetbrains/java/decompiler/SingleClassesTest.java index 9300d78..97ad079 100644 --- a/test/org/jetbrains/java/decompiler/SingleClassesTest.java +++ b/test/org/jetbrains/java/decompiler/SingleClassesTest.java @@ -73,6 +73,7 @@ public class SingleClassesTest { @Test public void testCodeConstructs() { doTest("TestCodeConstructs"); } @Test public void testConstants() { doTest("TestConstants"); } @Test public void testEnum() { doTest("TestEnum"); } + @Test public void testDebugSymbols() { doTest("TestDebugSymbols"); } private void doTest(final String testName) { try { diff --git a/testData/classes/pkg/TestDebugSymbols.class b/testData/classes/pkg/TestDebugSymbols.class new file mode 100644 index 0000000000000000000000000000000000000000..102e09b778b134d9d73a2a9933f767feb5de3c97 GIT binary patch literal 878 zcmaJ=%Wl&^6g|^8c4FMLm^5iifdB=Zl-4{#X?aP3C=yi!i&T|ZI`PPLaO}vj5qts* zeuEVoHm(E`AHYW;?o5L~4a!J9b6<1rJ)`l@U*CQJXkuT-GByiX&yy=wLuu6j4L5YC z*c5QHfLmg>1k?pI1Z?TJjcpA(8f*sji68pOGlra1KVnc`L@sAo>iQvnm5%y6K6Ls4 zMa*tAaDpQz_JuzUD#@`wVW@P+Z$0~vPm(t8r(W;Fs2>HB#|&&Fd0!H5!rv!?W$3(f z?7#^))>nF6UDInm-Tgj$OoiK zb;e^J(tO+2tiJk8XgUTd->?qmr#ti0?Rn`!5}jT#NwH=Nsr^4v{#2>~5543VH7wEl z5^I4zx=t`$Aj_tm(VlOdfPIzeGNCGi3RcKAP76>$RpwW*MiFuNGjjAmfwsBOEhE>e zeKhmop0Zd~hM)HH-=V%afwq;QU=|5#8FXn>l?>;kwVKahWLV5l`XaeS?+U~(ph|8H x1(Z;vIdnNoQ|8*!S#oG$9T#aD4NtLwOC+v@U0lW$h}mtDeU(lyT$AkAe*<4)w}}7% literal 0 HcmV?d00001 diff --git a/testData/results/TestDebugSymbols.dec b/testData/results/TestDebugSymbols.dec new file mode 100644 index 0000000..42ae7a8 --- /dev/null +++ b/testData/results/TestDebugSymbols.dec @@ -0,0 +1,11 @@ +package pkg; + +class TestDebugSymbols { + private int m() { + String text = "text"; + long prolonged = 42L; + float decimated = (float)prolonged / 10.0F; + double doubled = (double)(2.0F * decimated); + return (text + ":" + prolonged + ":" + decimated + ":" + doubled).length(); + } +} diff --git a/testData/src/pkg/TestDebugSymbols.java b/testData/src/pkg/TestDebugSymbols.java new file mode 100644 index 0000000..1673510 --- /dev/null +++ b/testData/src/pkg/TestDebugSymbols.java @@ -0,0 +1,27 @@ +/* + * Copyright 2000-2014 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package pkg; + +// need to be compiled with debug info +class TestDebugSymbols { + private int m() { + String text = "text"; + long prolonged = 42L; + float decimated = prolonged / 10.0f; + double doubled = 2 * decimated; + return (text + ":" + prolonged + ":" + decimated + ":" + doubled).length(); + } +}