Java 类org.objectweb.asm.util.TraceMethodVisitor 实例源码
项目:Matcher
文件:Analysis.java
private static void dump(Iterable<AbstractInsnNode> il) {
Textifier textifier = new Textifier();
MethodVisitor visitor = new TraceMethodVisitor(textifier);
for (Iterator<AbstractInsnNode> it = il.iterator(); it.hasNext(); ) {
AbstractInsnNode in = it.next();
in.accept(visitor);
}
StringWriter writer = new StringWriter();
try (PrintWriter pw = new PrintWriter(writer)) {
textifier.print(pw);
}
System.out.println(writer.toString());
}
项目:QDrill
文件:ValueHolderReplacementVisitor.java
@Override
public void visitEnd() {
try {
accept(inner);
super.visitEnd();
} catch(Exception e){
Textifier t = new Textifier();
accept(new TraceMethodVisitor(t));
StringBuilderWriter sw = new StringBuilderWriter();
PrintWriter pw = new PrintWriter(sw);
t.print(pw);
pw.flush();
String bytecode = sw.getBuilder().toString();
logger.error(String.format("Failure while rendering method %s, %s, %s. ByteCode:\n %s", name, desc, signature, bytecode), e);
throw new RuntimeException(String.format("Failure while rendering method %s, %s, %s. ByteCode:\n %s", name, desc, signature, bytecode), e);
}
}
项目:byte-cobweb
文件:Helper.java
/**
* 格式化输出字节码
* @param bytecode
*/
public static void viewByteCode(byte[] bytecode) {
ClassReader cr = new ClassReader(bytecode);
ClassNode cn = new ClassNode();
cr.accept(cn, 0);
final List<MethodNode> mns = cn.methods;
Printer printer = new Textifier();
TraceMethodVisitor mp = new TraceMethodVisitor(printer);
for (MethodNode mn : mns) {
InsnList inList = mn.instructions;
System.out.println(mn.name);
for (int i = 0; i < inList.size(); i++) {
inList.get(i).accept(mp);
StringWriter sw = new StringWriter();
printer.print(new PrintWriter(sw));
printer.getText().clear();
System.out.print(sw.toString());
}
}
}
项目:drill
文件:ValueHolderReplacementVisitor.java
@Override
public void visitEnd() {
try {
accept(inner);
super.visitEnd();
} catch(Exception e){
Textifier t = new Textifier();
accept(new TraceMethodVisitor(t));
StringBuilderWriter sw = new StringBuilderWriter();
PrintWriter pw = new PrintWriter(sw);
t.print(pw);
pw.flush();
String bytecode = sw.getBuilder().toString();
logger.error(String.format("Failure while rendering method %s, %s, %s. ByteCode:\n %s", name, desc, signature, bytecode), e);
throw new RuntimeException(String.format("Failure while rendering method %s, %s, %s. ByteCode:\n %s", name, desc, signature, bytecode), e);
}
}
项目:Patcher
文件:FindingVisitor.java
@Override
public void visitEnd() {
super.visitEnd();
if (!found && errorNoMatch) {
StringWriter output = new StringWriter();
PrintWriter writer = new PrintWriter(output);
writer.append("Cannot find nodes");
if (methods.size() > 0) {
writer.append(" for methods ").append(methods.toString());
}
writer.println();
Printer printer = new Textifier();
TraceMethodVisitor visitor = new TraceMethodVisitor(printer);
for (AbstractInsnNode node : nodes) {
node.accept(visitor);
}
printer.print(writer);
throw new IllegalStateException(output.toString());
}
}
项目:instrumentation
文件:Helper.java
public static void viewByteCode(byte[] bytecode) {
ClassReader cr = new ClassReader(bytecode);
ClassNode cn = new ClassNode();
cr.accept(cn, 0);
final List<MethodNode> mns = cn.methods;
Printer printer = new Textifier();
TraceMethodVisitor mp = new TraceMethodVisitor(printer);
for (MethodNode mn : mns) {
InsnList inList = mn.instructions;
System.out.println(mn.name);
for (int i = 0; i < inList.size(); i++) {
inList.get(i).accept(mp);
StringWriter sw = new StringWriter();
printer.print(new PrintWriter(sw));
printer.getText().clear();
System.out.print(sw.toString());
}
}
}
项目:closure-templates
文件:BytecodeProducer.java
/** Returns a human readable string for the code that this {@link BytecodeProducer} generates. */
public final String trace() {
// TODO(lukes): textifier has support for custom label names by overriding appendLabel.
// Consider trying to make use of (using the Label.info field? adding a custom NamedLabel
// sub type?)
Textifier textifier =
new Textifier(Opcodes.ASM6) {
{
// reset tab sizes. Since we don't care about formatting class names or method
// signatures (only code). We only need to set the tab2,tab3 and ltab settings (tab is
// for class members).
this.tab = null; // trigger an error if used.
this.tab2 = " "; // tab setting for instructions
this.tab3 = ""; // tab setting for switch cases
this.ltab = ""; // tab setting for labels
}
};
gen(new CodeBuilder(new TraceMethodVisitor(textifier), 0, "trace", "()V"));
StringWriter writer = new StringWriter();
textifier.print(new PrintWriter(writer));
return writer.toString(); // Note textifier always adds a trailing newline
}
项目:grappa
文件:AsmTestUtils.java
public static String getMethodInstructionList(final MethodNode methodNode) {
Preconditions.checkNotNull(methodNode, "methodNode");
final Printer printer = new NonMaxTextifier();
final TraceMethodVisitor traceMethodVisitor = new TraceMethodVisitor(printer);
methodNode.accept(traceMethodVisitor);
final StringWriter stringWriter = new StringWriter();
final PrintWriter printWriter = new PrintWriter(stringWriter);
printer.print(printWriter);
printWriter.flush();
final String[] lines = PATTERN.split(stringWriter.toString());
int lineNr = 0;
for (int i = 0; i < lines.length; i++) {
if (!lines[i].startsWith(" @")) {
lines[i] = String.format("%2d %s", lineNr++, lines[i]);
}
}
return "Method '" + methodNode.name + "':\n"
+ NEWLINE.join(lines) + '\n';
}
项目:asm-legacy-svn-clone
文件:JSRInlinerAdapterUnitTest.java
@Override
protected void setUp() throws Exception {
super.setUp();
jsr = new JSRInlinerAdapter(Opcodes.ASM5, null, 0, "m", "()V", null,
null) {
@Override
public void visitEnd() {
System.err.println("started w/ method:" + name);
Textifier t = new Textifier();
TraceMethodVisitor mv = new TraceMethodVisitor(t);
for (int i = 0; i < instructions.size(); ++i) {
instructions.get(i).accept(mv);
System.err.print(Integer.toString(i + 100000).substring(1));
System.err.print(" : " + t.text.get(i));
}
super.visitEnd();
System.err.println("finished w/ method:" + name);
}
};
exp = new MethodNode(0, "m", "()V", null, null);
}
项目:javaslicer
文件:Transformer.java
public static void printMethod(PrintStream out, MethodNode method) {
final Textifier textifier = new Textifier();
final TraceMethodVisitor mv = new TraceMethodVisitor(textifier);
out.println(method.name + method.desc);
for (int j = 0; j < method.instructions.size(); ++j) {
method.instructions.get(j).accept(mv);
final StringBuffer s = new StringBuffer();
while (s.length() < method.maxStack + method.maxLocals + 1) {
s.append(' ');
}
out.print(Integer.toString(j + 100000).substring(1));
out.print(" " + s + " : " + textifier.text.get(j));
}
for (int j = 0; j < method.tryCatchBlocks.size(); ++j) {
((TryCatchBlockNode) method.tryCatchBlocks.get(j)).accept(mv);
out.print(" " + textifier.text.get(method.instructions.size()+j));
}
out.println(" MAXSTACK " + method.maxStack);
out.println(" MAXLOCALS " + method.maxLocals);
out.println();
}
项目:ow2-asm
文件:JSRInlinerAdapterUnitTest.java
@Override
protected void setUp() throws Exception {
super.setUp();
jsr = new JSRInlinerAdapter(null, 0, "m", "()V", null, null) {
@Override
public void visitEnd() {
System.err.println("started w/ method:" + name);
Textifier t = new Textifier();
TraceMethodVisitor mv = new TraceMethodVisitor(t);
for (int i = 0; i < instructions.size(); ++i) {
instructions.get(i).accept(mv);
System.err.print(Integer.toString(i + 100000).substring(1));
System.err.print(" : " + t.text.get(i));
}
super.visitEnd();
System.err.println("finished w/ method:" + name);
}
};
exp = new MethodNode(0, "m", "()V", null, null);
}
项目:objectweb-asm-4.0
文件:JSRInlinerAdapterUnitTest.java
@Override
protected void setUp() throws Exception {
super.setUp();
jsr = new JSRInlinerAdapter(null, 0, "m", "()V", null, null) {
@Override
public void visitEnd() {
System.err.println("started w/ method:" + name);
Textifier t = new Textifier();
TraceMethodVisitor mv = new TraceMethodVisitor(t);
for (int i = 0; i < instructions.size(); ++i) {
instructions.get(i).accept(mv);
System.err.print(Integer.toString(i + 100000).substring(1));
System.err.print(" : " + t.text.get(i));
}
super.visitEnd();
System.err.println("finished w/ method:" + name);
}
};
exp = new MethodNode(0, "m", "()V", null, null);
}
项目:Matcher
文件:Analysis.java
private static void dump(MethodNode method) {
Textifier textifier = new Textifier();
method.accept(new TraceMethodVisitor(textifier));
StringWriter writer = new StringWriter();
try (PrintWriter pw = new PrintWriter(writer)) {
textifier.print(pw);
}
System.out.println(writer.toString());
}
项目:r8
文件:JarCode.java
@Override
public String toString() {
triggerDelayedParsingIfNeccessary();
TraceMethodVisitor visitor = new TraceMethodVisitor(new Textifier());
node.accept(visitor);
StringWriter writer = new StringWriter();
visitor.p.print(new PrintWriter(writer));
return writer.toString();
}
项目:java-power-assert
文件:JavaCompilerHelper.java
public void traceMethod(String className, final String method) {
new ClassReader(inMemoryClassFileManager.classBytes(className)).accept(
new ClassVisitor(Opcodes.ASM5) {
PrintWriter pw = new PrintWriter(System.out);
Textifier p = new Textifier();
@Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
if(name.equals(method)) {
p.visitMethod(access, name, desc, signature, exceptions);
return new TraceMethodVisitor(p);
}
return null;
}
@Override
public void visitEnd() {
p.visitClassEnd();
if (pw != null) {
p.print(pw);
pw.flush();
}
}
},
ClassReader.SKIP_FRAMES
);
}
项目:4Space-5
文件:InsnListSection.java
public String toString() {
Textifier t = new Textifier();
accept(new TraceMethodVisitor(t));
StringWriter sw = new StringWriter();
t.print(new PrintWriter(sw));
return sw.toString();
}
项目:4Space-5
文件:MethodASMifier.java
@Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
if (method.matches(name, desc)) {
Printer localPrinter = asmifier.visitMethod(access, name, desc, signature, exceptions);
return new TraceMethodVisitor(null, localPrinter);
}
return null;
}
项目:constexpr-java
文件:TestUtil.java
public static String toString(MethodNode mn) {
TraceMethodVisitor tcv = new TraceMethodVisitor(null, new Textifier());
mn.accept(tcv);
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
pw.println(mn.name + " " + mn.desc);
tcv.p.print(pw);
pw.flush();
return sw.toString();
}
项目:testrecorder
文件:ByteCode.java
public static List<String> toString(InsnList instructions) {
Printer p = new Textifier();
TraceMethodVisitor mp = new TraceMethodVisitor(p);
instructions.accept(mp);
return p.getText().stream()
.map(Object::toString)
.map(String::trim)
.collect(toList());
}
项目:testrecorder
文件:ByteCode.java
public static String toString(AbstractInsnNode instruction) {
Printer p = new Textifier();
TraceMethodVisitor mp = new TraceMethodVisitor(p);
instruction.accept(mp);
String text = p.getText().stream()
.map(Object::toString)
.collect(joining("\n"));
return text;
}
项目:grappa
文件:AsmTestUtils.java
public static void assertTraceDumpEquality(
final MethodNode method, final String traceDump) throws Exception {
Preconditions.checkNotNull(method, "method");
final Printer printer = new NonMaxTextifier();
final TraceMethodVisitor traceMethodVisitor = new TraceMethodVisitor(printer);
// MethodAdapter checkMethodAdapter = new MethodAdapter(traceMethodVisitor);
final MethodVisitor checkMethodAdapter = new CheckMethodAdapter(traceMethodVisitor);
method.accept(checkMethodAdapter);
final StringWriter stringWriter = new StringWriter();
final PrintWriter printWriter = new PrintWriter(stringWriter);
printer.print(printWriter);
printWriter.flush();
assertEquals(stringWriter.toString(), traceDump);
}
项目:pitest
文件:InfiniteLoopBaseTest.java
private String toString(MethodTree mt) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
TraceMethodVisitor mv = new TraceMethodVisitor(new Textifier());
mt.rawNode().accept(mv);
try (PrintWriter pw = new PrintWriter(bos)) {
mv.p.print(pw);
}
return "Byte code is \n" + new String(bos.toByteArray());
}
项目:spassMeter
文件:Utils.java
/**
* Prints an individual method behavior. [debugging]
*
* @param node the node to print
*
* @since 1.00
*/
public static void print(MethodNode node) {
Textifier tf = new Textifier();
node.accept(new TraceMethodVisitor(tf));
PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
tf.print(pw);
pw.flush();
}
项目:spassMeter
文件:Utils.java
/**
* Prints an instruction list.
*
* @param insn instructions
*
* @since 1.00
*/
public static void print(InsnList insn) {
Textifier tf = new Textifier();
MethodVisitor vis = new TraceMethodVisitor(tf);
for (int i = 0; i < insn.size(); i++) {
insn.get(i).accept(vis);
}
PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
tf.print(pw);
pw.flush();
}
项目:asm-legacy-svn-clone
文件:JSRInlinerAdapterUnitTest.java
private String getText(final MethodNode mn) {
Textifier tv = new Textifier();
TraceMethodVisitor tmv = new TraceMethodVisitor(tv);
mn.accept(tmv);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < tv.text.size(); i++) {
sb.append(tv.text.get(i));
}
return sb.toString();
}
项目:javaslicer
文件:Transformer.java
private static void printMethod(final Analyzer a, final PrintStream out, final MethodNode method) {
final Frame[] frames = a.getFrames();
final Textifier textifier = new Textifier();
final TraceMethodVisitor mv = new TraceMethodVisitor(textifier);
out.println(method.name + method.desc);
for (int j = 0; j < method.instructions.size(); ++j) {
method.instructions.get(j).accept(mv);
final StringBuffer s = new StringBuffer();
final Frame f = frames[j];
if (f == null) {
s.append('?');
} else {
for (int k = 0; k < f.getLocals(); ++k) {
s.append(getShortName(f.getLocal(k).toString())).append(' ');
}
s.append(" : ");
for (int k = 0; k < f.getStackSize(); ++k) {
s.append(getShortName(f.getStack(k).toString())).append(' ');
}
}
while (s.length() < method.maxStack + method.maxLocals + 1) {
s.append(' ');
}
out.print(Integer.toString(j + 100000).substring(1));
out.print(" " + s + " : " + textifier.text.get(j));
}
for (int j = 0; j < method.tryCatchBlocks.size(); ++j) {
((TryCatchBlockNode) method.tryCatchBlocks.get(j)).accept(mv);
out.print(" " + textifier.text.get(method.instructions.size()+j));
}
out.println(" MAXSTACK " + method.maxStack);
out.println(" MAXLOCALS " + method.maxLocals);
out.println();
}
项目:ow2-asm
文件:JSRInlinerAdapterUnitTest.java
private String getText(final MethodNode mn) {
Textifier tv = new Textifier();
TraceMethodVisitor tmv = new TraceMethodVisitor(tv);
mn.accept(tmv);
StringBuffer sb = new StringBuffer();
for (int i = 0; i < tv.text.size(); i++) {
sb.append(tv.text.get(i));
}
return sb.toString();
}
项目:es6draft
文件:InstructionAssembler.java
public void trace() {
PrintWriter printWriter = new PrintWriter(System.out);
printWriter.format("%nClass=%s, Method=%s [%s]%n", method.classCode.className, method.methodName,
method.methodDescriptor);
((TraceMethodVisitor) mv).p.print(printWriter);
printWriter.format("%n");
printWriter.flush();
}
项目:es6draft
文件:Code.java
@Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
if (methodName.equals(name) && methodType.toMethodDescriptorString().equals(desc)) {
Printer p = printer.visitMethod(access, name, desc, signature, exceptions);
return new TraceMethodVisitor(null, p);
}
return null;
}
项目:objectweb-asm-4.0
文件:JSRInlinerAdapterUnitTest.java
private String getText(final MethodNode mn) {
Textifier tv = new Textifier();
TraceMethodVisitor tmv = new TraceMethodVisitor(tv);
mn.accept(tmv);
StringBuffer sb = new StringBuffer();
for (int i = 0; i < tv.text.size(); i++) {
sb.append(tv.text.get(i));
}
return sb.toString();
}
项目:jBOP
文件:NodeHelper.java
/**
* Prints the method.
*
* @param node
* the node
* @param stream
* the stream
*/
public static void printMethod(final MethodNode node, final ClassNode classNode, final PrintStream stream,
final boolean build) {
final Printer p;
if (build) {
p = new ClassNodeBuilderTextifier(node, classNode);
} else {
p = new ExtendedTextifier(node, classNode);
}
final TraceMethodVisitor traceMethodVisitor = new TraceMethodVisitor(p);
node.accept(traceMethodVisitor);
stream.println(StringUtils.join(p.getText(), ""));
}
项目:Despector
文件:BytecodeEmitterContext.java
@SuppressWarnings("unchecked")
public <T extends TypeEntry> void emitOuterType(T ast) {
ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
this.cw = writer;
if (VERIFY_EMITTED_BYTECODE) {
this.cw = new CheckClassAdapter(this.cw);
}
AstEmitter<AbstractEmitterContext, T> emitter = (AstEmitter<AbstractEmitterContext, T>) this.set.getAstEmitter(ast.getClass());
if (emitter == null) {
throw new IllegalArgumentException("No emitter for ast entry " + ast.getClass().getName());
}
emitter.emit(this, ast);
this.cw.visitEnd();
byte[] clazz = writer.toByteArray();
if (DUMP_INSTRUCTIONS_AFTER_WRITE) {
ClassReader cr = new ClassReader(clazz);
ClassNode cn = new ClassNode();
cr.accept(cn, 0);
List<MethodNode> methods = cn.methods;
for (MethodNode mn : methods) {
System.out.println("Method: " + mn.name + mn.desc);
Printer printer = new Textifier();
TraceMethodVisitor mp = new TraceMethodVisitor(printer);
for (Iterator<AbstractInsnNode> it = mn.instructions.iterator(); it.hasNext();) {
AbstractInsnNode insn = it.next();
insn.accept(mp);
}
StringWriter sw = new StringWriter();
printer.print(new PrintWriter(sw));
String s = sw.toString();
if (s.endsWith("\n")) {
s = s.substring(0, s.length() - 1);
}
System.out.println(s);
mn.instructions.accept(mp);
}
}
try {
this.out.write(clazz);
} catch (IOException e) {
Throwables.propagate(e);
}
}
项目:tascalate-async-await
文件:BytecodeTraceUtil.java
public static String toString(MethodNode mn) {
Textifier t = new Textifier();
TraceMethodVisitor tmv = new TraceMethodVisitor(t);
mn.accept(tmv);
return t.toString();
}
项目:janala2-gradle
文件:MethodRecorder.java
public MethodRecorder() {
printer = new Textifier();
visitor = new TraceMethodVisitor(printer);
}
项目:groovy
文件:VerifyClass.java
private boolean readClass(String clazz) throws IOException {
ClassReader cr = new ClassReader(new FileInputStream(clazz));
ClassNode ca = new ClassNode() {
public void visitEnd() {
//accept(cv);
}
};
cr.accept(new CheckClassAdapter(ca), ClassWriter.COMPUTE_MAXS);
boolean failed = false;
List methods = ca.methods;
for (int i = 0; i < methods.size(); ++i) {
MethodNode method = (MethodNode) methods.get(i);
if (method.instructions.size() > 0) {
Analyzer a = new Analyzer(new SimpleVerifier());
try {
a.analyze(ca.name, method);
continue;
} catch (Exception e) {
e.printStackTrace();
}
if (!failed) {
failed = true;
log("verifying of class " + clazz + " failed");
}
if (verbose) log(method.name + method.desc);
TraceMethodVisitor mv = new TraceMethodVisitor(null);
/*= new TraceMethodVisitor(null) {
public void visitMaxs(int maxStack, int maxLocals) {
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < text.size(); ++i) {
String s = frames[i] == null ? "null" : frames[i].toString();
while (s.length() < maxStack + maxLocals + 1) {
s += " ";
}
buffer.append(Integer.toString(i + 100000).substring(1));
buffer.append(" ");
buffer.append(s);
buffer.append(" : ");
buffer.append(text.get(i));
}
if (verbose) log(buffer.toString());
}
};*/
for (int j = 0; j < method.instructions.size(); ++j) {
Object insn = method.instructions.get(j);
if (insn instanceof AbstractInsnNode) {
((AbstractInsnNode) insn).accept(mv);
} else {
mv.visitLabel((Label) insn);
}
}
mv.visitMaxs(method.maxStack, method.maxLocals);
}
}
return !failed;
}
项目:groovy
文件:AsmClassGenerator.java
protected void visitConstructorOrMethod(MethodNode node, boolean isConstructor) {
controller.resetLineNumber();
Parameter[] parameters = node.getParameters();
String methodType = BytecodeHelper.getMethodDescriptor(node.getReturnType(), parameters);
String signature = BytecodeHelper.getGenericsMethodSignature(node);
int modifiers = node.getModifiers();
if (isVargs(node.getParameters())) modifiers |= Opcodes.ACC_VARARGS;
MethodVisitor mv = cv.visitMethod(modifiers, node.getName(), methodType, signature, buildExceptions(node.getExceptions()));
controller.setMethodVisitor(mv);
visitAnnotations(node, mv);
for (int i = 0; i < parameters.length; i++) {
visitParameterAnnotations(parameters[i], i, mv);
}
// Add parameter names to the MethodVisitor (jdk8+ only)
if (getCompileUnit().getConfig().getParameters()) {
for (int i = 0; i < parameters.length; i++) {
// TODO handle ACC_SYNTHETIC for enum method parameters?
mv.visitParameter(parameters[i].getName(), 0);
}
}
if (controller.getClassNode().isAnnotationDefinition() && !node.isStaticConstructor()) {
visitAnnotationDefault(node, mv);
} else if (!node.isAbstract()) {
Statement code = node.getCode();
mv.visitCode();
// fast path for getter/setters etc.
if (code instanceof BytecodeSequence && ((BytecodeSequence)code).getInstructions().size() == 1 && ((BytecodeSequence)code).getInstructions().get(0) instanceof BytecodeInstruction) {
((BytecodeInstruction)((BytecodeSequence)code).getInstructions().get(0)).visit(mv);
} else {
visitStdMethod(node, isConstructor, parameters, code);
}
// we use this NOP to have a valid jump target for the various labels
//mv.visitInsn(NOP);
try {
mv.visitMaxs(0, 0);
} catch (Exception e) {
Writer writer = null;
if (mv instanceof TraceMethodVisitor) {
TraceMethodVisitor tracer = (TraceMethodVisitor) mv;
writer = new StringBuilderWriter();
PrintWriter p = new PrintWriter(writer);
tracer.p.print(p);
p.flush();
}
StringBuilder outBuffer = new StringBuilder();
outBuffer.append("ASM reporting processing error for ");
outBuffer.append(controller.getClassNode().toString() + "#" + node.getName());
outBuffer.append(" with signature " + node.getTypeDescriptor());
outBuffer.append(" in " + sourceFile + ":" + node.getLineNumber());
if (writer != null) {
outBuffer.append("\nLast known generated bytecode in last generated method or constructor:\n");
outBuffer.append(writer);
}
throw new GroovyRuntimeException(outBuffer.toString(), e);
}
}
mv.visitEnd();
}
项目:evosuite
文件:RegressionClassDiff.java
private static Map<String, List<Integer>> getClassInstructions(InputStream classAsInputStream) {
HashMap<String, List<Integer>> methodInstructionsMap = new HashMap<>();
try {
ClassReader reader = new ClassReader(classAsInputStream);
ClassNode classNode = new ClassNode();
reader.accept(classNode, 0);
@SuppressWarnings("unchecked")
final List<MethodNode> methods = classNode.methods;
Printer printer = new Textifier();
TraceMethodVisitor mp = new TraceMethodVisitor(printer);
for (MethodNode m : methods) {
List<Integer> instructions = new ArrayList<>();
InsnList inList = m.instructions;
String mathodID = m.name + ": " + m.desc;
System.out.println(mathodID);
int[] methodInstructions = new int[inList.size()];
for (int i = 0; i < inList.size(); i++) {
int op = inList.get(i).getOpcode();
methodInstructions[i] = op;
AbstractInsnNode insn = inList.get(i);
insn.accept(mp);
// Uncomment the following comment block to print the bytecode
// instructions
// StringWriter sw = new StringWriter();
// printer.print(new PrintWriter(sw));
// printer.getText().clear();
// System.out.println(sw.toString());
// logger.warn("{} -> {}", sw.toString(), op);
if (op != -1)
instructions.add(op);
}
methodInstructionsMap.put(mathodID, instructions);
}
} catch (IOException e) {
// Will fail if ClassReader fails
e.printStackTrace();
}
return methodInstructionsMap;
}
项目:coroutines
文件:Instrumenter.java
private void verifyClassIntegrity(ClassNode classNode) {
// Do not COMPUTE_FRAMES. If you COMPUTE_FRAMES and you pop too many items off the stack or do other weird things that mess up the
// stack map frames, it'll crash on classNode.accept(cw).
ClassWriter cw = new SimpleClassWriter(ClassWriter.COMPUTE_MAXS/* | ClassWriter.COMPUTE_FRAMES*/, classRepo);
classNode.accept(cw);
byte[] classData = cw.toByteArray();
ClassReader cr = new ClassReader(classData);
classNode = new SimpleClassNode();
cr.accept(classNode, 0);
for (MethodNode methodNode : classNode.methods) {
Analyzer<BasicValue> analyzer = new Analyzer<>(new SimpleVerifier(classRepo));
try {
analyzer.analyze(classNode.name, methodNode);
} catch (AnalyzerException e) {
// IF WE DID OUR INSTRUMENTATION RIGHT, WE SHOULD NEVER GET AN EXCEPTION HERE!!!!
StringWriter writer = new StringWriter();
PrintWriter printWriter = new PrintWriter(writer);
printWriter.append(methodNode.name + " encountered " + e);
Printer printer = new Textifier();
TraceMethodVisitor traceMethodVisitor = new TraceMethodVisitor(printer);
AbstractInsnNode insn = methodNode.instructions.getFirst();
while (insn != null) {
if (insn == e.node) {
printer.getText().add("----------------- BAD INSTRUCTION HERE -----------------\n");
}
insn.accept(traceMethodVisitor);
insn = insn.getNext();
}
printer.print(printWriter);
printWriter.flush(); // we need this or we'll get incomplete results
throw new IllegalStateException(writer.toString(), e);
}
}
}
项目:grappa
文件:ClassVisitorExample.java
@Override
public MethodVisitor visitMethod(final int access, final String name,
final String desc, final String signature, final String[] exceptions)
{
// Unused?
/*
final MethodVisitor mv = super.visitMethod(access, name, desc,
signature, exceptions);
*/
return new MethodNode(Opcodes.ASM5, access, name, desc, signature,
exceptions)
{
@Override
public void visitEnd()
{
super.visitEnd();
try {
final BasicInterpreter basicInterpreter
= new BasicInterpreter();
final Analyzer<BasicValue> analyzer
= new Analyzer<>(basicInterpreter);
final AbstractInsnNode[] nodes = instructions.toArray();
final Frame<BasicValue>[] frames
= analyzer.analyze(className, this);
int areturn = -1;
for (int i = nodes.length -1; i >= 0; i--)
{
if (nodes[i].getOpcode() == Opcodes.ARETURN) {
areturn = i;
System.out.println(className + "." + name + desc);
System.out.println("Found areturn at: " + i);
} else if (areturn != -1
&& nodes[i].getOpcode() != -1
&& frames[i].getStackSize() == 0) {
System.out.println("Found start of block at: " + i);
final InsnList list = new InsnList();
for (int j = i; j <= areturn; j++)
list.add(nodes[j]);
final Textifier textifier = new Textifier();
final PrintWriter pw = new PrintWriter(System.out);
list.accept(new TraceMethodVisitor(textifier));
textifier.print(pw);
pw.flush();
System.out.println("\n\n");
areturn = -1;
}
}
}
catch (AnalyzerException e) {
e.printStackTrace();
}
if (mv != null)
accept(mv);
}
};
}
项目:asm-legacy-svn-clone
文件:Analysis.java
public static void main(final String[] args) throws Exception {
ClassReader cr = new ClassReader("Analysis");
ClassNode cn = new ClassNode();
cr.accept(cn, ClassReader.SKIP_DEBUG);
List<MethodNode> methods = cn.methods;
for (int i = 0; i < methods.size(); ++i) {
MethodNode method = methods.get(i);
if (method.instructions.size() > 0) {
if (!analyze(cn, method)) {
Analyzer<?> a = new Analyzer<BasicValue>(
new BasicVerifier());
try {
a.analyze(cn.name, method);
} catch (Exception ignored) {
}
final Frame<?>[] frames = a.getFrames();
Textifier t = new Textifier() {
@Override
public void visitMaxs(final int maxStack,
final int maxLocals) {
for (int i = 0; i < text.size(); ++i) {
StringBuilder s = new StringBuilder(
frames[i] == null ? "null"
: frames[i].toString());
while (s.length() < Math.max(20, maxStack
+ maxLocals + 1)) {
s.append(' ');
}
System.err.print(Integer.toString(i + 1000)
.substring(1)
+ " "
+ s
+ " : "
+ text.get(i));
}
System.err.println();
}
};
MethodVisitor mv = new TraceMethodVisitor(t);
for (int j = 0; j < method.instructions.size(); ++j) {
Object insn = method.instructions.get(j);
((AbstractInsnNode) insn).accept(mv);
}
mv.visitMaxs(0, 0);
}
}
}
}