From 0c8508ff8a38669fa325b5a99da89dd9027951cc Mon Sep 17 00:00:00 2001 From: Egor Ushakov Date: Sun, 5 Oct 2014 16:28:44 +0400 Subject: decompiler: support line number table attribute --- .../struct/attr/StructGeneralAttribute.java | 4 ++ .../attr/StructLineNumberTableAttribute.java | 69 ++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 src/org/jetbrains/java/decompiler/struct/attr/StructLineNumberTableAttribute.java diff --git a/src/org/jetbrains/java/decompiler/struct/attr/StructGeneralAttribute.java b/src/org/jetbrains/java/decompiler/struct/attr/StructGeneralAttribute.java index 2cdc524..2069cee 100644 --- a/src/org/jetbrains/java/decompiler/struct/attr/StructGeneralAttribute.java +++ b/src/org/jetbrains/java/decompiler/struct/attr/StructGeneralAttribute.java @@ -46,6 +46,7 @@ public class StructGeneralAttribute { public static final String ATTRIBUTE_BOOTSTRAP_METHODS = "BootstrapMethods"; public static final String ATTRIBUTE_SYNTHETIC = "Synthetic"; public static final String ATTRIBUTE_DEPRECATED = "Deprecated"; + public static final String ATTRIBUTE_LINE_NUMBER_TABLE = "LineNumberTable"; private String name; private byte[] info; @@ -93,6 +94,9 @@ public class StructGeneralAttribute { ATTRIBUTE_DEPRECATED.equals(name)) { attr = new StructGeneralAttribute(); } + else if (ATTRIBUTE_LINE_NUMBER_TABLE.equals(name)) { + attr = new StructLineNumberTableAttribute(); + } else { // unsupported attribute return null; diff --git a/src/org/jetbrains/java/decompiler/struct/attr/StructLineNumberTableAttribute.java b/src/org/jetbrains/java/decompiler/struct/attr/StructLineNumberTableAttribute.java new file mode 100644 index 0000000..b246a1e --- /dev/null +++ b/src/org/jetbrains/java/decompiler/struct/attr/StructLineNumberTableAttribute.java @@ -0,0 +1,69 @@ +/* + * 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 org.jetbrains.java.decompiler.struct.attr; + +import com.intellij.openapi.util.Pair; +import org.jetbrains.java.decompiler.struct.consts.ConstantPool; +import org.jetbrains.java.decompiler.util.DataInputFullStream; + +import java.io.IOException; +import java.util.*; + +/** + * u2 line_number_table_length; + * { u2 start_pc; + * u2 line_number; + * } line_number_table[line_number_table_length]; + * + * Created by Egor on 05.10.2014. + */ +public class StructLineNumberTableAttribute extends StructGeneralAttribute { + private List> myLineInfo = Collections.emptyList(); + + @Override + public void initContent(ConstantPool pool) throws IOException { + DataInputFullStream data = stream(); + + int len = data.readUnsignedShort(); + if (len > 0) { + myLineInfo = new ArrayList>(len); + for (int i = 0; i < len; i++) { + int startPC = data.readUnsignedShort(); + int lineNumber = data.readUnsignedShort(); + myLineInfo.add(Pair.create(startPC, lineNumber)); + } + } + else { + myLineInfo = Collections.emptyList(); + } + } + + public int getFirstLine() { + if (!myLineInfo.isEmpty()) { + return myLineInfo.get(0).getSecond(); + } + return -1; + } + + public int findLineNumber(int pc) { + for (Pair pair : myLineInfo) { + if (pc >= pair.getFirst()) { + return pair.getSecond(); + } + } + return -1; + } +} -- cgit v1.2.3