package com.navercorp.pinpoint.profiler.instrument; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.util.ASMifier; import org.objectweb.asm.util.CheckClassAdapter; import org.objectweb.asm.util.Printer; import org.objectweb.asm.util.Textifier; import org.objectweb.asm.util.TraceClassVisitor; import java.io.PrintWriter; import java.io.StringWriter; /** * @author Woonduk Kang(emeroad) */ public class ASMBytecodeDisassembler { private final int cwFlag; private final int crFlag; public ASMBytecodeDisassembler() { this(0, 0); } public ASMBytecodeDisassembler(int crFlag, int cwFlag) { this.cwFlag = cwFlag; this.crFlag = crFlag; } public String dumpBytecode(final byte[] bytecode) { if (bytecode == null) { throw new NullPointerException("bytecode must not be null"); } return writeBytecode(bytecode, new Textifier()); } public String dumpASM(byte[] bytecode) { if (bytecode == null) { throw new NullPointerException("bytecode must not be null"); } return writeBytecode(bytecode, new ASMifier()); } private String writeBytecode(byte[] bytecode, Printer printer) { final StringWriter out = new StringWriter(); final PrintWriter writer = new PrintWriter(out); accept(bytecode, printer, writer); return out.toString(); } private void accept(byte[] bytecode, Printer printer, PrintWriter writer) { final ClassReader cr = new ClassReader(bytecode); final ClassWriter cw = new ClassWriter(this.cwFlag); final TraceClassVisitor tcv = new TraceClassVisitor(cw, printer, writer); cr.accept(tcv, this.crFlag); } public String dumpVerify(byte[] bytecode, ClassLoader classLoader) { if (bytecode == null) { throw new NullPointerException("bytecode must not be null"); } if (classLoader == null) { throw new NullPointerException("classLoader must not be null"); } final StringWriter out = new StringWriter(); final PrintWriter writer = new PrintWriter(out); final ClassReader cr = new ClassReader(bytecode); CheckClassAdapter.verify(cr, classLoader, true, writer); return out.toString(); } }