Changes in src/SymTab/Indexer.cc [743fbda:0cb1d61]
- File:
-
- 1 edited
-
src/SymTab/Indexer.cc (modified) (24 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/SymTab/Indexer.cc
r743fbda r0cb1d61 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Indexer.cc -- 7 // Indexer.cc -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 21:37:33 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : Fri Apr 22 15:25:43201611 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Mar 2 17:31:29 2016 13 13 // Update Count : 11 14 14 // … … 59 59 } 60 60 } 61 61 62 62 template< typename Decl > 63 63 void dump( const std::unordered_map< std::string, Decl* > &table, std::ostream &os ) { … … 66 66 } // for 67 67 } 68 68 69 69 struct Indexer::Impl { 70 70 Impl( unsigned long _scope ) : refCount(1), scope( _scope ), size( 0 ), base(), … … 76 76 unsigned long size; ///< Number of elements stored in this table 77 77 const Indexer base; ///< Base indexer this extends 78 78 79 79 IdTable idTable; ///< Identifier namespace 80 80 TypeTable typeTable; ///< Type namespace … … 213 213 void Indexer::visit( StructDecl *aggregateDecl ) { 214 214 // make up a forward declaration and add it before processing the members 215 // needs to be on the heap because addStruct saves the pointer 216 StructDecl &fwdDecl = *new StructDecl( aggregateDecl->get_name() ); 215 StructDecl fwdDecl( aggregateDecl->get_name() ); 217 216 cloneAll( aggregateDecl->get_parameters(), fwdDecl.get_parameters() ); 218 217 debugPrint( "Adding fwd decl for struct " << fwdDecl.get_name() << std::endl ); 219 218 addStruct( &fwdDecl ); 220 219 221 220 enterScope(); 222 221 acceptAll( aggregateDecl->get_parameters(), *this ); 223 222 acceptAll( aggregateDecl->get_members(), *this ); 224 223 leaveScope(); 225 224 226 225 debugPrint( "Adding struct " << aggregateDecl->get_name() << std::endl ); 227 226 // this addition replaces the forward declaration … … 235 234 debugPrint( "Adding fwd decl for union " << fwdDecl.get_name() << std::endl ); 236 235 addUnion( &fwdDecl ); 237 236 238 237 enterScope(); 239 238 acceptAll( aggregateDecl->get_parameters(), *this ); 240 239 acceptAll( aggregateDecl->get_members(), *this ); 241 240 leaveScope(); 242 241 243 242 debugPrint( "Adding union " << aggregateDecl->get_name() << std::endl ); 244 243 addUnion( aggregateDecl ); … … 257 256 acceptAll( aggregateDecl->get_members(), *this ); 258 257 leaveScope(); 259 258 260 259 debugPrint( "Adding context " << aggregateDecl->get_name() << std::endl ); 261 260 addTrait( aggregateDecl ); … … 439 438 } 440 439 441 440 442 441 443 442 void Indexer::lookupId( const std::string &id, std::list< DeclarationWithType* > &out ) const { 444 443 std::unordered_set< std::string > foundMangleNames; 445 444 446 445 Indexer::Impl *searchTables = tables; 447 446 while ( searchTables ) { … … 453 452 // mark the mangled name as found, skipping this insertion if a declaration for that name has already been found 454 453 if ( foundMangleNames.insert( decl->first ).second == false ) continue; 455 454 456 455 out.push_back( decl->second ); 457 456 } 458 457 } 459 458 460 459 // get declarations from base indexers 461 460 searchTables = searchTables->base.tables; … … 520 519 const MangleTable &mangleTable = decls->second; 521 520 for ( MangleTable::const_iterator decl = mangleTable.begin(); decl != mangleTable.end(); ++decl ) { 522 // check for C decls with the same name, skipping 521 // check for C decls with the same name, skipping 523 522 // those with a compatible type (by mangleName) 524 523 if ( decl->second->get_linkage() == LinkageSpec::C && decl->first != mangleName ) return true; … … 528 527 return tables->base.hasIncompatibleCDecl( id, mangleName, scope ); 529 528 } 530 529 531 530 NamedTypeDecl *Indexer::lookupTypeAtScope( const std::string &id, unsigned long scope ) const { 532 531 if ( ! tables ) return 0; … … 536 535 return ret != tables->typeTable.end() ? ret->second : tables->base.lookupTypeAtScope( id, scope ); 537 536 } 538 537 539 538 StructDecl *Indexer::lookupStructAtScope( const std::string &id, unsigned long scope ) const { 540 539 if ( ! tables ) return 0; … … 544 543 return ret != tables->structTable.end() ? ret->second : tables->base.lookupStructAtScope( id, scope ); 545 544 } 546 545 547 546 EnumDecl *Indexer::lookupEnumAtScope( const std::string &id, unsigned long scope ) const { 548 547 if ( ! tables ) return 0; … … 552 551 return ret != tables->enumTable.end() ? ret->second : tables->base.lookupEnumAtScope( id, scope ); 553 552 } 554 553 555 554 UnionDecl *Indexer::lookupUnionAtScope( const std::string &id, unsigned long scope ) const { 556 555 if ( ! tables ) return 0; … … 560 559 return ret != tables->unionTable.end() ? ret->second : tables->base.lookupUnionAtScope( id, scope ); 561 560 } 562 561 563 562 TraitDecl *Indexer::lookupTraitAtScope( const std::string &id, unsigned long scope ) const { 564 563 if ( ! tables ) return 0; … … 603 602 return true; 604 603 } 605 604 606 605 void Indexer::addId( DeclarationWithType *decl ) { 607 606 makeWritable(); … … 622 621 if ( decl->get_linkage() == LinkageSpec::C && hasIncompatibleCDecl( name, mangleName, scope ) ) { 623 622 throw SemanticError( "invalid overload of C function ", decl ); 624 } // NOTE this is broken in Richard's original code in such a way that it never triggers (it 625 // doesn't check decls that have the same manglename, and all C-linkage decls are defined to 623 } // NOTE this is broken in Richard's original code in such a way that it never triggers (it 624 // doesn't check decls that have the same manglename, and all C-linkage decls are defined to 626 625 // have their name as their manglename, hence the error can never trigger). 627 // The code here is closer to correct, but name mangling would have to be completely 626 // The code here is closer to correct, but name mangling would have to be completely 628 627 // isomorphic to C type-compatibility, which it may not be. 629 628 630 629 tables->idTable[ name ][ mangleName ] = decl; 631 630 ++tables->size; … … 642 641 } 643 642 } 644 643 645 644 void Indexer::addType( NamedTypeDecl *decl ) { 646 645 makeWritable(); … … 673 672 addStruct( new StructDecl( id ) ); 674 673 } 675 674 676 675 void Indexer::addStruct( StructDecl *decl ) { 677 676 makeWritable(); … … 691 690 } 692 691 } 693 692 694 693 void Indexer::addEnum( EnumDecl *decl ) { 695 694 makeWritable(); … … 713 712 addUnion( new UnionDecl( id ) ); 714 713 } 715 714 716 715 void Indexer::addUnion( UnionDecl *decl ) { 717 716 makeWritable(); … … 731 730 } 732 731 } 733 732 734 733 void Indexer::addTrait( TraitDecl *decl ) { 735 734 makeWritable(); … … 752 751 void Indexer::enterScope() { 753 752 ++scope; 754 753 755 754 if ( doDebug ) { 756 755 std::cout << "--- Entering scope " << scope << std::endl; … … 805 804 os << "--- end ---" << std::endl; 806 805 } 807 806 808 807 } 809 808 } // namespace SymTab
Note:
See TracChangeset
for help on using the changeset viewer.