int main(int argc, char* argv[]) { SgProject* project = frontend(argc, argv); std::vector<SgIfStmt*> ifs = SageInterface::querySubTree<SgIfStmt>(project, V_SgIfStmt); BOOST_FOREACH(SgIfStmt* if_stmt, ifs) { if (SgExpression *se = isSgExprStatement(if_stmt->get_conditional())->get_expression()) { cout << "--->" << se->unparseToString() << "<---" << endl; Rose_STL_Container<SgNode*> variableList = NodeQuery::querySubTree(se, V_SgVarRefExp); for (Rose_STL_Container<SgNode*>::iterator i = variableList.begin(), end = variableList.end(); i != end; i++) { SgVarRefExp *varRef = isSgVarRefExp(*i); SgVariableSymbol *currSym = varRef->get_symbol(); cout << "Looking at: --|" << currSym->get_name().str() << "|--" << endl; SgDeclarationStatement *decl = currSym->get_declaration()->get_declaration(); cout << "declaration: " << decl->unparseToString() << endl; SgConstVolatileModifier cvm = decl->get_declarationModifier().get_typeModifier().get_constVolatileModifier(); bool constness = cvm.isConst(); cout << "constness via isConst(): " << constness << endl; cout << cvm.displayString() << endl; } } } return 0; }
void FixupStorageAccessOfForwardTemplateDeclarations::visit (SgNode* node) { ROSE_ASSERT(node != NULL); // These are output a static functions to avoid being defined using multiple symbols at link time. // This is a temporary fix until we get the better prelinker written. SgTemplateInstantiationFunctionDecl* functionDeclaration = isSgTemplateInstantiationFunctionDecl(node); if (functionDeclaration != NULL) { SgDeclarationStatement* definingDeclaration = functionDeclaration->get_definingDeclaration(); if (definingDeclaration != NULL) { bool isStatic = definingDeclaration->get_declarationModifier().get_storageModifier().isStatic(); if (isStatic == true) { // This is a static function so make sure that all declarations associated with it // (e.g. forward declarations) are marked the same. bool currentDeclarationIsStatic = functionDeclaration->get_declarationModifier().get_storageModifier().isStatic(); if (currentDeclarationIsStatic == false) { if ( SgProject::get_verbose() >= AST_FIXES_VERBOSE_LEVEL ) printf ("AST fixup: Changing non-defining declaration (%p) to match defining declaration (static)\n",functionDeclaration); functionDeclaration->get_declarationModifier().get_storageModifier().setStatic(); } } } } }
/** * class: SgVarRefExp * term: var_ref_exp_annotation(tpe,name,static,scope) * arg tpe: type * arg name: name * arg static: wether the declaration was static * arg scope: scope name (either from a namespace, a class or "null") */ PrologCompTerm* RoseToTerm::getVarRefExpSpecific(SgVarRefExp* vr) { SgInitializedName* n = vr->get_symbol()->get_declaration(); /* type: in general, this can be taken "as is" from the ROSE AST. However, * ROSE (up to 0.9.4a-8xxx at least) gets a detail wrong: a declaration * like "int arr[]" as a function parameter declares a *pointer*, not an * array. Thus we check whether the variable might be of this sort, and if * yes, we must make a pointer type for it. */ PrologTerm* typeSpecific = NULL; SgInitializedName* vardecl = vr->get_symbol()->get_declaration(); SgType* t = vr->get_type()->stripType(SgType::STRIP_MODIFIER_TYPE | SgType::STRIP_REFERENCE_TYPE | SgType::STRIP_TYPEDEF_TYPE); if (isSgFunctionParameterList(vardecl->get_parent()) && isSgArrayType(t)) { SgType* baseType = isSgArrayType(t)->get_base_type(); PrologTerm* baseTypeSpecific = getTypeSpecific(baseType); typeSpecific = new PrologCompTerm("pointer_type", /*1,*/ baseTypeSpecific); } else { typeSpecific = getTypeSpecific(n->get_typeptr()); } /* static? (relevant for unparsing if scope is a class)*/ PrologTerm *isStatic; SgDeclarationStatement* vdec = n->get_declaration(); if (vdec != NULL) { isStatic = getEnum(vdec->get_declarationModifier().get_storageModifier().isStatic(), re.static_flags); } else { isStatic = getEnum(0, re.static_flags); } PrologTerm* scope; if (vdec != NULL) { /* named scope or irrelevant?*/ if (SgNamespaceDefinitionStatement* scn = isSgNamespaceDefinitionStatement(vdec->get_parent())) { scope = getNamespaceScopeName(scn); } else if (SgClassDefinition* scn = isSgClassDefinition(vdec->get_parent())) { scope = getClassScopeName(scn); } else { scope = new PrologAtom("null"); } } else { scope = new PrologAtom("null"); } return new PrologCompTerm ("var_ref_exp_annotation", //5, typeSpecific, /* name*/ new PrologAtom(n->get_name().getString()), isStatic, scope, PPI(vr)); }
InheritedAttribute visitorTraversal::evaluateInheritedAttribute(SgNode* n, InheritedAttribute inheritedAttribute) { Sg_File_Info* s = n->get_startOfConstruct(); Sg_File_Info* e = n->get_endOfConstruct(); Sg_File_Info* f = n->get_file_info(); for(int x=0; x < inheritedAttribute.depth; ++x) { printf(" "); } if(s != NULL && e != NULL && !isSgLabelStatement(n)) { printf ("%s (%d, %d, %d)->(%d, %d): %s",n->sage_class_name(),s->get_file_id()+1,s->get_raw_line(),s->get_raw_col(),e->get_raw_line(),e->get_raw_col(), verbose ? n->unparseToString().c_str() : "" ); if(isSgAsmDwarfConstruct(n)) { printf(" [DWARF construct name: %s]", isSgAsmDwarfConstruct(n)->get_name().c_str()); } SgExprStatement * exprStmt = isSgExprStatement(n); if(exprStmt != NULL) { printf(" [expr type: %s]", exprStmt->get_expression()->sage_class_name()); SgFunctionCallExp * fcall = isSgFunctionCallExp(exprStmt->get_expression()); if(fcall != NULL) { SgExpression * funcExpr = fcall->get_function(); if(funcExpr != NULL) { printf(" [function expr: %s]", funcExpr->class_name().c_str()); } SgFunctionDeclaration * fdecl = fcall->getAssociatedFunctionDeclaration(); if(fdecl != NULL) { printf(" [called function: %s]", fdecl->get_name().str()); } } } if(isSgFunctionDeclaration(n)) { printf(" [declares function: %s]", isSgFunctionDeclaration(n)->get_name().str()); } SgStatement * sgStmt = isSgStatement(n); if(sgStmt != NULL) { printf(" [scope: %s, %p]", sgStmt->get_scope()->sage_class_name(), sgStmt->get_scope()); } //SgLabelStatement * lblStmt = isSgLabelStatement(n); //if(lblStmt != NULL) { // SgStatement * lblStmt2 = lblStmt->get_statement(); //} } else if (f != NULL) { SgInitializedName * iname = isSgInitializedName(n); if(iname != NULL) { SgType* inameType = iname->get_type(); printf("%s (%d, %d, %d): %s [type: %s", n->sage_class_name(),f->get_file_id()+1,f->get_raw_line(),f->get_raw_col(),n->unparseToString().c_str(),inameType->class_name().c_str()); SgDeclarationStatement * ds = isSgDeclarationStatement(iname->get_parent()); if(ds != NULL) { if(ds->get_declarationModifier().get_storageModifier().isStatic()) { printf(" static"); } } SgArrayType * art = isSgArrayType(iname->get_type()); if(art != NULL) { printf(" %d", art->get_rank()); } printf("]"); if(isSgAsmDwarfConstruct(n)) { printf(" [DWARF construct name: %s]", isSgAsmDwarfConstruct(n)->get_name().c_str()); } } else { printf("%s (%d, %d, %d): %s", n->sage_class_name(),f->get_file_id()+1,f->get_raw_line(),f->get_raw_col(), verbose ? n->unparseToString().c_str() : ""); } } else { printf("%s : %s", n->sage_class_name(), verbose ? n->unparseToString().c_str() : ""); if(isSgAsmDwarfConstruct(n)) { printf(" [DWARF construct name: %s]", isSgAsmDwarfConstruct(n)->get_name().c_str()); } } printf(" succ# %lu", n->get_numberOfTraversalSuccessors()); printf("\n"); return InheritedAttribute(inheritedAttribute.depth+1); }
// DQ (8/23/2011): Made this a static function so that I could call it from the Java support. void FixupAstSymbolTablesToSupportAliasedSymbols::injectSymbolsFromReferencedScopeIntoCurrentScope ( SgScopeStatement* referencedScope, SgScopeStatement* currentScope, SgNode* causalNode, SgAccessModifier::access_modifier_enum accessLevel ) { ROSE_ASSERT(referencedScope != NULL); ROSE_ASSERT(currentScope != NULL); #if ALIAS_SYMBOL_DEBUGGING || 0 printf ("In injectSymbolsFromReferencedScopeIntoCurrentScope(): referencedScope = %p = %s currentScope = %p = %s accessLevel = %d \n",referencedScope,referencedScope->class_name().c_str(),currentScope,currentScope->class_name().c_str(),accessLevel); #endif SgSymbolTable* symbolTable = referencedScope->get_symbol_table(); ROSE_ASSERT(symbolTable != NULL); #if 0 printf ("AST Fixup: Building Symbol Table for %p = %s at: \n",scope,scope->sage_class_name()); referencedScope->get_file_info()->display("Symbol Table Location"); #endif SgClassDefinition* classDefinition = isSgClassDefinition(referencedScope); if (classDefinition != NULL) { // If this is a class definition, then we need to make sure that we only for alias symbols for those declarations. #if ALIAS_SYMBOL_DEBUGGING printf ("Injection of symbols from a class definition needs to respect access priviledge (private, protected, public) declarations \n"); #endif } SgSymbolTable::BaseHashType* internalTable = symbolTable->get_table(); ROSE_ASSERT(internalTable != NULL); int counter = 0; SgSymbolTable::hash_iterator i = internalTable->begin(); while (i != internalTable->end()) { // DQ: removed SgName casting operator to char* // cout << "[" << idx << "] " << (*i).first.str(); ROSE_ASSERT ( (*i).first.str() != NULL ); ROSE_ASSERT ( isSgSymbol( (*i).second ) != NULL ); #if ALIAS_SYMBOL_DEBUGGING printf ("Symbol number: %d (pair.first (SgName) = %s) pair.second (SgSymbol) class_name() = %s \n",counter,(*i).first.str(),(*i).second->class_name().c_str()); #endif SgName name = (*i).first; SgSymbol* symbol = (*i).second; ROSE_ASSERT ( symbol != NULL ); // Make sure that this is not a SgLabelSymbol, I think these should not be aliased // (if only because I don't think that C++ support name qualification for labels). ROSE_ASSERT ( isSgLabelSymbol(symbol) == NULL ); // DQ (6/22/2011): For now skip the handling of alias symbol from other scopes. // ROSE_ASSERT(isSgAliasSymbol(symbol) == NULL); if (isSgAliasSymbol(symbol) != NULL) { #if ALIAS_SYMBOL_DEBUGGING printf ("WARNING: Not clear if we want to nest SgAliasSymbol inside of SgAliasSymbol \n"); #endif // DQ (9/22/2012): We need to avoid building chains of SgAliasSymbol (to simplify the representation in the AST). while (isSgAliasSymbol(symbol) != NULL) { #if ALIAS_SYMBOL_DEBUGGING printf (" --- Iterating to root of alias: symbol = %p = %s \n",symbol,symbol->class_name().c_str()); #endif symbol = isSgAliasSymbol(symbol)->get_alias(); ROSE_ASSERT(symbol != NULL); } #if ALIAS_SYMBOL_DEBUGGING printf ("Resolved aliased symbol to root symbol: symbol = %p = %s \n",symbol,symbol->class_name().c_str()); #endif } SgNode* symbolBasis = symbol->get_symbol_basis(); ROSE_ASSERT(symbolBasis != NULL); #if ALIAS_SYMBOL_DEBUGGING printf ("symbolBasis = %p = %s \n",symbolBasis,symbolBasis->class_name().c_str()); #endif // SgDeclarationStatement* declarationFromSymbol = symbol->get_declaration(); SgDeclarationStatement* declarationFromSymbol = isSgDeclarationStatement(symbolBasis); SgAccessModifier::access_modifier_enum declarationAccessLevel = SgAccessModifier::e_unknown; // ROSE_ASSERT(declarationFromSymbol != NULL); if (declarationFromSymbol != NULL) { // DQ (6/22/2011): Can I, or should I, do relational operations on enum values (note that the values are designed to allow this). declarationAccessLevel = declarationFromSymbol->get_declarationModifier().get_accessModifier().get_modifier(); } else { SgInitializedName* initializedNameFromSymbol = isSgInitializedName(symbolBasis); ROSE_ASSERT(initializedNameFromSymbol != NULL); // DQ (9/8/2014): This fails for test2013_234, 235, 240, 241, 242, 246.C. // ROSE_ASSERT(initializedNameFromSymbol->get_declptr() != NULL); // declarationAccessLevel = initializedNameFromSymbol->get_declptr()->get_declarationModifier().get_accessModifier().get_modifier(); if (initializedNameFromSymbol->get_declptr() != NULL) { declarationAccessLevel = initializedNameFromSymbol->get_declptr()->get_declarationModifier().get_accessModifier().get_modifier(); } else { mprintf ("WARNING: In injectSymbolsFromReferencedScopeIntoCurrentScope(): initializedNameFromSymbol->get_declptr() == NULL: initializedNameFromSymbol->get_name() = %s \n",initializedNameFromSymbol->get_name().str()); } } #if ALIAS_SYMBOL_DEBUGGING || 0 printf ("declarationAccessLevel = %d accessLevel = %d \n",declarationAccessLevel,accessLevel); #endif #if 0 // DQ (12/23/2015): Is this only supporting the SgBaseClass IR nodes? No, another example is the case of a SgUsingDirectiveStatement. ROSE_ASSERT(causalNode != NULL); if (isSgBaseClass(causalNode) == NULL) { printf ("ERROR: This is not a SgBaseClass: causalNode = %p = %s \n",causalNode,causalNode->class_name().c_str()); ROSE_ASSERT(false); } #endif // DQ (12/23/2015): See test2015_140.C for where even private base classes will require representations // of it's symbols in the derived class (to support correct name qualification). // if (declarationAccessLevel >= accessLevel) if ( (declarationAccessLevel >= accessLevel) || isSgBaseClass(causalNode) != NULL) { // This declaration is visible, so build an alias. // DQ (7/24/2011): Need to make sure that the symbol is not already present in the symbol table // (else injection would be redundant. This is a likely key to the problem we are having with // symbol table explosions for some codes. This should be refactored to a member function of // the symbol table support. // Note that this change improves the performance from 15 minutes to 5 seconds for the outlining example. bool alreadyExists = currentScope->symbol_exists(name); if (alreadyExists == true) { // Just because the names match is not strong enough. // SgSymbol* symbol currentScope->symbol_exists(name); switch (symbol->variantT()) { case V_SgAliasSymbol: { // not clear what to do here... // I think we need more symbol table support for detecting matching symbols. // I think we also need more alias symbol specific query support. break; } // DQ (11/10/2014): Added support for templated typedef symbols. case V_SgTemplateTypedefSymbol: case V_SgEnumSymbol: case V_SgVariableSymbol: case V_SgTemplateClassSymbol: case V_SgClassSymbol: case V_SgTemplateFunctionSymbol: case V_SgTemplateMemberFunctionSymbol: case V_SgFunctionSymbol: case V_SgMemberFunctionSymbol: case V_SgTypedefSymbol: case V_SgEnumFieldSymbol: case V_SgNamespaceSymbol: case V_SgTemplateSymbol: case V_SgLabelSymbol: { // Liao, 10/31/2012. // Using lookup_function_symbol () etc. is not good enough since it returns the first match only. // There might be multiple hits. We have to go through them all instead of checking only the first hit alreadyExists = false; // reset to be false // using less expensive equal_range(), which can be O(logN) instead of O(N) // This matters since this function is called inside another loop with complexity of O(N) already. rose_hash_multimap * internal_table = currentScope->get_symbol_table()->get_table(); ROSE_ASSERT (internal_table != NULL); std::pair<rose_hash_multimap::iterator, rose_hash_multimap::iterator> range = internal_table ->equal_range (name); for (rose_hash_multimap::iterator i = range.first; i != range.second; ++i) { SgSymbol * orig_current_symbol = i->second; ROSE_ASSERT (orig_current_symbol != NULL); // strip off alias symbols SgSymbol * non_alias_symbol = orig_current_symbol; while (isSgAliasSymbol(non_alias_symbol)) { non_alias_symbol = isSgAliasSymbol(non_alias_symbol) ->get_alias(); ROSE_ASSERT (non_alias_symbol != NULL); } SgNode* associatedDeclaration = i->second->get_symbol_basis(); assert(associatedDeclaration != NULL); // same basis and same symbol type // The assumption is that no two symbols can share the same basis declaration TODO double check this! if (associatedDeclaration == symbolBasis && (non_alias_symbol->variantT() == symbol->variantT())) { alreadyExists = true; break; } } // end for break; } #if 0 // uniform handling by code above now case V_SgEnumSymbol: { // alreadyExists = (currentScope->lookup_enum_symbol(name) != NULL); SgEnumSymbol* tmpSymbol = currentScope->lookup_enum_symbol(name); if (tmpSymbol != NULL) { SgNode* tmpSymbolBasis = tmpSymbol->get_symbol_basis(); ROSE_ASSERT(tmpSymbolBasis != NULL); alreadyExists = (tmpSymbolBasis == symbolBasis); } break; } case V_SgVariableSymbol: { // alreadyExists = (currentScope->lookup_variable_symbol(name) != NULL); SgVariableSymbol* tmpSymbol = currentScope->lookup_variable_symbol(name); if (tmpSymbol != NULL) { SgNode* tmpSymbolBasis = tmpSymbol->get_symbol_basis(); ROSE_ASSERT(tmpSymbolBasis != NULL); alreadyExists = (tmpSymbolBasis == symbolBasis); } break; } // DQ (2/12/2012): Not clear if this is the best way to add this support. case V_SgTemplateClassSymbol: case V_SgClassSymbol: { // alreadyExists = (currentScope->lookup_class_symbol(name) != NULL); SgClassSymbol* tmpSymbol = currentScope->lookup_class_symbol(name); if (tmpSymbol != NULL) { SgNode* tmpSymbolBasis = tmpSymbol->get_symbol_basis(); ROSE_ASSERT(tmpSymbolBasis != NULL); alreadyExists = (tmpSymbolBasis == symbolBasis); } break; } #if 0 // DQ (2/12/2012): Added support for SgTemplateFunctionSymbol. case V_SgTemplateFunctionSymbol: { SgTemplateFunctionSymbol* tmpSymbol = currentScope->lookup_template_function_symbol(name); if (tmpSymbol != NULL) { SgNode* tmpSymbolBasis = tmpSymbol->get_symbol_basis(); ROSE_ASSERT(tmpSymbolBasis != NULL); alreadyExists = (tmpSymbolBasis == symbolBasis); } break; } // DQ (2/12/2012): Added support for SgTemplateMemberFunctionSymbol. case V_SgTemplateMemberFunctionSymbol: { SgTemplateMemberFunctionSymbol* tmpSymbol = currentScope->lookup_template_member_function_symbol(name); if (tmpSymbol != NULL) { SgNode* tmpSymbolBasis = tmpSymbol->get_symbol_basis(); ROSE_ASSERT(tmpSymbolBasis != NULL); alreadyExists = (tmpSymbolBasis == symbolBasis); } break; } #else // DQ (2/12/2012): Not clear if this is the best way to add this support. case V_SgTemplateFunctionSymbol: case V_SgTemplateMemberFunctionSymbol: #endif case V_SgFunctionSymbol: case V_SgMemberFunctionSymbol: { // alreadyExists = (currentScope->lookup_function_symbol(name) != NULL); SgFunctionSymbol* tmpSymbol = currentScope->lookup_function_symbol(name); if (tmpSymbol != NULL) { SgNode* tmpSymbolBasis = tmpSymbol->get_symbol_basis(); ROSE_ASSERT(tmpSymbolBasis != NULL); alreadyExists = (tmpSymbolBasis == symbolBasis); } break; } case V_SgTypedefSymbol: { // alreadyExists = (currentScope->lookup_typedef_symbol(name) != NULL); SgTypedefSymbol* tmpSymbol = currentScope->lookup_typedef_symbol(name); if (tmpSymbol != NULL) { SgNode* tmpSymbolBasis = tmpSymbol->get_symbol_basis(); ROSE_ASSERT(tmpSymbolBasis != NULL); alreadyExists = (tmpSymbolBasis == symbolBasis); } break; } case V_SgEnumFieldSymbol: { // alreadyExists = (currentScope->lookup_enum_field_symbol(name) != NULL); SgEnumFieldSymbol* tmpSymbol = currentScope->lookup_enum_field_symbol(name); if (tmpSymbol != NULL) { SgNode* tmpSymbolBasis = tmpSymbol->get_symbol_basis(); ROSE_ASSERT(tmpSymbolBasis != NULL); alreadyExists = (tmpSymbolBasis == symbolBasis); } break; } case V_SgNamespaceSymbol: { // alreadyExists = (currentScope->lookup_namespace_symbol(name) != NULL); SgNamespaceSymbol* tmpSymbol = currentScope->lookup_namespace_symbol(name); if (tmpSymbol != NULL) { SgNode* tmpSymbolBasis = tmpSymbol->get_symbol_basis(); ROSE_ASSERT(tmpSymbolBasis != NULL); alreadyExists = (tmpSymbolBasis == symbolBasis); } break; } case V_SgTemplateSymbol: { // alreadyExists = (currentScope->lookup_template_symbol(name) != NULL); SgTemplateSymbol* tmpSymbol = currentScope->lookup_template_symbol(name); if (tmpSymbol != NULL) { SgNode* tmpSymbolBasis = tmpSymbol->get_symbol_basis(); ROSE_ASSERT(tmpSymbolBasis != NULL); alreadyExists = (tmpSymbolBasis == symbolBasis); } break; } case V_SgLabelSymbol: { // alreadyExists = (currentScope->lookup_label_symbol(name) != NULL); SgLabelSymbol* tmpSymbol = currentScope->lookup_label_symbol(name); if (tmpSymbol != NULL) { SgNode* tmpSymbolBasis = tmpSymbol->get_symbol_basis(); ROSE_ASSERT(tmpSymbolBasis != NULL); alreadyExists = (tmpSymbolBasis == symbolBasis); } break; } #endif default: printf ("Error: default reached in switch symbol = %p = %s \n",symbol,symbol->class_name().c_str()); ROSE_ASSERT(false); break; } } if ( alreadyExists == false) { #if 0 printf ("Building a SgAliasSymbol \n"); #endif // DQ: The parameter to a SgAliasSymbol is a SgSymbol (but should not be another SgAliasSymbol). SgAliasSymbol* aliasSymbol = new SgAliasSymbol(symbol); ROSE_ASSERT(aliasSymbol != NULL); // DQ (7/12/2014): Added support to trace back the SgAliasSymbol to the declarations that caused it to be added. ROSE_ASSERT(causalNode != NULL); aliasSymbol->get_causal_nodes().push_back(causalNode); #if ALIAS_SYMBOL_DEBUGGING // printf ("In injectSymbolsFromReferencedScopeIntoCurrentScope(): Adding symbol to new scope as a SgAliasSymbol = %p causalNode = %p = %s \n",aliasSymbol,causalNode,causalNode->class_name().c_str()); printf ("In injectSymbolsFromReferencedScopeIntoCurrentScope(): Adding symbol to new scope (currentScope = %p = %s) as a SgAliasSymbol = %p causalNode = %p = %s \n",currentScope,currentScope->class_name().c_str(),aliasSymbol,causalNode,causalNode->class_name().c_str()); #endif // Use the current name and the alias to the symbol currentScope->insert_symbol(name, aliasSymbol); #if ALIAS_SYMBOL_DEBUGGING printf ("In injectSymbolsFromReferencedScopeIntoCurrentScope(): DONE: Adding symbol to new scope (currentScope = %p = %s) as a SgAliasSymbol = %p causalNode = %p = %s \n",currentScope,currentScope->class_name().c_str(),aliasSymbol,causalNode,causalNode->class_name().c_str()); #endif } } else { #if ALIAS_SYMBOL_DEBUGGING printf ("NO SgAliasSymbol ADDED (wrong permissions): declarationFromSymbol = %p \n",declarationFromSymbol); #endif } #if 0 // Older version of code... // SgAliasSymbol* aliasSymbol = new SgAliasSymbol (SgSymbol *alias=NULL, bool isRenamed=false, SgName new_name="") SgAliasSymbol* aliasSymbol = new SgAliasSymbol (symbol); // Use the current name and the alias to the symbol currentScope->insert_symbol(name, aliasSymbol); #endif // Increment iterator and counter i++; counter++; } #if 0 // debugging symbolTable->print("In injectSymbolsFromReferencedScopeIntoCurrentScope(): printing out the symbol tables"); #endif #if ALIAS_SYMBOL_DEBUGGING printf ("In injectSymbolsFromReferencedScopeIntoCurrentScope(): referencedScope = %p = %s currentScope = %p = %s accessLevel = %d \n",referencedScope,referencedScope->class_name().c_str(),currentScope,currentScope->class_name().c_str(),accessLevel); #endif }