summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEgor Ushakov <egor.ushakov@jetbrains.com>2014-10-05 16:28:44 +0400
committerEgor Ushakov <egor.ushakov@jetbrains.com>2014-10-05 17:12:17 +0400
commit0c8508ff8a38669fa325b5a99da89dd9027951cc (patch)
treef89117d78ae0960f8fd62808e7bdcad39aa8831b
parent512a08c13eabcc1d0e6467ee2ba8bf9803f165eb (diff)
downloadfernflower-0c8508ff8a38669fa325b5a99da89dd9027951cc.tar
fernflower-0c8508ff8a38669fa325b5a99da89dd9027951cc.tar.gz
fernflower-0c8508ff8a38669fa325b5a99da89dd9027951cc.tar.lz
fernflower-0c8508ff8a38669fa325b5a99da89dd9027951cc.tar.xz
fernflower-0c8508ff8a38669fa325b5a99da89dd9027951cc.zip
decompiler: support line number table attribute
-rw-r--r--src/org/jetbrains/java/decompiler/struct/attr/StructGeneralAttribute.java4
-rw-r--r--src/org/jetbrains/java/decompiler/struct/attr/StructLineNumberTableAttribute.java69
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;
+ }
+}