size_t CFG::_varcnt_(void) { size_t cnt = 0; for (ssize_t i = 0; i < this->length(); ++i) { AST *child = (AST *)this->child(i); switch(child->type()) { case AST_ASSIGN: if (0 != child->length() && 0 == child->child(0)->length()) { cnt ++; } break; case AST_FUNC: if (0 != child->length() && 0 != child->child(0)->length()) { cnt += child->child(0)->child(0)->length(); } break; default: _D(LOG_DEBUG, "Need NOT count on %s", child->data().c_str()); break; } } cnt += (NULL == this->nextCFG(true) ? 0 : this->nextCFG(true)->_varcnt_()); cnt += (NULL == this->nextCFG(false) ? 0 : this->nextCFG(false)->_varcnt_()); return cnt; }
template <typename T> T* BuildASTVisitor::stackPop() { if( aststack.isEmpty() ) { kDebug(9024) << kBacktrace(); kFatal(9024) << "ERROR: AST stack is empty, this should never happen"; exit(255); } AST* tmp = aststack.pop(); T* ast = dynamic_cast<T*>(tmp); if( !ast ) { kDebug(9024) << kBacktrace(); kFatal(9024) << "ERROR: AST stack is screwed, doing a hard exit" << tmp->type(); exit(255); } return ast; }