internal ControlFlowGraph(ControlFlowNode[] nodes) { this.nodes = new ReadOnlyCollection<ControlFlowNode>(nodes); Debug.Assert(EntryPoint.NodeType == ControlFlowNodeType.EntryPoint); Debug.Assert(RegularExit.NodeType == ControlFlowNodeType.RegularExit); Debug.Assert(ExceptionalExit.NodeType == ControlFlowNodeType.ExceptionalExit); }
/// <summary> /// Gets whether <c>this</c> dominates <paramref name="node"/>. /// </summary> public bool Dominates(ControlFlowNode node) { // TODO: this can be made O(1) by numbering the dominator tree ControlFlowNode tmp = node; while (tmp != null) { if (tmp == this) return true; tmp = tmp.ImmediateDominator; } return false; }
internal ControlFlowNode(int blockIndex, ExceptionHandler exceptionHandler, ControlFlowNode endFinallyOrFaultNode) { this.BlockIndex = blockIndex; this.NodeType = endFinallyOrFaultNode != null ? ControlFlowNodeType.FinallyOrFaultHandler : ControlFlowNodeType.CatchHandler; this.ExceptionHandler = exceptionHandler; this.EndFinallyOrFaultNode = endFinallyOrFaultNode; Debug.Assert((exceptionHandler.HandlerType == ExceptionHandlerType.Finally || exceptionHandler.HandlerType == ExceptionHandlerType.Fault) == (endFinallyOrFaultNode != null)); this.Offset = exceptionHandler.HandlerStart.Offset; }
static ControlFlowNode FindCommonDominator(ControlFlowNode b1, ControlFlowNode b2) { // Here we could use the postorder numbers to get rid of the hashset, see "A Simple, Fast Dominance Algorithm" HashSet<ControlFlowNode> path1 = new HashSet<ControlFlowNode>(); while (b1 != null && path1.Add(b1)) b1 = b1.ImmediateDominator; while (b2 != null) { if (path1.Contains(b2)) return b2; else b2 = b2.ImmediateDominator; } throw new Exception("No common dominator found!"); }