void PropagateDefUseChainUpdate( DefUseChain<Node> *graph, UpdateDefUseChainNode<Node>& update) { std::set<Node*> worklist; AppendWorkListWrap<Node> append(worklist); update.init(append); while (worklist.size()) { Node* cur = *worklist.begin(); worklist.erase(worklist.begin()); if (cur->is_definition()) { for (GraphNodeSuccessorIterator<DefUseChain<Node> > usep(graph,cur); !usep.ReachEnd(); ++usep) { Node* use = *usep; if (use->is_definition()) continue; GraphNodePredecessorIterator<DefUseChain<Node> > defp(graph,use); Node *tmp = *defp; ++defp; if (defp.ReachEnd()) { assert( tmp == cur); update.update_use_node(use, cur, append); } } } else { GraphNodePredecessorIterator<DefUseChain<Node> > defp(graph,cur); if (defp.ReachEnd()) { if (DebugDefUseChain()) { std::cerr << "Error: use of reference with no definition: "; cur->Dump(); std::cerr << std::endl; } } else { // Node* def = *defp; if (!defp.ReachEnd()) { Node* def = *defp; ++defp; if (defp.ReachEnd()) { if (update.update_def_node(def, cur, append)) append(def); } } } } } }
void AstRefDType::dump(ostream& str) { this->AstNodeDType::dump(str); if (defp()) { str<<" -> "; defp()->dump(str); } else { str<<" -> UNLINKED"; } }