diff --git a/tree_node.cpp b/tree_node.cpp index caf86e33b..edbd382b2 100644 --- a/tree_node.cpp +++ b/tree_node.cpp @@ -2,20 +2,12 @@ #include "expression_node.h" void TreeNode::release() { - printf("releasing of %d(%p)\n", m_identifier, this); + printf("Releasing of %d(%p)\n", m_identifier, this); m_referenceCounter--; if (m_referenceCounter == 0) { -#if 0 - for (TreeNode * child : directChildren()) { - // BUG FIXME - // Here, if we end up delete-ing the node - // then the 'next child' is wrong... - child->release(); - } -#endif if (numberOfChildren() != 0) { int lastIdentifier = lastDescendant()->identifier(); - TreeNode * child = this; + TreeNode * child = next(); do { bool childWillBeDeleted = (child->m_referenceCounter == 1); child->release(); diff --git a/tree_node.h b/tree_node.h index 573cc3a50..de27920e4 100644 --- a/tree_node.h +++ b/tree_node.h @@ -59,7 +59,6 @@ public: public: using TreeNode::Iterator::Iterator; Iterator & operator++() { - // printf(" Iterating from %d(%p) to %d(%p)\n", m_node->m_identifier, m_node, m_node->next()->m_identifier, m_node->next()); m_node = m_node->next(); return *this; } @@ -88,6 +87,7 @@ public: void retain() { m_referenceCounter++; } + void release(); void rename(int identifier) { @@ -107,7 +107,7 @@ public: assert(i >= 0); assert(i < numberOfChildren()); TreeNode * child = next(); - while (i>0) { + while (i > 0) { child = child->nextSibling(); assert(child != nullptr); i--; @@ -143,15 +143,11 @@ public: TreeNode * lastDescendant() const { TreeNode * node = const_cast(this); - - int remainingNodesToVisit = 0; - while (true) { - remainingNodesToVisit += node->numberOfChildren(); - if (remainingNodesToVisit == 0) { - return node; - } + int remainingNodesToVisit = node->numberOfChildren(); + while (remainingNodesToVisit > 0) { node = node->next(); remainingNodesToVisit--; + remainingNodesToVisit += node->numberOfChildren(); } return node; }