diff options
author | Roman Shevchenko <roman.shevchenko@jetbrains.com> | 2014-09-04 19:02:10 +0400 |
---|---|---|
committer | Roman Shevchenko <roman.shevchenko@jetbrains.com> | 2014-09-04 19:02:10 +0400 |
commit | 4e79d160ca382125d76bab3f1d18414d6308d614 (patch) | |
tree | b0103e396373c3cb347ce5265411e03b325493e5 | |
parent | 686b5abef9c269a726897c6992d0ea2abea79b04 (diff) | |
download | fernflower-4e79d160ca382125d76bab3f1d18414d6308d614.tar fernflower-4e79d160ca382125d76bab3f1d18414d6308d614.tar.gz fernflower-4e79d160ca382125d76bab3f1d18414d6308d614.tar.lz fernflower-4e79d160ca382125d76bab3f1d18414d6308d614.tar.xz fernflower-4e79d160ca382125d76bab3f1d18414d6308d614.zip |
java-decompiler: code attributes reading restored
-rw-r--r-- | src/org/jetbrains/java/decompiler/struct/StructMethod.java | 16 | ||||
-rw-r--r-- | test/org/jetbrains/java/decompiler/SingleClassesTest.java | 1 | ||||
-rw-r--r-- | testData/classes/pkg/TestDebugSymbols.class | bin | 0 -> 878 bytes | |||
-rw-r--r-- | testData/results/TestDebugSymbols.dec | 11 | ||||
-rw-r--r-- | testData/src/pkg/TestDebugSymbols.java | 27 |
5 files changed, 49 insertions, 6 deletions
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<StructGeneralAttribute, String> 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<Instruction, Integer> instructions = new VBStyleCollection<Instruction, Integer>(); 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 Binary files differnew file mode 100644 index 0000000..102e09b --- /dev/null +++ b/testData/classes/pkg/TestDebugSymbols.class 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(); + } +} |