Merge remote-tracking branch 'origin/GP-180-dragonmacher-forward-scoped-flow-fix'

This commit is contained in:
ghidravore
2020-09-18 16:06:06 -04:00
@@ -180,9 +180,9 @@ public class ChkDominanceAlgorithm<V, E extends GEdge<V>> extends AbstractDomina
return results; return results;
} }
private void doGetDominated(V a, HashSet<V> results) { private void doGetDominated(V a, Set<V> results) {
add(a, results); // a node always dominates itself
List<V> dominated = dominatedMap.get(a); List<V> dominated = dominatedMap.get(a);
results.add(a); // a node always dominates itself
dominated.forEach(b -> doGetDominated(b, results)); dominated.forEach(b -> doGetDominated(b, results));
} }
@@ -198,18 +198,20 @@ public class ChkDominanceAlgorithm<V, E extends GEdge<V>> extends AbstractDomina
dominators.add(a); dominators.add(a);
while (a != root) { while (a != root) {
a = getImmediateDominator(a); a = dominatorMap.get(a); // immediate dominator
dominators.add(a); add(a, dominators);
} }
return dominators; return dominators;
} }
private V getImmediateDominator(V v) { private void add(V v, Collection<V> set) {
V dom = dominatorMap.get(v); if (!isDummy(v)) {
if (mutableGraph.isDummy(dom)) { set.add(v);
return null;
} }
return dom; }
private boolean isDummy(V v) {
return v != null && mutableGraph.isDummy(v);
} }
/** /**
@@ -230,15 +232,23 @@ public class ChkDominanceAlgorithm<V, E extends GEdge<V>> extends AbstractDomina
} }
V dominator = getImmediateDominator(v); V dominator = getImmediateDominator(v);
if (!dominator.equals(v)) { if (!Objects.equals(dominator, v)) {
dg.addEdge(new DefaultGEdge<>(dominator, v)); dg.addEdge(new DefaultGEdge<>(dominator, v));
} }
} }
return dg; 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() { public void clear() {
dominatedMap.clear(); dominatedMap.clear();