Search in sources :

Example 1 with MethodBlock

use of org.candle.decompiler.ast.MethodBlock in project candle-decompiler by bradsdavis.

the class ClassIntermediateVisitor method extractMethodSignature.

protected MethodBlock extractMethodSignature(MethodGen methodGen) {
    MethodBlock mb = null;
    boolean isConstructor = false;
    ConstantPoolGen cpg = methodGen.getConstantPool();
    LocalVariableTable lvt = methodGen.getLocalVariableTable(cpg);
    String access = Utility.accessToString(methodGen.getAccessFlags());
    String signature = Type.getMethodSignature(methodGen.getType(), methodGen.getArgumentTypes());
    String name = methodGen.getName();
    if (StringUtils.equals(name, Constants.CONSTRUCTOR_NAME)) {
        name = StringUtils.substringAfterLast(methodGen.getClassName(), ".");
        isConstructor = true;
    }
    if (StringUtils.equals(methodGen.getName(), Constants.STATIC_INITIALIZER_NAME)) {
        signature = "static ";
    } else {
        signature = org.apache.bcel.classfile.Utility.methodSignatureToString(signature, name, access, true, lvt);
    }
    StringBuilder builder = new StringBuilder(signature);
    if (methodGen.getExceptions().length > 0) {
        for (String excep : methodGen.getExceptions()) {
            builder.append(" throws ").append(excep);
        }
    }
    if (isConstructor) {
        mb = new ConstructorBlock(builder.toString(), methodGen.getInstructionList().getEnd().getPosition());
    } else {
        mb = new MethodBlock(builder.toString(), methodGen.getInstructionList().getEnd().getPosition());
    }
    return mb;
}
Also used : LocalVariableTable(org.apache.bcel.classfile.LocalVariableTable) MethodBlock(org.candle.decompiler.ast.MethodBlock) ConstantPoolGen(org.apache.bcel.generic.ConstantPoolGen) ConstructorBlock(org.candle.decompiler.ast.ConstructorBlock)

Example 2 with MethodBlock

use of org.candle.decompiler.ast.MethodBlock in project candle-decompiler by bradsdavis.

the class ClassIntermediateVisitor method visitMethod.

