X-Git-Url: https://feistymeow.org/gitweb/?p=feisty_meow.git;a=blobdiff_plain;f=nucleus%2Flibrary%2Fnodes%2Fsymbol_tree.cpp;fp=nucleus%2Flibrary%2Fnodes%2Fsymbol_tree.cpp;h=ba5c33f948b8a4c15bedeb13c342b9986e4aad5f;hp=eb8b64c145392812d6592d681ce89555ea56d8d8;hb=c28dc24c2c63c4b505009a911083245e1c87ebe8;hpb=84fc634d86157509079210d5b103deaa2122f9b7 diff --git a/nucleus/library/nodes/symbol_tree.cpp b/nucleus/library/nodes/symbol_tree.cpp index eb8b64c1..ba5c33f9 100644 --- a/nucleus/library/nodes/symbol_tree.cpp +++ b/nucleus/library/nodes/symbol_tree.cpp @@ -19,7 +19,7 @@ #include #include -#define DEBUG_SYMBOL_TREE +//#define DEBUG_SYMBOL_TREE // uncomment for totally noisy version. #include @@ -40,15 +40,6 @@ 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)); @@ -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(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; }