Add support for framenodes
This commit is contained in:
parent
34991f9b7e
commit
f936af84da
3 changed files with 52 additions and 16 deletions
|
@ -39,13 +39,13 @@ public class ClassNodeDecompiler extends Decompiler {
|
||||||
|
|
||||||
public String decompileClassNode(ClassNode cn, byte[] b) {
|
public String decompileClassNode(ClassNode cn, byte[] b) {
|
||||||
return decompile(new PrefixedStringBuilder(),
|
return decompile(new PrefixedStringBuilder(),
|
||||||
new ArrayList<String>(), cn).toString();
|
new ArrayList<>(), cn).toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static PrefixedStringBuilder decompile(
|
protected static PrefixedStringBuilder decompile(
|
||||||
PrefixedStringBuilder sb, ArrayList<String> decompiledClasses,
|
PrefixedStringBuilder sb, ArrayList<String> decompiledClasses,
|
||||||
ClassNode cn) {
|
ClassNode cn) {
|
||||||
ArrayList<String> unableToDecompile = new ArrayList<String>();
|
ArrayList<String> unableToDecompile = new ArrayList<>();
|
||||||
decompiledClasses.add(cn.name);
|
decompiledClasses.add(cn.name);
|
||||||
sb.append(getAccessString(cn.access));
|
sb.append(getAccessString(cn.access));
|
||||||
sb.append(" ");
|
sb.append(" ");
|
||||||
|
@ -59,9 +59,6 @@ public class ClassNodeDecompiler extends Decompiler {
|
||||||
if (amountOfInterfaces > 0) {
|
if (amountOfInterfaces > 0) {
|
||||||
sb.append(" implements ");
|
sb.append(" implements ");
|
||||||
sb.append(cn.interfaces.get(0));
|
sb.append(cn.interfaces.get(0));
|
||||||
if (amountOfInterfaces > 1) {
|
|
||||||
// sb.append(",");
|
|
||||||
}
|
|
||||||
for (int i = 1; i < amountOfInterfaces; i++) {
|
for (int i = 1; i < amountOfInterfaces; i++) {
|
||||||
sb.append(", ");
|
sb.append(", ");
|
||||||
sb.append(cn.interfaces.get(i));
|
sb.append(cn.interfaces.get(i));
|
||||||
|
@ -69,7 +66,7 @@ public class ClassNodeDecompiler extends Decompiler {
|
||||||
}
|
}
|
||||||
sb.append(" {");
|
sb.append(" {");
|
||||||
sb.append(BytecodeViewer.nl);
|
sb.append(BytecodeViewer.nl);
|
||||||
for (FieldNode fn : (List<FieldNode>) cn.fields) {
|
for (FieldNode fn : cn.fields) {
|
||||||
sb.append(BytecodeViewer.nl);
|
sb.append(BytecodeViewer.nl);
|
||||||
sb.append(" ");
|
sb.append(" ");
|
||||||
FieldNodeDecompiler.decompile(sb, fn);
|
FieldNodeDecompiler.decompile(sb, fn);
|
||||||
|
@ -77,7 +74,7 @@ public class ClassNodeDecompiler extends Decompiler {
|
||||||
if (cn.fields.size() > 0) {
|
if (cn.fields.size() > 0) {
|
||||||
sb.append(BytecodeViewer.nl);
|
sb.append(BytecodeViewer.nl);
|
||||||
}
|
}
|
||||||
for (MethodNode mn : (List<MethodNode>) cn.methods) {
|
for (MethodNode mn : cn.methods) {
|
||||||
sb.append(BytecodeViewer.nl);
|
sb.append(BytecodeViewer.nl);
|
||||||
MethodNodeDecompiler.decompile(sb, mn, cn);
|
MethodNodeDecompiler.decompile(sb, mn, cn);
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,6 +31,7 @@ import org.objectweb.asm.tree.TableSwitchInsnNode;
|
||||||
import org.objectweb.asm.tree.TypeInsnNode;
|
import org.objectweb.asm.tree.TypeInsnNode;
|
||||||
import org.objectweb.asm.tree.VarInsnNode;
|
import org.objectweb.asm.tree.VarInsnNode;
|
||||||
|
|
||||||
|
import org.objectweb.asm.tree.analysis.Frame;
|
||||||
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||||
import eu.bibl.banalysis.asm.desc.OpcodeInfo;
|
import eu.bibl.banalysis.asm.desc.OpcodeInfo;
|
||||||
|
|
||||||
|
@ -61,12 +62,12 @@ public class InstructionPrinter {
|
||||||
/**
|
/**
|
||||||
* The MethodNode to print
|
* The MethodNode to print
|
||||||
**/
|
**/
|
||||||
protected MethodNode mNode;
|
private MethodNode mNode;
|
||||||
private TypeAndName[] args;
|
private TypeAndName[] args;
|
||||||
|
|
||||||
protected int[] pattern;
|
protected int[] pattern;
|
||||||
protected boolean match;
|
protected boolean match;
|
||||||
protected InstructionSearcher searcher;
|
private InstructionSearcher searcher;
|
||||||
|
|
||||||
protected List<AbstractInsnNode> matchedInsns;
|
protected List<AbstractInsnNode> matchedInsns;
|
||||||
protected Map<LabelNode, Integer> labels;
|
protected Map<LabelNode, Integer> labels;
|
||||||
|
@ -140,7 +141,7 @@ public class InstructionPrinter {
|
||||||
} else if (ain instanceof TypeInsnNode) {
|
} else if (ain instanceof TypeInsnNode) {
|
||||||
line = printTypeInsnNode((TypeInsnNode) ain);
|
line = printTypeInsnNode((TypeInsnNode) ain);
|
||||||
} else if (ain instanceof FrameNode) {
|
} else if (ain instanceof FrameNode) {
|
||||||
line = "";
|
line = printFrameNode((FrameNode) ain);
|
||||||
} else if (ain instanceof IincInsnNode) {
|
} else if (ain instanceof IincInsnNode) {
|
||||||
line = printIincInsnNode((IincInsnNode) ain);
|
line = printIincInsnNode((IincInsnNode) ain);
|
||||||
} else if (ain instanceof TableSwitchInsnNode) {
|
} else if (ain instanceof TableSwitchInsnNode) {
|
||||||
|
@ -200,8 +201,8 @@ public class InstructionPrinter {
|
||||||
|
|
||||||
protected String printMethodInsnNode(MethodInsnNode min, ListIterator<?> it) {
|
protected String printMethodInsnNode(MethodInsnNode min, ListIterator<?> it) {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
sb.append(nameOpcode(min.opcode()) + " " + min.owner + " "
|
sb.append(nameOpcode(min.opcode()) + " " + min.owner + "."
|
||||||
+ min.name + "(");
|
+ min.name);
|
||||||
|
|
||||||
String desc = min.desc;
|
String desc = min.desc;
|
||||||
try {
|
try {
|
||||||
|
@ -216,8 +217,6 @@ public class InstructionPrinter {
|
||||||
|
|
||||||
sb.append(desc);
|
sb.append(desc);
|
||||||
|
|
||||||
sb.append(");");
|
|
||||||
|
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -325,6 +324,47 @@ public class InstructionPrinter {
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String printFrameNode(FrameNode frame) {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
sb.append(nameOpcode(frame.opcode()) + " ");
|
||||||
|
|
||||||
|
sb.append("(Locals: ");
|
||||||
|
if (frame.local != null
|
||||||
|
&& frame.local.size() > 0) {
|
||||||
|
sb.append(frame.local.size());
|
||||||
|
sb.append(" ");
|
||||||
|
sb.append(frame.local.get(0).toString());
|
||||||
|
if (frame.local.size() > 1) {
|
||||||
|
for (int i = 1; i < frame.local.size(); i++) {
|
||||||
|
sb.append(", ");
|
||||||
|
sb.append(frame.local.get(i).toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
sb.append("0, null");
|
||||||
|
}
|
||||||
|
sb.append(") ");
|
||||||
|
|
||||||
|
sb.append("(Stack: ");
|
||||||
|
if (frame.stack != null
|
||||||
|
&& frame.stack.size() > 0) {
|
||||||
|
sb.append(frame.stack.size());
|
||||||
|
sb.append(" ");
|
||||||
|
sb.append(frame.stack.get(0).toString());
|
||||||
|
if (frame.stack.size() > 1) {
|
||||||
|
for (int i = 1; i < frame.stack.size(); i++) {
|
||||||
|
sb.append(", ");
|
||||||
|
sb.append(frame.stack.get(i).toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
sb.append("0, null");
|
||||||
|
}
|
||||||
|
sb.append(")");
|
||||||
|
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
protected String nameOpcode(int opcode) {
|
protected String nameOpcode(int opcode) {
|
||||||
return " " + OpcodeInfo.OPCODES.get(opcode).toLowerCase();
|
return " " + OpcodeInfo.OPCODES.get(opcode).toLowerCase();
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,11 +40,10 @@ import the.bytecode.club.bytecodeviewer.decompilers.bytecode.TypeAndName;
|
||||||
|
|
||||||
public class MethodNodeDecompiler {
|
public class MethodNodeDecompiler {
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
public static PrefixedStringBuilder decompile(PrefixedStringBuilder sb,
|
public static PrefixedStringBuilder decompile(PrefixedStringBuilder sb,
|
||||||
MethodNode m, ClassNode cn) {
|
MethodNode m, ClassNode cn) {
|
||||||
String package_ = null;
|
String package_ = null;
|
||||||
String class_ = null;
|
String class_;
|
||||||
if (cn.name.contains("/")) {
|
if (cn.name.contains("/")) {
|
||||||
package_ = cn.name.substring(0, cn.name.lastIndexOf("/"));
|
package_ = cn.name.substring(0, cn.name.lastIndexOf("/"));
|
||||||
class_ = cn.name.substring(cn.name.lastIndexOf("/") + 1);
|
class_ = cn.name.substring(cn.name.lastIndexOf("/") + 1);
|
||||||
|
|
Loading…
Reference in a new issue