tracking down issues in sym tree destructor still
authorChris Koeritz <fred@gruntose.com>
Wed, 29 Sep 2021 05:19:56 +0000 (01:19 -0400)
committerChris Koeritz <fred@gruntose.com>
Wed, 29 Sep 2021 05:19:56 +0000 (01:19 -0400)
something definitely not right; we have shown that at least.

nucleus/library/nodes/symbol_tree.cpp
nucleus/library/nodes/tree.cpp
nucleus/library/tests_nodes/test_symbol_tree.cpp

index 947d4530463ea09978255639f9d77bf124db8b4f..bd985a27a1c883f6790849ff8b2ab9c65b5c5a2b 100644 (file)
@@ -19,7 +19,7 @@
 #include <textual/parser_bits.h>
 #include <textual/string_manipulation.h>
 
-#define DEBUG_SYMBOL_TREE
+//#define DEBUG_SYMBOL_TREE
   // uncomment for totally noisy version.
 
 #include <loggers/program_wide_logger.h>
@@ -33,12 +33,14 @@ using namespace textual;
 
 namespace nodes {
 
+//hmmm: used for... explain please.
 class symbol_tree_associations : public symbol_table<symbol_tree *>
 {
 public:
   symbol_tree_associations(int estimated_elements)
       :  symbol_table<symbol_tree *>(estimated_elements) {}
   virtual ~symbol_tree_associations() {
+//hmmm: why was this here?  was it ever needed?
 //    for (int i = 0; i < symbols(); i++) {
 //      WHACK(use(i));
 //    }
@@ -91,8 +93,12 @@ outcome symbol_tree::prune(tree *to_zap_in)
   FUNCDEF("prune");
 #endif
   symbol_tree *to_zap = dynamic_cast<symbol_tree *>(to_zap_in);
-  if (!to_zap)
+  if (!to_zap) {
+#ifdef DEBUG_SYMBOL_TREE
+    LOG("about to barf due to null symtree after dynamic cast.");
+#endif
     throw("error: symbol_tree::prune: wrong type of node in prune");
+  }
 #ifdef DEBUG_SYMBOL_TREE
   LOG(astring("zapping node for ") + to_zap->name());
 #endif
index 08dd6df0b431bf5d1389ae46ce1647bc351c69bb..7398274bd6e101f324c88e146dad9d32bf095860 100644 (file)
@@ -19,7 +19,7 @@
 #include <basis/guards.h>
 #include <loggers/program_wide_logger.h>
 
-#define DEBUG_TREE
+//#define DEBUG_TREE
   // uncomment if you want lots of debugging info.
 
 #undef LOG
@@ -56,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) {
@@ -284,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
@@ -301,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;
@@ -309,11 +311,8 @@ tree::~tree()
     // or there are no kids at all.
     curr_node = curr_node->branch(0);
 
-LOG(a_sprintf("loop traverse on %p", curr_node));
-
     if (curr_node == NULL_POINTER) {
       // wayback has no children, so we can take action.
-LOG(a_sprintf("inside null condition, loop traverse on %p", curr_node));
 
       // if wayback is the same as "this", then we exit from iterations since
       // we've cleaned all the kids out.
@@ -326,19 +325,14 @@ LOG(a_sprintf("inside null condition, loop traverse on %p", curr_node));
       // 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); }
index bc938d1d80eefbea49a430a403bd700fb878ca57..fa4a5c8cb40c198b7db12eb60b45a14a365629d8 100644 (file)
@@ -28,9 +28,6 @@
 #include <textual/string_manipulation.h>
 #include <unit_test/unit_base.h>
 
-//#include <stdio.h>
-//#include <stdlib.h>
-
 using namespace application;
 using namespace basis;
 using namespace filesystem;
@@ -60,12 +57,11 @@ public:
 int test_symbol_tree::execute()
 {
   FUNCDEF("execute");
-  LOG("please check memory usage and record it, then hit a key to start testing.");
 
   try {
-    // creates a crazy tree with only one branch per node, but 40,000 deep.
-    symbol_tree t("blork");
-    symbol_tree *curr = &t;
+    // creates a crazy tree with only one branch per node, but hugely deep.
+    symbol_tree *t = new symbol_tree("blork");
+    symbol_tree *curr = t;
     for (int i = 0; i < MAX_NODES_TESTED; i++) {
       // if the current node has any branches, we'll jump on one as the next
       // place.
@@ -77,17 +73,16 @@ int test_symbol_tree::execute()
       astring rando = string_manipulation::make_random_name(1, 10);
       curr->add(new symbol_tree(rando));
     }
-    LOG("check memory usage now with full size.  then hit a key.");
+LOG("about to whack dynamic tree...");
+    WHACK(t);
+LOG("dynamic tree whacked.");
   } catch (...) {
     LOG("crashed during tree stuffing.");
     return 1;
   }
 
-  LOG("check memory usage after the run.  then hit a key to end "
-      "the program.");
-
-//create a more balanced tree structure...
-//perform known operations and validate shape of tree.
+//hmmm: create a more balanced tree structure...
+//      perform known operations and validate shape of tree.
 
   return final_report();
 }