From 4e79d160ca382125d76bab3f1d18414d6308d614 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Thu, 4 Sep 2014 19:02:10 +0400 Subject: 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 0000000..102e09b Binary files /dev/null and b/testData/classes/pkg/TestDebugSymbols.class differ 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(); + } +} -- cgit v1.2.3