X-Git-Url: https://feistymeow.org/gitweb/?a=blobdiff_plain;f=nucleus%2Flibrary%2Fnodes%2Fsymbol_tree.cpp;h=eb8b64c145392812d6592d681ce89555ea56d8d8;hb=84fc634d86157509079210d5b103deaa2122f9b7;hp=dd96fea511897215f0da01d23000bf2bafb5f3b5;hpb=5a8e13e7a44ed98d9683bc6cd3bb374e9d3b0756;p=feisty_meow.git diff --git a/nucleus/library/nodes/symbol_tree.cpp b/nucleus/library/nodes/symbol_tree.cpp index dd96fea5..eb8b64c1 100644 --- a/nucleus/library/nodes/symbol_tree.cpp +++ b/nucleus/library/nodes/symbol_tree.cpp @@ -19,12 +19,12 @@ #include #include -//#define DEBUG_SYMBOL_TREE +#define DEBUG_SYMBOL_TREE // uncomment for totally noisy version. #include #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 { public: symbol_tree_associations(int estimated_elements) : symbol_table(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(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 @@ -141,7 +157,7 @@ symbol_tree *symbol_tree::find(const astring &to_find, find_methods how, #ifdef DEBUG_SYMBOL_TREE FUNCDEF("find"); #endif - if (comp == NIL) comp = astring_comparator; + if (comp == NULL_POINTER) comp = astring_comparator; #ifdef DEBUG_SYMBOL_TREE LOG(astring("finding node called ") + to_find); #endif @@ -151,7 +167,7 @@ symbol_tree *symbol_tree::find(const astring &to_find, find_methods how, // perform the upward recursion first, since it's pretty simple. if (how == recurse_upward) { symbol_tree *our_parent = dynamic_cast(parent()); - if (!our_parent) return NIL; // done recursing. + if (!our_parent) return NULL_POINTER; // done recursing. return our_parent->find(to_find, how, comp); } @@ -164,7 +180,7 @@ symbol_tree *symbol_tree::find(const astring &to_find, find_methods how, if (!found) { if (how == recurse_downward) { // see if we can't find that name in a sub-node. - symbol_tree *answer = NIL; + symbol_tree *answer = NULL_POINTER; for (int i = 0; i < branches(); i++) { // we will try each branch in turn and see if it has a child named // appropriately. @@ -178,7 +194,7 @@ symbol_tree *symbol_tree::find(const astring &to_find, find_methods how, return answer; } } - return NIL; + return NULL_POINTER; } return *found; }