summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoman Shevchenko <roman.shevchenko@jetbrains.com>2014-09-04 19:02:10 +0400
committerRoman Shevchenko <roman.shevchenko@jetbrains.com>2014-09-04 19:02:10 +0400
commit4e79d160ca382125d76bab3f1d18414d6308d614 (patch)
treeb0103e396373c3cb347ce5265411e03b325493e5
parent686b5abef9c269a726897c6992d0ea2abea79b04 (diff)
downloadfernflower-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.java16
-rw-r--r--test/org/jetbrains/java/decompiler/SingleClassesTest.java1
-rw-r--r--testData/classes/pkg/TestDebugSymbols.classbin0 -> 878 bytes
-rw-r--r--testData/results/TestDebugSymbols.dec11
-rw-r--r--testData/src/pkg/TestDebugSymbols.java27
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
new file mode 100644
index 0000000..102e09b
--- /dev/null
+++ b/testData/classes/pkg/TestDebugSymbols.class
Binary files 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();
+ }
+}