diff --git a/clang/lib/Sema/IdentifierResolver.cpp b/clang/lib/Sema/IdentifierResolver.cpp index 037802c64042..c062e8087537 100644 --- a/clang/lib/Sema/IdentifierResolver.cpp +++ b/clang/lib/Sema/IdentifierResolver.cpp @@ -69,13 +69,11 @@ public: void RemoveShadowed(NamedDecl *D); }; -} // end anonymous namespace - /// IdDeclInfoMap - Associates IdDeclInfos with Identifiers. /// Allocates 'pools' (vectors of IdDeclInfos) to avoid allocating each /// individual IdDeclInfo to heap. -class IdentifierResolver::IdDeclInfoMap { +class IdDeclInfoMap { static const unsigned int VECTOR_SIZE = 512; // Holds vectors of IdDeclInfos that serve as 'pools'. // New vectors are added when the current one is full. @@ -90,9 +88,13 @@ public: IdDeclInfo &operator[](IdentifierInfo *II); }; +} // end anonymous namespace -IdentifierResolver::IdentifierResolver() : IdDeclInfos(*new IdDeclInfoMap) {} -IdentifierResolver::~IdentifierResolver() { delete &IdDeclInfos; } + +IdentifierResolver::IdentifierResolver() : IdDeclInfos(new IdDeclInfoMap) {} +IdentifierResolver::~IdentifierResolver() { + delete static_cast(IdDeclInfos); +} /// AddDecl - Link the decl to its shadowed decl chain. void IdentifierResolver::AddDecl(NamedDecl *D, Scope *S) { @@ -109,7 +111,8 @@ void IdentifierResolver::AddDecl(NamedDecl *D, Scope *S) { if (isDeclPtr(Ptr)) { II->setFETokenInfo(NULL); - IDI = &IdDeclInfos[II]; + IdDeclInfoMap &Map = *static_cast(IdDeclInfos); + IDI = &Map[II]; IDI->PushShadowed(static_cast(Ptr)); } else IDI = toIdDeclInfo(Ptr); @@ -151,7 +154,8 @@ void IdentifierResolver::AddGlobalDecl(NamedDecl *D) { if (isDeclPtr(Ptr)) { II->setFETokenInfo(NULL); - IDI = &IdDeclInfos[II]; + IdDeclInfoMap &Map = *static_cast(IdDeclInfos); + IDI = &Map[II]; IDI->PushShadowed(static_cast(Ptr)); } else IDI = toIdDeclInfo(Ptr); @@ -231,7 +235,7 @@ void IdDeclInfo::RemoveShadowed(NamedDecl *D) { /// Returns the IdDeclInfo associated to the IdentifierInfo. /// It creates a new IdDeclInfo if one was not created before for this id. -IdDeclInfo &IdentifierResolver::IdDeclInfoMap::operator[](IdentifierInfo *II) { +IdDeclInfo &IdDeclInfoMap::operator[](IdentifierInfo *II) { assert (II && "null IdentifierInfo passed"); void *Ptr = II->getFETokenInfo(); diff --git a/clang/lib/Sema/IdentifierResolver.h b/clang/lib/Sema/IdentifierResolver.h index abe568d60279..34b4764d147b 100644 --- a/clang/lib/Sema/IdentifierResolver.h +++ b/clang/lib/Sema/IdentifierResolver.h @@ -43,8 +43,9 @@ public: NamedDecl *Lookup(const IdentifierInfo *II, unsigned NSI); private: - class IdDeclInfoMap; - IdDeclInfoMap &IdDeclInfos; + // An instance of IdDeclInfoMap class, that's hidden away in the + // implementation file. + void *IdDeclInfos; }; } // end namespace clang