implemented new working destructor for tree
[feisty_meow.git] / nucleus / library / nodes / symbol_tree.cpp
index eb8b64c145392812d6592d681ce89555ea56d8d8..ba5c33f948b8a4c15bedeb13c342b9986e4aad5f 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>
@@ -40,15 +40,6 @@ public:
   symbol_tree_associations(int estimated_elements)
       :  symbol_table<symbol_tree *>(estimated_elements) {}
   virtual ~symbol_tree_associations() {
-
-//hmmm: below was really wrong and things are still wrong because we're letting the symtab destruct our trees?
-//      real thing would be to just toss any pointers referenced in the sym tab here.
-//      OR... not at all because sym tab stores objects, and expects objects, and since a pointer isn't an object it will not auto-delete?
-
-
-//hmmm: why was this here?  was it ever needed?
-//hmmm: maybe it's the missing link?
-
 //probably we don't actually want to whack here???
 //    for (int i = 0; i < symbols(); i++) {
 //      WHACK(use(i));
@@ -63,16 +54,23 @@ symbol_tree::symbol_tree(const astring &node_name, int estimated_elements)
   _associations(new symbol_tree_associations(estimated_elements)),
   _name(new astring(node_name))
 {
+  FUNCDEF("constructor")
 }
 
 symbol_tree::~symbol_tree()
 {
   FUNCDEF("destructor");
-LOG("symtree dtor: prior to whacks");
+#ifdef DEBUG_SYMBOL_TREE
+  LOG("symtree dtor: prior to whacks");
+#endif
   WHACK(_associations);
-LOG("symtree dtor: after whacking associations");
+#ifdef DEBUG_SYMBOL_TREE
+  LOG("symtree dtor: after whacking associations");
+#endif
   WHACK(_name);
-LOG("symtree dtor: after all whacks");
+#ifdef DEBUG_SYMBOL_TREE
+  LOG("symtree dtor: after all whacks");
+#endif
 }
 
 int symbol_tree::children() const { return _associations->symbols(); }
@@ -103,26 +101,33 @@ 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.");
+    LOG(astring("zapping node for ") + to_zap->name());
 #endif
-    throw("error: symbol_tree::prune: wrong type of node in prune");
-  }
+    int found = which(to_zap);  // find the node in the tree.
+    if (negative(found)) return common::NOT_FOUND;  // not found.
+#ifdef DEBUG_SYMBOL_TREE
+    int kids = _associations->symbols();
+#endif
+    _associations->whack(to_zap->name());  // remove from associations.
 #ifdef DEBUG_SYMBOL_TREE
-  LOG(astring("zapping node for ") + to_zap->name());
+    if (kids - 1 != _associations->symbols())
+      throw("error: symbol_tree::prune: failed to crop kid in symtab");
 #endif
-  int found = which(to_zap);  // find the node in the tree.
-  if (negative(found)) return common::NOT_FOUND;  // not found.
+  } else { 
 #ifdef DEBUG_SYMBOL_TREE
-  int kids = _associations->symbols();
+    LOG("skip symtree prune steps due to null symtree after dynamic cast.");
 #endif
-  _associations->whack(to_zap->name());  // remove from associations.
+///hmmm: how about not?    throw("error: symbol_tree::prune: wrong type of node in prune");
+  }
 #ifdef DEBUG_SYMBOL_TREE
-  if (kids - 1 != _associations->symbols())
-    throw("error: symbol_tree::prune: failed to crop kid in symtab");
+  LOG("about to call base tree::prune...");
 #endif
   tree::prune(to_zap);  // remove from tree.
+#ifdef DEBUG_SYMBOL_TREE
+  LOG("after called base tree::prune.");
+#endif
   return common::OKAY;
 }