use of org.candle.decompiler.intermediate.graph.context.IntermediateGraphContext 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);
}
use of org.candle.decompiler.intermediate.graph.context.IntermediateGraphContext in project candle-decompiler by bradsdavis.
the class IntermediateGraphTransformer method getIntermediateGraphContext.
public IntermediateGraphContext getIntermediateGraphContext() {
Map<InstructionHandle, AbstractIntermediate> nodeMapping = new HashMap<InstructionHandle, AbstractIntermediate>();
ListenableDirectedGraph<AbstractIntermediate, IntermediateEdge> intermediateGraph = new ListenableDirectedGraph<AbstractIntermediate, IntermediateEdge>(IntermediateEdge.class);
// walk the instruction graph and generate the intermediate graph. start by walking and adding all vertices. Then, add the connections between the vertices.
for (InstructionHandle ih : igc.getGraph().vertexSet()) {
if (igc.hasIntermediate(ih)) {
AbstractIntermediate vertex = igc.getIntermediateFromInstruction(ih);
intermediateGraph.addVertex(vertex);
nodeMapping.put(ih, vertex);
}
}
// now, add the links.
for (InstructionHandle ih : igc.getGraph().vertexSet()) {
AbstractIntermediate nodeIntermediate = nodeMapping.get(ih);
if (nodeIntermediate == null) {
LOG.warn("This shouldn't be...");
continue;
}
List<InstructionHandle> predecessors = igc.getPredecessors(ih);
List<InstructionHandle> successors = igc.getSuccessors(ih);
for (InstructionHandle predecessor : predecessors) {
// find it's AbstractIntermediate.
AbstractIntermediate predIntermediate = nodeMapping.get(predecessor);
if (predIntermediate == null) {
// then something is wrong.
LOG.warn("This shouldn't be...");
continue;
}
IntermediateEdge insEdge = igc.getGraph().getEdge(predecessor, ih);
// add an edge to the intermediate graph.
if (intermediateGraph.containsEdge(predIntermediate, nodeIntermediate)) {
continue;
}
intermediateGraph.addEdge(predIntermediate, nodeIntermediate, (IntermediateEdge) insEdge.clone());
}
for (InstructionHandle successor : successors) {
// find it's AbstractIntermediate.
AbstractIntermediate successorIntermediate = nodeMapping.get(successor);
if (successorIntermediate == null) {
LOG.warn("This shouldn't be...");
continue;
}
if (intermediateGraph.containsEdge(nodeIntermediate, successorIntermediate)) {
continue;
}
IntermediateEdge insEdge = igc.getGraph().getEdge(ih, successor);
// add an edge to the intermediate graph.
intermediateGraph.addEdge(nodeIntermediate, successorIntermediate, (IntermediateEdge) insEdge.clone());
}
}
return new IntermediateGraphContext(intermediateGraph);
}
Aggregations