Commit 4c4af792 authored by Skylot's avatar Skylot

core: fix dot graph dump

parent a0d8d9fc
......@@ -8,7 +8,6 @@ import jadx.core.dex.nodes.RootNode;
import jadx.core.dex.visitors.IDexTreeVisitor;
import jadx.core.dex.visitors.SaveCode;
import jadx.core.utils.ErrorsCounter;
import jadx.core.utils.exceptions.CodegenException;
import jadx.core.utils.exceptions.DecodeException;
import jadx.core.utils.exceptions.JadxRuntimeException;
import jadx.core.utils.files.InputFile;
......@@ -116,21 +115,12 @@ public final class Decompiler {
LOG.info("processing ...");
ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(threadsCount);
for (final ClassNode cls : root.getClasses(false)) {
if (cls.getCode() == null) {
Runnable job = new Runnable() {
executor.execute(new Runnable() {
@Override
public void run() {
ProcessClass.process(cls, passList);
}
};
executor.execute(job);
} else {
try {
savePass.visit(cls);
} catch (CodegenException e) {
LOG.error("Can't save class {}", cls, e);
}
}
});
}
executor.shutdown();
return executor;
......
......@@ -23,15 +23,11 @@ import java.util.Set;
public class DotGraphVisitor extends AbstractVisitor {
private static final String NL = "\\l";
private static final boolean PRINT_REGISTERS_STATES = false;
private final File dir;
private final boolean useRegions;
private final boolean rawInsn;
private CodeWriter dot;
private CodeWriter conn;
public DotGraphVisitor(File outDir, boolean useRegions, boolean rawInsn) {
this.dir = outDir;
this.useRegions = useRegions;
......@@ -47,9 +43,14 @@ public class DotGraphVisitor extends AbstractVisitor {
if (mth.isNoCode()) {
return;
}
dot = new CodeWriter();
conn = new CodeWriter();
new DumpDotGraph().process(mth);
}
private class DumpDotGraph {
private CodeWriter dot = new CodeWriter();
private CodeWriter conn = new CodeWriter();
public void process(MethodNode mth) {
dot.startLine("digraph \"CFG for");
dot.add(escape(mth.getParentClass().getFullName() + "." + mth.getMethodInfo().getShortId()));
dot.add("\" {");
......@@ -61,7 +62,7 @@ public class DotGraphVisitor extends AbstractVisitor {
processMethodRegion(mth);
} else {
for (BlockNode block : mth.getBasicBlocks()) {
processBlock(mth, block);
processBlock(mth, block, false);
}
}
......@@ -131,25 +132,12 @@ public class DotGraphVisitor extends AbstractVisitor {
dot.startLine('}');
} else if (region instanceof BlockNode) {
processBlock(mth, (BlockNode) region);
}
processBlock(mth, (BlockNode) region, false);
}
private void processBlock(MethodNode mth, BlockNode block) {
processBlock(mth, block, false);
}
private void processBlock(MethodNode mth, BlockNode block, boolean error) {
String attrs = attributesString(block);
if (PRINT_REGISTERS_STATES) {
if (block.getStartState() != null) {
if (attrs.length() != 0) {
attrs += "|";
}
attrs += escape("RS: " + block.getStartState()) + NL;
attrs += escape("RE: " + block.getEndState()) + NL;
}
}
dot.startLine(makeName(block));
dot.add(" [shape=record,");
if (error) {
......@@ -189,7 +177,7 @@ public class DotGraphVisitor extends AbstractVisitor {
return attrs.toString();
}
private static String makeName(IContainer c) {
private String makeName(IContainer c) {
String name;
if (c instanceof BlockNode) {
name = "Node_" + ((BlockNode) c).getId();
......@@ -218,7 +206,7 @@ public class DotGraphVisitor extends AbstractVisitor {
}
}
private static String escape(String string) {
private String escape(String string) {
return string
.replace("\\", "") // TODO replace \"
.replace("/", "\\/")
......@@ -229,4 +217,5 @@ public class DotGraphVisitor extends AbstractVisitor {
.replace("|", "\\|")
.replace("\n", NL);
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment