diff options
author | Egor Ushakov <egor.ushakov@jetbrains.com> | 2014-10-05 16:28:44 +0400 |
---|---|---|
committer | Egor Ushakov <egor.ushakov@jetbrains.com> | 2014-10-05 17:12:17 +0400 |
commit | 0c8508ff8a38669fa325b5a99da89dd9027951cc (patch) | |
tree | f89117d78ae0960f8fd62808e7bdcad39aa8831b /src | |
parent | 512a08c13eabcc1d0e6467ee2ba8bf9803f165eb (diff) | |
download | fernflower-0c8508ff8a38669fa325b5a99da89dd9027951cc.tar fernflower-0c8508ff8a38669fa325b5a99da89dd9027951cc.tar.gz fernflower-0c8508ff8a38669fa325b5a99da89dd9027951cc.tar.lz fernflower-0c8508ff8a38669fa325b5a99da89dd9027951cc.tar.xz fernflower-0c8508ff8a38669fa325b5a99da89dd9027951cc.zip |
decompiler: support line number table attribute
Diffstat (limited to 'src')
-rw-r--r-- | src/org/jetbrains/java/decompiler/struct/attr/StructGeneralAttribute.java | 4 | ||||
-rw-r--r-- | src/org/jetbrains/java/decompiler/struct/attr/StructLineNumberTableAttribute.java | 69 |
2 files changed, 73 insertions, 0 deletions
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<Pair<Integer, Integer>> myLineInfo = Collections.emptyList(); + + @Override + public void initContent(ConstantPool pool) throws IOException { + DataInputFullStream data = stream(); + + int len = data.readUnsignedShort(); + if (len > 0) { + myLineInfo = new ArrayList<Pair<Integer, Integer>>(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<Integer, Integer> pair : myLineInfo) { + if (pc >= pair.getFirst()) { + return pair.getSecond(); + } + } + return -1; + } +} |