@Override
public void visitMethod(Method obj) {
    MethodGen methodGenerator = new MethodGen(obj, this.javaClass.getClassName(), this.constantPool);
    LOG.debug("Processing MethodInvocation: " + methodGenerator.toString());
    IntermediateContext intermediateContext = new IntermediateContext(this.javaClass, methodGenerator);
    InstructionList instructions = methodGenerator.getInstructionList();
    instructions.setPositions(true);
    InstructionGraphFactory igf = new InstructionGraphFactory(instructions, methodGenerator.getExceptionHandlers());
    InstructionGraphContext igc = igf.process();
    List<InstructionGraphEnhancer> iges = new ArrayList<InstructionGraphEnhancer>();
    iges.add(new InstructionGraphWriter(igc, "before.dot"));
    iges.add(new SplitInstructionEnhancer(igc));
    iges.add(new ConditionEdgeEnhancer(igc));
    iges.add(new ExceptionEdgeEnhancer(igc, methodGenerator.getExceptionHandlers()));
    iges.add(new InstructionToIntermediateEnhancer(igc, intermediateContext));
    iges.add(new BackEdgeEnhancer(igc));
    iges.add(new LoopHeader(igc));
    iges.add(new ContinuousLoop(igc));
    iges.add(new NonIntermediateEliminator(igc));
    iges.add(new InstructionGraphWriter(igc, "after.dot"));
    for (InstructionGraphEnhancer ige : iges) {
        ige.process();
    }
    IntermediateGraphTransformer igt = new IntermediateGraphTransformer(igc);
    IntermediateGraphContext interGraphContext = igt.getIntermediateGraphContext();
    processIntermediate(interGraphContext);
    MethodBlock method = extractMethodSignature(methodGenerator);
    BlockVisitor iv = new BlockVisitor(interGraphContext, method);
    iv.process();
    classBlock.addChild(method);
    method.setParent(classBlock);
}
Also used : InstructionGraphEnhancer(org.candle.decompiler.instruction.graph.enhancer.InstructionGraphEnhancer) IntermediateGraphTransformer(org.candle.decompiler.intermediate.graph.IntermediateGraphTransformer) MethodBlock(org.candle.decompiler.ast.MethodBlock) BackEdgeEnhancer(org.candle.decompiler.instruction.graph.enhancer.BackEdgeEnhancer) InstructionGraphWriter(org.candle.decompiler.instruction.graph.enhancer.InstructionGraphWriter) InstructionList(org.apache.bcel.generic.InstructionList) ContinuousLoop(org.candle.decompiler.instruction.graph.enhancer.ContinuousLoop) ArrayList(java.util.ArrayList) MethodGen(org.apache.bcel.generic.MethodGen) SplitInstructionEnhancer(org.candle.decompiler.instruction.graph.enhancer.SplitInstructionEnhancer) InstructionToIntermediateEnhancer(org.candle.decompiler.instruction.graph.enhancer.InstructionToIntermediateEnhancer) InstructionGraphContext(org.candle.decompiler.instruction.graph.InstructionGraphContext) IntermediateGraphContext(org.candle.decompiler.intermediate.graph.context.IntermediateGraphContext) ConditionEdgeEnhancer(org.candle.decompiler.instruction.graph.enhancer.ConditionEdgeEnhancer) InstructionGraphFactory(org.candle.decompiler.instruction.graph.InstructionGraphFactory) NonIntermediateEliminator(org.candle.decompiler.instruction.graph.enhancer.NonIntermediateEliminator) ExceptionEdgeEnhancer(org.candle.decompiler.instruction.graph.enhancer.ExceptionEdgeEnhancer) LoopHeader(org.candle.decompiler.instruction.graph.enhancer.LoopHeader) BlockVisitor(org.candle.decompiler.ast.BlockVisitor)

Aggregations

MethodBlock (org.candle.decompiler.ast.MethodBlock)2 ArrayList (java.util.ArrayList)1 LocalVariableTable (org.apache.bcel.classfile.LocalVariableTable)1 ConstantPoolGen (org.apache.bcel.generic.ConstantPoolGen)1 InstructionList (org.apache.bcel.generic.InstructionList)1 MethodGen (org.apache.bcel.generic.MethodGen)1 BlockVisitor (org.candle.decompiler.ast.BlockVisitor)1 ConstructorBlock (org.candle.decompiler.ast.ConstructorBlock)1 InstructionGraphContext (org.candle.decompiler.instruction.graph.InstructionGraphContext)1 InstructionGraphFactory (org.candle.decompiler.instruction.graph.InstructionGraphFactory)1 BackEdgeEnhancer (org.candle.decompiler.instruction.graph.enhancer.BackEdgeEnhancer)1 ConditionEdgeEnhancer (org.candle.decompiler.instruction.graph.enhancer.ConditionEdgeEnhancer)1 ContinuousLoop (org.candle.decompiler.instruction.graph.enhancer.ContinuousLoop)1 ExceptionEdgeEnhancer (org.candle.decompiler.instruction.graph.enhancer.ExceptionEdgeEnhancer)1 InstructionGraphEnhancer (org.candle.decompiler.instruction.graph.enhancer.InstructionGraphEnhancer)1 InstructionGraphWriter (org.candle.decompiler.instruction.graph.enhancer.InstructionGraphWriter)1 InstructionToIntermediateEnhancer (org.candle.decompiler.instruction.graph.enhancer.InstructionToIntermediateEnhancer)1 LoopHeader (org.candle.decompiler.instruction.graph.enhancer.LoopHeader)1 NonIntermediateEliminator (org.candle.decompiler.instruction.graph.enhancer.NonIntermediateEliminator)1 SplitInstructionEnhancer (org.candle.decompiler.instruction.graph.enhancer.SplitInstructionEnhancer)1