List of usage examples for org.objectweb.asm.tree.analysis Analyzer getFrames
public Frame<V>[] getFrames()
From source file:cl.inria.stiq.instrumenter.BCIUtils.java
License:Open Source License
public static void checkMethod(ClassNode aClassNode, MethodNode aNode, Interpreter aInterpreter, boolean aAlwaysPrint) { checkLabels(aNode);/*w ww. j a va 2 s.c o m*/ Analyzer theAnalyzer = new Analyzer(aInterpreter); try { theAnalyzer.analyze(aClassNode.name, aNode); if (aAlwaysPrint) { Frame[] theFrames = theAnalyzer.getFrames(); printFrames(aNode, theFrames); } } catch (AnalyzerException e) { Frame[] theFrames = theAnalyzer.getFrames(); printFrames(aNode, theFrames); Utils.rtex(e, "Error in %s.%s%s at instructions #(%s): %s", aClassNode.name, aNode.name, aNode.desc, "?", //e.nodes != null ? getBytecodeRanks(aNode, e.nodes) : "?", e.getMessage()); } catch (Exception e) { Utils.rtex(e, "Exception while analyzing %s.%s%s", aClassNode.name, aNode.name, aNode.desc); } }
From source file:com.dragome.callbackevictor.serverside.bytecode.transformation.asm.ContinuationMethodAnalyzer.java
License:Apache License
@SuppressWarnings("unchecked") void moveNew() throws AnalyzerException { SourceInterpreter i = new SourceInterpreter(); Analyzer a = new Analyzer(i); a.analyze(className, this); final HashMap<AbstractInsnNode, MethodInsnNode> movable = new HashMap<AbstractInsnNode, MethodInsnNode>(); Frame[] frames = a.getFrames(); for (int j = 0; j < methods.size(); j++) { MethodInsnNode mnode = methods.get(j); // require to move NEW instruction int n = instructions.indexOf(mnode); Frame f = frames[n];// w w w . j a v a 2 s . c o m Type[] args = Type.getArgumentTypes(mnode.desc); SourceValue v = (SourceValue) f.getStack(f.getStackSize() - args.length - 1); Set<AbstractInsnNode> insns = v.insns; for (final AbstractInsnNode ins : insns) { if (ins.getOpcode() == NEW) { movable.put(ins, mnode); } else { // other known patterns int n1 = instructions.indexOf(ins); if (ins.getOpcode() == DUP) { // <init> with params AbstractInsnNode ins1 = instructions.get(n1 - 1); if (ins1.getOpcode() == NEW) { movable.put(ins1, mnode); } } else if (ins.getOpcode() == SWAP) { // in exception handler AbstractInsnNode ins1 = instructions.get(n1 - 1); AbstractInsnNode ins2 = instructions.get(n1 - 2); if (ins1.getOpcode() == DUP_X1 && ins2.getOpcode() == NEW) { movable.put(ins2, mnode); } } } } } int updateMaxStack = 0; for (final Map.Entry<AbstractInsnNode, MethodInsnNode> e : movable.entrySet()) { AbstractInsnNode node1 = e.getKey(); int n1 = instructions.indexOf(node1); AbstractInsnNode node2 = instructions.get(n1 + 1); AbstractInsnNode node3 = instructions.get(n1 + 2); int producer = node2.getOpcode(); instructions.remove(node1); // NEW boolean requireDup = false; if (producer == DUP) { instructions.remove(node2); // DUP requireDup = true; } else if (producer == DUP_X1) { instructions.remove(node2); // DUP_X1 instructions.remove(node3); // SWAP requireDup = true; } MethodInsnNode mnode = (MethodInsnNode) e.getValue(); AbstractInsnNode nm = mnode; int varOffset = stackRecorderVar + 1; Type[] args = Type.getArgumentTypes(mnode.desc); // optimizations for some common cases if (args.length == 0) { final InsnList doNew = new InsnList(); doNew.add(node1); // NEW if (requireDup) doNew.add(new InsnNode(DUP)); instructions.insertBefore(nm, doNew); nm = doNew.getLast(); continue; } if (args.length == 1 && args[0].getSize() == 1) { final InsnList doNew = new InsnList(); doNew.add(node1); // NEW if (requireDup) { doNew.add(new InsnNode(DUP)); doNew.add(new InsnNode(DUP2_X1)); doNew.add(new InsnNode(POP2)); updateMaxStack = updateMaxStack < 2 ? 2 : updateMaxStack; // a two extra slots for temp values } else doNew.add(new InsnNode(SWAP)); instructions.insertBefore(nm, doNew); nm = doNew.getLast(); continue; } // TODO this one untested! if ((args.length == 1 && args[0].getSize() == 2) || (args.length == 2 && args[0].getSize() == 1 && args[1].getSize() == 1)) { final InsnList doNew = new InsnList(); doNew.add(node1); // NEW if (requireDup) { doNew.add(new InsnNode(DUP)); doNew.add(new InsnNode(DUP2_X2)); doNew.add(new InsnNode(POP2)); updateMaxStack = updateMaxStack < 2 ? 2 : updateMaxStack; // a two extra slots for temp values } else { doNew.add(new InsnNode(DUP_X2)); doNew.add(new InsnNode(POP)); updateMaxStack = updateMaxStack < 1 ? 1 : updateMaxStack; // an extra slot for temp value } instructions.insertBefore(nm, doNew); nm = doNew.getLast(); continue; } final InsnList doNew = new InsnList(); // generic code using temporary locals // save stack for (int j = args.length - 1; j >= 0; j--) { Type type = args[j]; doNew.add(new VarInsnNode(type.getOpcode(ISTORE), varOffset)); varOffset += type.getSize(); } if (varOffset > maxLocals) { maxLocals = varOffset; } doNew.add(node1); // NEW if (requireDup) doNew.add(new InsnNode(DUP)); // restore stack for (int j = 0; j < args.length; j++) { Type type = args[j]; varOffset -= type.getSize(); doNew.add(new VarInsnNode(type.getOpcode(ILOAD), varOffset)); // clean up store to avoid memory leak? if (type.getSort() == Type.OBJECT || type.getSort() == Type.ARRAY) { updateMaxStack = updateMaxStack < 1 ? 1 : updateMaxStack; // an extra slot for ACONST_NULL doNew.add(new InsnNode(ACONST_NULL)); doNew.add(new VarInsnNode(type.getOpcode(ISTORE), varOffset)); } } instructions.insertBefore(nm, doNew); nm = doNew.getLast(); } maxStack += updateMaxStack; }
From source file:com.googlecode.dex2jar.test.TestUtils.java
License:Apache License
static void printAnalyzerResult(MethodNode method, Analyzer a, final PrintWriter pw) throws IllegalArgumentException, IllegalAccessException { Frame[] frames = a.getFrames(); Textifier t = new Textifier(); TraceMethodVisitor mv = new TraceMethodVisitor(t); String format = "%05d %-" + (method.maxStack + method.maxLocals + 6) + "s|%s"; for (int j = 0; j < method.instructions.size(); ++j) { method.instructions.get(j).accept(mv); StringBuffer s = new StringBuffer(); Frame f = frames[j];//from w w w . j a v a2 s . c o m if (f == null) { s.append('?'); } else { for (int k = 0; k < f.getLocals(); ++k) { s.append(getShortName(f.getLocal(k).toString())); } s.append(" : "); for (int k = 0; k < f.getStackSize(); ++k) { s.append(getShortName(f.getStack(k).toString())); } } pw.printf(format, j, s, buf.get(t)); // mv.text.get(j)); } for (int j = 0; j < method.tryCatchBlocks.size(); ++j) { ((TryCatchBlockNode) method.tryCatchBlocks.get(j)).accept(mv); pw.print(" " + buf.get(t)); } pw.println(); pw.flush(); }
From source file:com.googlecode.dex2jar.tools.AsmVerify.java
License:Apache License
static void printAnalyzerResult(MethodNode method, Analyzer a, final PrintWriter pw) throws IllegalArgumentException { Frame[] frames = a.getFrames(); Textifier t = new Textifier(); TraceMethodVisitor mv = new TraceMethodVisitor(t); String format = "%05d %-" + (method.maxStack + method.maxLocals + 6) + "s|%s"; for (int j = 0; j < method.instructions.size(); ++j) { method.instructions.get(j).accept(mv); StringBuffer s = new StringBuffer(); Frame f = frames[j];/* ww w . j a v a 2 s . co m*/ if (f == null) { s.append('?'); } else { for (int k = 0; k < f.getLocals(); ++k) { s.append(getShortName(f.getLocal(k).toString())); } s.append(" : "); for (int k = 0; k < f.getStackSize(); ++k) { s.append(getShortName(f.getStack(k).toString())); } } try { pw.printf(format, j, s, buf.get(t)); // mv.text.get(j)); } catch (IllegalAccessException e) { e.printStackTrace(); } } for (TryCatchBlockNode tryCatchBlockNode : method.tryCatchBlocks) { tryCatchBlockNode.accept(mv); try { pw.print(" " + buf.get(t)); } catch (IllegalAccessException e) { e.printStackTrace(); } } pw.println(); pw.flush(); }
From source file:de.loskutov.bco.asm.DecompiledMethod.java
License:Open Source License
private void analyzeMethod(final ClassLoader cl) { Analyzer<BasicValue> a = new Analyzer<BasicValue>(new SimpleVerifier() { @Override//from ww w. j a va2 s . c om protected Class getClass(final Type t) { try { if (t.getSort() == Type.ARRAY) { return Class.forName(t.getDescriptor().replace('/', '.'), true, cl); } return cl.loadClass(t.getClassName()); } catch (ClassNotFoundException e) { throw new RuntimeException(e.toString() + " " + cl, e); } } }); try { a.analyze(owner, meth); } catch (AnalyzerException e) { error = e.getMessage(); if (error.startsWith("Error at instruction ")) { error = error.substring("Error at instruction ".length()); errorInsn = Integer.parseInt(error.substring(0, error.indexOf(':'))); error = error.substring(error.indexOf(':') + 2); } else { BytecodeOutlinePlugin.log(e, IStatus.ERROR); error = null; } } frames = a.getFrames(); }
From source file:de.unisb.cs.st.javaslicer.tracer.instrumentation.Transformer.java
License:Open Source License
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 {// w w w . j a v a 2s.com 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(); }
From source file:org.apache.commons.javaflow.providers.asm3.ContinuableMethodNode.java
License:Apache License
void moveNew() throws AnalyzerException { final SourceInterpreter i = new SourceInterpreter(); final Analyzer a = new Analyzer(i); a.analyze(className, this); final HashMap<AbstractInsnNode, MethodInsnNode> movable = new HashMap<AbstractInsnNode, MethodInsnNode>(); final Frame[] frames = a.getFrames(); for (int j = 0; j < methods.size(); j++) { final MethodInsnNode mnode = (MethodInsnNode) methods.get(j); // require to move NEW instruction int n = instructions.indexOf(mnode); Frame f = frames[n];/*w w w . j a v a2 s .c o m*/ Type[] args = Type.getArgumentTypes(mnode.desc); SourceValue v = (SourceValue) f.getStack(f.getStackSize() - args.length - 1); @SuppressWarnings("unchecked") Set<AbstractInsnNode> insns = v.insns; for (final AbstractInsnNode ins : insns) { if (ins.getOpcode() == NEW) { movable.put(ins, mnode); } else { // other known patterns int n1 = instructions.indexOf(ins); if (ins.getOpcode() == DUP) { // <init> with params AbstractInsnNode ins1 = instructions.get(n1 - 1); if (ins1.getOpcode() == NEW) { movable.put(ins1, mnode); } } else if (ins.getOpcode() == SWAP) { // in exception handler AbstractInsnNode ins1 = instructions.get(n1 - 1); AbstractInsnNode ins2 = instructions.get(n1 - 2); if (ins1.getOpcode() == DUP_X1 && ins2.getOpcode() == NEW) { movable.put(ins2, mnode); } } } } } int updateMaxStack = 0; for (final Map.Entry<AbstractInsnNode, MethodInsnNode> e : movable.entrySet()) { AbstractInsnNode node1 = e.getKey(); int n1 = instructions.indexOf(node1); AbstractInsnNode node2 = instructions.get(n1 + 1); AbstractInsnNode node3 = instructions.get(n1 + 2); int producer = node2.getOpcode(); instructions.remove(node1); // NEW boolean requireDup = false; if (producer == DUP) { instructions.remove(node2); // DUP requireDup = true; } else if (producer == DUP_X1) { instructions.remove(node2); // DUP_X1 instructions.remove(node3); // SWAP requireDup = true; } MethodInsnNode mnode = (MethodInsnNode) e.getValue(); AbstractInsnNode nm = mnode; int varOffset = stackRecorderVar + 1; Type[] args = Type.getArgumentTypes(mnode.desc); // optimizations for some common cases if (args.length == 0) { final InsnList doNew = new InsnList(); doNew.add(node1); // NEW if (requireDup) doNew.add(new InsnNode(DUP)); instructions.insertBefore(nm, doNew); nm = doNew.getLast(); continue; } if (args.length == 1 && args[0].getSize() == 1) { final InsnList doNew = new InsnList(); doNew.add(node1); // NEW if (requireDup) { doNew.add(new InsnNode(DUP)); doNew.add(new InsnNode(DUP2_X1)); doNew.add(new InsnNode(POP2)); updateMaxStack = updateMaxStack < 2 ? 2 : updateMaxStack; // a two extra slots for temp values } else doNew.add(new InsnNode(SWAP)); instructions.insertBefore(nm, doNew); nm = doNew.getLast(); continue; } // TODO this one untested! if ((args.length == 1 && args[0].getSize() == 2) || (args.length == 2 && args[0].getSize() == 1 && args[1].getSize() == 1)) { final InsnList doNew = new InsnList(); doNew.add(node1); // NEW if (requireDup) { doNew.add(new InsnNode(DUP)); doNew.add(new InsnNode(DUP2_X2)); doNew.add(new InsnNode(POP2)); updateMaxStack = updateMaxStack < 2 ? 2 : updateMaxStack; // a two extra slots for temp values } else { doNew.add(new InsnNode(DUP_X2)); doNew.add(new InsnNode(POP)); updateMaxStack = updateMaxStack < 1 ? 1 : updateMaxStack; // an extra slot for temp value } instructions.insertBefore(nm, doNew); nm = doNew.getLast(); continue; } final InsnList doNew = new InsnList(); // generic code using temporary locals // save stack for (int j = args.length - 1; j >= 0; j--) { Type type = args[j]; doNew.add(new VarInsnNode(type.getOpcode(ISTORE), varOffset)); varOffset += type.getSize(); } if (varOffset > maxLocals) { maxLocals = varOffset; } doNew.add(node1); // NEW if (requireDup) doNew.add(new InsnNode(DUP)); // restore stack for (int j = 0; j < args.length; j++) { Type type = args[j]; varOffset -= type.getSize(); doNew.add(new VarInsnNode(type.getOpcode(ILOAD), varOffset)); // clean up store to avoid memory leak? if (type.getSort() == Type.OBJECT || type.getSort() == Type.ARRAY) { updateMaxStack = updateMaxStack < 1 ? 1 : updateMaxStack; // an extra slot for ACONST_NULL doNew.add(new InsnNode(ACONST_NULL)); doNew.add(new VarInsnNode(type.getOpcode(ISTORE), varOffset)); } } instructions.insertBefore(nm, doNew); nm = doNew.getLast(); } maxStack += updateMaxStack; }
From source file:org.evosuite.instrumentation.BooleanTestabilityTransformation.java
License:Open Source License
private Frame[] getArrayFrames(MethodNode mn) { try {//from ww w . j ava2s . c om Analyzer a = new Analyzer(new BooleanArrayInterpreter()); a.analyze(cn.name, mn); return a.getFrames(); } catch (Exception e) { logger.info("[Array] Error during analysis: {}", e); return null; } }
From source file:org.evosuite.instrumentation.BooleanTestabilityTransformation.java
License:Open Source License
/** * Apply testability transformation to an individual method * /*from w w w. ja v a 2 s.com*/ * @param mn */ private void transformMethod(MethodNode mn) { logger.info("Transforming method {}{}", mn.name, mn.desc); //currentCFG = GraphPool.getActualCFG(className, mn.name + mn.desc); // TODO: Skipping interfaces for now, but will need to handle Booleans in interfaces! if ((mn.access & Opcodes.ACC_ABSTRACT) == Opcodes.ACC_ABSTRACT) return; String origDesc = getOriginalDesc(className, mn.name, mn.desc); logger.info("Analyzing {} for TT, signature {}/{}", mn.name, origDesc, mn.desc); try { Analyzer a = new Analyzer( new BooleanValueInterpreter(origDesc, (mn.access & Opcodes.ACC_STATIC) == Opcodes.ACC_STATIC)); a.analyze(className, mn); currentFrames = a.getFrames(); } catch (Exception e) { logger.info("1. Error during analysis: {}", e); //e.printStackTrace(); // TODO: Handle error } generateCDG(mn); currentMethodNode = mn; // First expand ifs without else/* new ImplicitElseTransformer(this).transform(mn); try { Analyzer a = new Analyzer( new BooleanValueInterpreter(origDesc, (mn.access & Opcodes.ACC_STATIC) == Opcodes.ACC_STATIC)); a.analyze(className, mn); currentFrames = a.getFrames(); } catch (Exception e) { logger.info("2. Error during analysis: {}", e); //e.printStackTrace(); // TODO: Handle error } // BytecodeInstructionPool.reRegisterMethodNode(mn, className, mn.name + mn.desc); // Replace all bitwise operators logger.info("Transforming Boolean bitwise operators"); new BitwiseOperatorTransformer(this).transform(mn); // Transform IFEQ/IFNE to IFLE/IFGT logger.info("Transforming Boolean IFs"); new BooleanIfTransformer(this).transform(mn); // Insert call to BooleanHelper.get after ICONST_0/1 or Boolean fields logger.info("Transforming Boolean definitions"); new BooleanDefinitionTransformer(this).transform(mn); // Replace all instanceof comparisons logger.info("Transforming instanceof"); new InstanceOfTransformer().transform(mn); // Replace all calls to methods/fields returning booleans new BooleanCallsTransformer(this).transform(mn); // Transform all flag based comparisons logger.info("Transforming Boolean distances"); new BooleanDistanceTransformer(this).transform(mn); mn.maxStack += 3; // Replace all boolean arrays new BooleanArrayTransformer().transform(mn); new BooleanArrayIndexTransformer(getArrayFrames(mn)).transform(mn); // Replace all boolean return values logger.info("Transforming Boolean return values"); new BooleanReturnTransformer(this).transform(mn); // GraphPool.clear(className, mn.name + mn.desc); // BytecodeInstructionPool.clear(className, mn.name + mn.desc); // BranchPool.clear(className, mn.name + mn.desc); // Actually this should be done automatically by the ClassWriter... // +2 because we might do a DUP2 mn.maxStack += 1; }
From source file:org.evosuite.instrumentation.coverage.MutationInstrumentation.java
License:Open Source License
private void getFrames(MethodNode mn, String className) { try {/*from ww w. ja va2 s . c o m*/ Analyzer a = new Analyzer( new BooleanValueInterpreter(mn.desc, (mn.access & Opcodes.ACC_STATIC) == Opcodes.ACC_STATIC)); a.analyze(className, mn); this.frames = a.getFrames(); } catch (Exception e) { logger.info("1. Error during analysis: " + e); //e.printStackTrace(); // TODO: Handle error } }