diff --git a/src/widgets/DisassemblerGraphView.cpp b/src/widgets/DisassemblerGraphView.cpp index c184385c..80d1edb4 100644 --- a/src/widgets/DisassemblerGraphView.cpp +++ b/src/widgets/DisassemblerGraphView.cpp @@ -310,6 +310,7 @@ void DisassemblerGraphView::loadCurrentGraph() addBlock(gb); } + cleanupEdges(); if (!func["blocks"].toArray().isEmpty()) { computeGraph(entry); @@ -355,6 +356,25 @@ void DisassemblerGraphView::prepareGraphNode(GraphBlock &block) block.height = (height * charHeight) + extra; } +void DisassemblerGraphView::cleanupEdges() +{ + for (auto &blockIt : blocks) { + auto &block = blockIt.second; + auto outIt = block.edges.begin(); + std::unordered_set seenEdges; + for (auto it = block.edges.begin(), end = block.edges.end(); it != end; ++it) { + // remove edges going to different functions + // and remove duplicate edges, common in switch statements + if (blocks.find(it->target) != blocks.end() && + seenEdges.find(it->target) == seenEdges.end()) { + *outIt++ = *it; + seenEdges.insert(it->target); + } + } + block.edges.erase(outIt, block.edges.end()); + } +} + void DisassemblerGraphView::prepareHeader() { QString afcf = Core()->cmd("afcf").trimmed(); diff --git a/src/widgets/DisassemblerGraphView.h b/src/widgets/DisassemblerGraphView.h index 74d0893d..c6bf2426 100644 --- a/src/widgets/DisassemblerGraphView.h +++ b/src/widgets/DisassemblerGraphView.h @@ -158,6 +158,7 @@ private: void initFont(); void prepareGraphNode(GraphBlock &block); + void cleanupEdges(); void prepareHeader(); Token *getToken(Instr *instr, int x); QPoint getTextOffset(int line) const;