bool ANode::merge(ANode* node_dst, ANode* node_src) { // Do we really want this? //if (!IsMergable(node_dst, node_src)) { // return false; //} // Perform the merge // 1. Move all children of 'node_src' into 'node_dst' for (ANodeChildIterator it(node_src); it.Current(); /* */) { ANode* x = it.current(); it++; // advance iterator so we can unlink 'x' x->unlink(); x->link(node_dst); } // 2. If merging ACodeNodes, update line ranges ACodeNode* dst0 = dynamic_cast<ACodeNode*>(node_dst); ACodeNode* src0 = dynamic_cast<ACodeNode*>(node_src); DIAG_Assert(Logic::equiv(dst0, src0), "Invariant broken!"); if (dst0 && src0) { SrcFile::ln begLn = std::min(dst0->begLine(), src0->begLine()); SrcFile::ln endLn = std::max(dst0->endLine(), src0->endLine()); dst0->setLineRange(begLn, endLn); dst0->vmaSet().merge(src0->vmaSet()); // merge VMAs } // 3. Unlink 'node_src' from the tree and delete it node_src->unlink(); delete node_src; return true; }
void ANode::pruneByMetrics() { for (ANodeChildIterator it(this); it.Current(); /* */) { ANode* x = it.current(); it++; // advance iterator -- it is pointing at 'x' if (x->hasMetrics()) { x->pruneByMetrics(); } else { x->unlink(); // unlink 'x' from tree delete x; } } }