problem was new, cleaner, smarter tree destructor
[feisty_meow.git] / nucleus / library / nodes / symbol_tree.cpp
index 947d4530463ea09978255639f9d77bf124db8b4f..eb8b64c145392812d6592d681ce89555ea56d8d8 100644 (file)
@@ -24,7 +24,7 @@
 
 #include <loggers/program_wide_logger.h>
 #undef LOG
-#define LOG(s) CLASS_EMERGENCY_LOG(program_wide_logger::get(), s)
+#define LOG(s) CLASS_EMERGENCY_LOG(program_wide_logger::get(), astring(s) + a_sprintf(" [obj=%p]", this))
 using namespace loggers;
 
 using namespace basis;
@@ -33,12 +33,23 @@ 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: 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));
 //    }
@@ -57,10 +68,11 @@ symbol_tree::symbol_tree(const astring &node_name, int estimated_elements)
 symbol_tree::~symbol_tree()
 {
   FUNCDEF("destructor");
-LOG("prior to whacks");
+LOG("symtree dtor: prior to whacks");
   WHACK(_associations);
+LOG("symtree dtor: after whacking associations");
   WHACK(_name);
-LOG("after whacks");
+LOG("symtree dtor: after all whacks");
 }
 
 int symbol_tree::children() const { return _associations->symbols(); }
@@ -91,8 +103,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