tracking down issues in sym tree destructor still
[feisty_meow.git] / nucleus / library / nodes / tree.cpp
index 59ca5d70cc3cae4b1c337e2ea45880cab53859b4..7398274bd6e101f324c88e146dad9d32bf095860 100644 (file)
@@ -17,6 +17,7 @@
 #include <basis/common_outcomes.h>
 #include <basis/functions.h>
 #include <basis/guards.h>
+#include <loggers/program_wide_logger.h>
 
 //#define DEBUG_TREE
   // uncomment if you want lots of debugging info.
@@ -25,6 +26,7 @@
 #define LOG(s) CLASS_EMERGENCY_LOG(program_wide_logger::get(), s)
 
 using namespace basis;
+using namespace loggers;
 
 namespace nodes {
 
@@ -54,8 +56,8 @@ bool tree::iterator::next_node(tree *&to_return)
 #ifdef DEBUG_TREE
   if ( (_order != to_branches)
       && (_order != reverse_branches) ) {
-    if (_aim == AWAY_FROM_ROOT) LOG("going down")
-    else LOG("going up");
+    if (_aim == AWAY_FROM_ROOT) LOG("going down...")
+    else LOG("going up...");
   }
 #endif
   switch (_order) {
@@ -274,6 +276,7 @@ tree::tree()
 
 tree::~tree()
 {
+  FUNCDEF("destructor");
   // must at least unhook ourselves from the parent so we don't become a lost
   // cousin.
   tree *my_parent = parent();
@@ -281,6 +284,7 @@ tree::~tree()
   my_parent = NULL_POINTER;  // disavow since we are loose now.
 
 #if 0
+  //hmmm: clean this code when it's been examined long enough.  maybe already.
 
   //original version suffers from being too recursive on windoze,
   //which blows out the stack.  linux never showed this problem.  so, i
@@ -298,6 +302,7 @@ tree::~tree()
   // newer version of delete doesn't recurse; it just iterates instead,
   // which avoids the massive recursive depth of the original approach.
   tree *curr_node = this;
+  tree *stop_node = this;  // don't whack self.
   while (curr_node != NULL_POINTER) {
     // make a breadcrumb for getting back to 'here' in the tree.
     tree *way_back = curr_node;
@@ -306,7 +311,7 @@ tree::~tree()
     // or there are no kids at all.
     curr_node = curr_node->branch(0);
 
-    if (curr_node = NULL_POINTER) {
+    if (curr_node == NULL_POINTER) {
       // wayback has no children, so we can take action.
 
       // if wayback is the same as "this", then we exit from iterations since
@@ -320,19 +325,14 @@ tree::~tree()
       // our remit, since wayback is not the same node as the top level one
       // in the destructor (as long as there are no cycles in the tree...).
       curr_node = way_back->parent();  // go up in tree on next iteration.
-      delete way_back;  // whack a node, finally.
-
+      WHACK(way_back);  // whack a node, finally.
     } else {
       // okay, there's a node below here.  we will spider down to it.
       continue;
     }
-
-
   }
 
 #endif
-
-
 }
 
 tree *tree::parent() const { return (tree *)get_link(BACKWARDS_BRANCH); }