From f735cbc7eac13452c8833bd13a060970d7c97163 Mon Sep 17 00:00:00 2001 From: Stiver Date: Wed, 1 Oct 2014 07:00:11 +0200 Subject: Started work on mapping bytecode instructions to source code lines --- .../main/collectors/BytecodeMappingTracer.java | 26 ++++++++ .../main/collectors/BytecodeSourceMapper.java | 75 ++++++++++++++++++++++ 2 files changed, 101 insertions(+) create mode 100644 src/org/jetbrains/java/decompiler/main/collectors/BytecodeMappingTracer.java create mode 100644 src/org/jetbrains/java/decompiler/main/collectors/BytecodeSourceMapper.java (limited to 'src/org/jetbrains/java/decompiler/main/collectors') diff --git a/src/org/jetbrains/java/decompiler/main/collectors/BytecodeMappingTracer.java b/src/org/jetbrains/java/decompiler/main/collectors/BytecodeMappingTracer.java new file mode 100644 index 0000000..2b60f7e --- /dev/null +++ b/src/org/jetbrains/java/decompiler/main/collectors/BytecodeMappingTracer.java @@ -0,0 +1,26 @@ +package org.jetbrains.java.decompiler.main.collectors; + +import java.util.HashMap; + +public class BytecodeMappingTracer { + + private int current_sourceline; + + // bytecode offset, source line + private HashMap mapping; + + public void incrementSourceLine() { + current_sourceline++; + } + + public void addMapping(int bytecode_offset) { + if(!mapping.containsKey(bytecode_offset)) { + mapping.put(bytecode_offset, current_sourceline); + } + } + + public HashMap getMapping() { + return mapping; + } + +} diff --git a/src/org/jetbrains/java/decompiler/main/collectors/BytecodeSourceMapper.java b/src/org/jetbrains/java/decompiler/main/collectors/BytecodeSourceMapper.java new file mode 100644 index 0000000..f94a85f --- /dev/null +++ b/src/org/jetbrains/java/decompiler/main/collectors/BytecodeSourceMapper.java @@ -0,0 +1,75 @@ +package org.jetbrains.java.decompiler.main.collectors; + +import java.util.HashMap; +import java.util.Map.Entry; + +import org.jetbrains.java.decompiler.main.DecompilerContext; +import org.jetbrains.java.decompiler.util.InterpreterUtil; + +public class BytecodeSourceMapper { + + private int offset_total; + + // class, method, bytecode offset, source line + private HashMap>> mapping; + + public void addMapping(String classname, String methodname, int bytecode_offset, int source_line) { + + HashMap> class_mapping = mapping.get(classname); + if(class_mapping == null) { + mapping.put(classname, class_mapping = new HashMap>()); + } + + HashMap method_mapping = class_mapping.get(methodname); + if(method_mapping == null) { + class_mapping.put(methodname, method_mapping = new HashMap()); + } + + // don't overwrite + if(!method_mapping.containsKey(bytecode_offset)) { + method_mapping.put(bytecode_offset, source_line); + } + } + + public void dumpMapping(StringBuilder buffer) { + + String lineSeparator = DecompilerContext.getNewLineSeparator(); + String indentstr1 = InterpreterUtil.getIndentString(1); + String indentstr2 = InterpreterUtil.getIndentString(2); + + + for(Entry>> class_entry : mapping.entrySet()) { + HashMap> class_mapping = class_entry.getValue(); + buffer.append("class " + class_entry.getKey() + "{" + lineSeparator); + + boolean is_first_method = true; + + for(Entry> method_entry : class_mapping.entrySet()) { + HashMap method_mapping = method_entry.getValue(); + + if(!is_first_method) { + buffer.append(lineSeparator); + } + buffer.append(indentstr1 + "method " + method_entry.getKey() + "{" + lineSeparator); + + for(Entry line : method_mapping.entrySet()) { + buffer.append(indentstr2 + line.getKey() + indentstr2 + line.getValue() + lineSeparator); + } + buffer.append(indentstr1 + "}" + lineSeparator); + is_first_method = false; + } + buffer.append("}" + lineSeparator); + } + } + + public int getTotalOffset() { + return offset_total; + } + + public void setTotalOffset(int offset_total) { + this.offset_total = offset_total; + } + + + +} -- cgit v1.2.3