/// <summary> /// Constructs the data-flow graph node from the specified control-flow graph node. /// </summary> private void Construct(IControlFlowNode cfgNode, DataFlowNode previous, Dictionary <IControlFlowNode, DataFlowNode> visited) { visited.Add(cfgNode, this); if (cfgNode.Statements.Count > 0) { this.Statement = cfgNode.Statements[0]; } previous = this; for (int idx = 1; idx < cfgNode.Statements.Count; idx++) { var nextNode = new DataFlowNode(this.Graph, cfgNode, this.Summary); nextNode.Statement = cfgNode.Statements[idx]; previous.ISuccessors.Add(nextNode); nextNode.IPredecessors.Add(previous); previous = nextNode; } foreach (var successor in cfgNode.ISuccessors) { if (visited.ContainsKey(successor)) { previous.ISuccessors.Add(visited[successor]); visited[successor].IPredecessors.Add(previous); continue; } var nextNode = new DataFlowNode(this.Graph, successor, this.Summary); nextNode.Construct(successor, previous, visited); previous.ISuccessors.Add(nextNode); nextNode.IPredecessors.Add(previous); } }
/// <summary> /// Creates the control-flow graph nodes of the specified method summary. /// </summary> internal static IDataFlowNode Create(DataFlowGraph dfg, MethodSummary summary) { var entryNode = new DataFlowNode(dfg, summary.ControlFlowGraph.EntryNode, summary); entryNode.Construct(summary.ControlFlowGraph.EntryNode, null, new Dictionary <IControlFlowNode, DataFlowNode>()); return(entryNode); }