java-decompiler: code attributes reading restored

This commit is contained in:
Roman Shevchenko 2014-09-04 19:02:10 +04:00
parent 686b5abef9
commit 4e79d160ca
5 changed files with 49 additions and 6 deletions

View File

@ -18,7 +18,6 @@ package org.jetbrains.java.decompiler.struct;
import org.jetbrains.java.decompiler.code.*; import org.jetbrains.java.decompiler.code.*;
import org.jetbrains.java.decompiler.struct.attr.StructGeneralAttribute; import org.jetbrains.java.decompiler.struct.attr.StructGeneralAttribute;
import org.jetbrains.java.decompiler.struct.consts.ConstantPool; 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.DataInputFullStream;
import org.jetbrains.java.decompiler.util.VBStyleCollection; import org.jetbrains.java.decompiler.util.VBStyleCollection;
@ -55,7 +54,7 @@ public class StructMethod extends StructMember {
private int codeFullLength = 0; private int codeFullLength = 0;
private InstructionSequence seq; private InstructionSequence seq;
private boolean expanded = false; private boolean expanded = false;
private VBStyleCollection<StructGeneralAttribute, String> codeAttributes;
public StructMethod(DataInputFullStream in, StructClass clStruct) throws IOException { public StructMethod(DataInputFullStream in, StructClass clStruct) throws IOException {
classStruct = clStruct; classStruct = clStruct;
@ -70,6 +69,10 @@ public class StructMethod extends StructMember {
descriptor = values[1]; descriptor = values[1];
attributes = readAttributes(in, pool); attributes = readAttributes(in, pool);
if (codeAttributes != null) {
attributes.addAllWithKey(codeAttributes);
codeAttributes = null;
}
} }
@Override @Override
@ -87,12 +90,12 @@ public class StructMethod extends StructMember {
localVariables = in.readUnsignedShort(); localVariables = in.readUnsignedShort();
codeLength = in.readInt(); codeLength = in.readInt();
in.discard(codeLength); in.discard(codeLength);
int exc_length = in.readUnsignedShort(); int excLength = in.readUnsignedShort();
in.discard(exc_length * 8); in.discard(excLength * 8);
codeFullLength = codeLength + exc_length * 8 + 2; codeFullLength = codeLength + excLength * 8 + 2;
} }
LazyLoader.skipAttributes(in); codeAttributes = readAttributes(in, pool);
return null; return null;
} }
@ -115,6 +118,7 @@ public class StructMethod extends StructMember {
} }
} }
@SuppressWarnings("AssignmentToForLoopParameter")
private InstructionSequence parseBytecode(DataInputFullStream in, int length, ConstantPool pool) throws IOException { private InstructionSequence parseBytecode(DataInputFullStream in, int length, ConstantPool pool) throws IOException {
VBStyleCollection<Instruction, Integer> instructions = new VBStyleCollection<Instruction, Integer>(); VBStyleCollection<Instruction, Integer> instructions = new VBStyleCollection<Instruction, Integer>();

View File

@ -73,6 +73,7 @@ public class SingleClassesTest {
@Test public void testCodeConstructs() { doTest("TestCodeConstructs"); } @Test public void testCodeConstructs() { doTest("TestCodeConstructs"); }
@Test public void testConstants() { doTest("TestConstants"); } @Test public void testConstants() { doTest("TestConstants"); }
@Test public void testEnum() { doTest("TestEnum"); } @Test public void testEnum() { doTest("TestEnum"); }
@Test public void testDebugSymbols() { doTest("TestDebugSymbols"); }
private void doTest(final String testName) { private void doTest(final String testName) {
try { try {

Binary file not shown.

View File

@ -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();
}
}

View File

@ -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();
}
}