From 307425c1961e94799e2c1167eabcd749dafcb61d Mon Sep 17 00:00:00 2001 From: dragonmacher <48328597+dragonmacher@users.noreply.github.com> Date: Fri, 18 Sep 2020 15:44:10 -0400 Subject: [PATCH] GP-180 - Graph - fixed Select -> Scoped Flow -> Forward Scoped Flow action by updating the domination graph algorithm to remove dummy nodes in results --- .../graph/algo/ChkDominanceAlgorithm.java | 32 ++++++++++++------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/Ghidra/Framework/Graph/src/main/java/ghidra/graph/algo/ChkDominanceAlgorithm.java b/Ghidra/Framework/Graph/src/main/java/ghidra/graph/algo/ChkDominanceAlgorithm.java index 25fcbd1c14..4b469d1026 100644 --- a/Ghidra/Framework/Graph/src/main/java/ghidra/graph/algo/ChkDominanceAlgorithm.java +++ b/Ghidra/Framework/Graph/src/main/java/ghidra/graph/algo/ChkDominanceAlgorithm.java @@ -180,9 +180,9 @@ public class ChkDominanceAlgorithm> extends AbstractDomina return results; } - private void doGetDominated(V a, HashSet results) { + private void doGetDominated(V a, Set results) { + add(a, results); // a node always dominates itself List dominated = dominatedMap.get(a); - results.add(a); // a node always dominates itself dominated.forEach(b -> doGetDominated(b, results)); } @@ -198,18 +198,20 @@ public class ChkDominanceAlgorithm> extends AbstractDomina dominators.add(a); while (a != root) { - a = getImmediateDominator(a); - dominators.add(a); + a = dominatorMap.get(a); // immediate dominator + add(a, dominators); } return dominators; } - private V getImmediateDominator(V v) { - V dom = dominatorMap.get(v); - if (mutableGraph.isDummy(dom)) { - return null; + private void add(V v, Collection set) { + if (!isDummy(v)) { + set.add(v); } - return dom; + } + + private boolean isDummy(V v) { + return v != null && mutableGraph.isDummy(v); } /** @@ -230,15 +232,23 @@ public class ChkDominanceAlgorithm> extends AbstractDomina } V dominator = getImmediateDominator(v); - if (!dominator.equals(v)) { + if (!Objects.equals(dominator, v)) { dg.addEdge(new DefaultGEdge<>(dominator, v)); } } return dg; } + private V getImmediateDominator(V v) { + V dom = dominatorMap.get(v); + if (isDummy(dom)) { + return null; + } + return dom; + } + /** - * Releases cached values used by internal data structures. + * Releases cached values used by internal data structures */ public void clear() { dominatedMap.clear();