X-Git-Url: https://feistymeow.org/gitweb/?a=blobdiff_plain;f=nucleus%2Flibrary%2Fnodes%2Fsymbol_tree.cpp;h=ba5c33f948b8a4c15bedeb13c342b9986e4aad5f;hb=1d102044947855f1ebec0025500b2d519905b87c;hp=a4e455a50629fa892c37e81dbee03aba381b33f5;hpb=3ea085ec301ed1399dfa1e9f3a240312dc95410b;p=feisty_meow.git diff --git a/nucleus/library/nodes/symbol_tree.cpp b/nucleus/library/nodes/symbol_tree.cpp index a4e455a5..ba5c33f9 100644 --- a/nucleus/library/nodes/symbol_tree.cpp +++ b/nucleus/library/nodes/symbol_tree.cpp @@ -22,8 +22,10 @@ //#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; using namespace structures; @@ -31,11 +33,18 @@ 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() { +//probably we don't actually want to whack here??? +// for (int i = 0; i < symbols(); i++) { +// WHACK(use(i)); +// } + } }; ////////////// @@ -45,12 +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() { - WHACK(_name); + FUNCDEF("destructor"); +#ifdef DEBUG_SYMBOL_TREE + LOG("symtree dtor: prior to whacks"); +#endif WHACK(_associations); +#ifdef DEBUG_SYMBOL_TREE + LOG("symtree dtor: after whacking associations"); +#endif + WHACK(_name); +#ifdef DEBUG_SYMBOL_TREE + LOG("symtree dtor: after all whacks"); +#endif } int symbol_tree::children() const { return _associations->symbols(); } @@ -81,22 +101,33 @@ outcome symbol_tree::prune(tree *to_zap_in) FUNCDEF("prune"); #endif symbol_tree *to_zap = dynamic_cast(to_zap_in); - if (!to_zap) - throw("error: symbol_tree::prune: wrong type of node in prune"); + if (to_zap) { +#ifdef DEBUG_SYMBOL_TREE + LOG(astring("zapping node for ") + to_zap->name()); +#endif + 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; } @@ -131,7 +162,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 @@ -141,7 +172,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); } @@ -154,7 +185,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. @@ -168,7 +199,7 @@ symbol_tree *symbol_tree::find(const astring &to_find, find_methods how, return answer; } } - return NIL; + return NULL_POINTER; } return *found; }