On Fri, Aug 15, 2014 at 3:29 PM, Nico Weber <[email protected]> wrote:
> Author: nico > Date: Fri Aug 15 17:29:14 2014 > New Revision: 215780 > > URL: http://llvm.org/viewvc/llvm-project?rev=215780&view=rev > Log: > Add a RAII class for saving and restoring instantiations and uses. No > behavior change. > > Modified: > cfe/trunk/include/clang/Sema/Sema.h > cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp > > Modified: cfe/trunk/include/clang/Sema/Sema.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=215780&r1=215779&r2=215780&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/Sema/Sema.h (original) > +++ cfe/trunk/include/clang/Sema/Sema.h Fri Aug 15 17:29:14 2014 > @@ -6568,6 +6568,31 @@ public: > /// but have not yet been performed. > std::deque<PendingImplicitInstantiation> PendingInstantiations; > > + class SavePendingInstantiationsAndVTableUsesRAII { > + public: > + SavePendingInstantiationsAndVTableUsesRAII(Sema &S): S(S) { > + SavedPendingInstantiations.swap(S.PendingInstantiations); > + SavedVTableUses.swap(S.VTableUses); > + } > + > + ~SavePendingInstantiationsAndVTableUsesRAII() { > + // Restore the set of pending vtables. > + assert(S.VTableUses.empty() && > + "VTableUses should be empty before it is discarded."); > + S.VTableUses.swap(SavedVTableUses); > + > + // Restore the set of pending implicit instantiations. > + assert(S.PendingInstantiations.empty() && > + "PendingInstantiations should be empty before it is > discarded."); > + S.PendingInstantiations.swap(SavedPendingInstantiations); > + } > + > + private: > + Sema &S; > + SmallVector<VTableUse, 16> SavedVTableUses; > + std::deque<PendingImplicitInstantiation> SavedPendingInstantiations; > + }; > + > /// \brief The queue of implicit template instantiations that are > required > /// and must be performed within the current local scope. > /// > > Modified: cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp?rev=215780&r1=215779&r2=215780&view=diff > > ============================================================================== > --- cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp (original) > +++ cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp Fri Aug 15 17:29:14 > 2014 > @@ -3389,13 +3389,13 @@ void Sema::InstantiateFunctionDefinition > // If we're performing recursive template instantiation, create our own > // queue of pending implicit instantiations that we will instantiate > later, > // while we're still within our own instantiation context. > - SmallVector<VTableUse, 16> SavedVTableUses; > - std::deque<PendingImplicitInstantiation> SavedPendingInstantiations; > SavePendingLocalImplicitInstantiationsRAII > SavedPendingLocalImplicitInstantiations(*this); > + std::unique_ptr<SavePendingInstantiationsAndVTableUsesRAII> > + SavePendingInstantiationsAndVTableUses; > if (Recursive) { > - VTableUses.swap(SavedVTableUses); > - PendingInstantiations.swap(SavedPendingInstantiations); > + SavePendingInstantiationsAndVTableUses.reset( > + new SavePendingInstantiationsAndVTableUsesRAII(*this)); > It seems wasteful to go to the heap for this each time; maybe instead pass a flag to the RAII object to tell it whether to do this save/load instead? > } > > EnterExpressionEvaluationContext EvalContext(*this, > @@ -3466,15 +3466,8 @@ void Sema::InstantiateFunctionDefinition > // instantiation of this template. > PerformPendingInstantiations(); > > - // Restore the set of pending vtables. > - assert(VTableUses.empty() && > - "VTableUses should be empty before it is discarded."); > - VTableUses.swap(SavedVTableUses); > - > - // Restore the set of pending implicit instantiations. > - assert(PendingInstantiations.empty() && > - "PendingInstantiations should be empty before it is > discarded."); > - PendingInstantiations.swap(SavedPendingInstantiations); > + // Restore PendingInstantiations and VTableUses. > + SavePendingInstantiationsAndVTableUses.reset(); > } > } > > @@ -3790,11 +3783,11 @@ void Sema::InstantiateVariableDefinition > // If we're performing recursive template instantiation, create our > own > // queue of pending implicit instantiations that we will instantiate > // later, while we're still within our own instantiation context. > - SmallVector<VTableUse, 16> SavedVTableUses; > - std::deque<PendingImplicitInstantiation> SavedPendingInstantiations; > + std::unique_ptr<SavePendingInstantiationsAndVTableUsesRAII> > + SavePendingInstantiationsAndVTableUses; > if (Recursive) { > - VTableUses.swap(SavedVTableUses); > - PendingInstantiations.swap(SavedPendingInstantiations); > + SavePendingInstantiationsAndVTableUses.reset( > + new SavePendingInstantiationsAndVTableUsesRAII(*this)); > } > > LocalInstantiationScope Local(*this); > @@ -3822,15 +3815,8 @@ void Sema::InstantiateVariableDefinition > // instantiation of this template. > PerformPendingInstantiations(); > > - // Restore the set of pending vtables. > - assert(VTableUses.empty() && > - "VTableUses should be empty before it is discarded."); > - VTableUses.swap(SavedVTableUses); > - > - // Restore the set of pending implicit instantiations. > - assert(PendingInstantiations.empty() && > - "PendingInstantiations should be empty before it is > discarded."); > - PendingInstantiations.swap(SavedPendingInstantiations); > + // Restore PendingInstantiations and VTableUses. > + SavePendingInstantiationsAndVTableUses.reset(); > } > } > > @@ -3914,13 +3900,13 @@ void Sema::InstantiateVariableDefinition > // If we're performing recursive template instantiation, create our own > // queue of pending implicit instantiations that we will instantiate > later, > // while we're still within our own instantiation context. > - SmallVector<VTableUse, 16> SavedVTableUses; > - std::deque<PendingImplicitInstantiation> SavedPendingInstantiations; > SavePendingLocalImplicitInstantiationsRAII > SavedPendingLocalImplicitInstantiations(*this); > + std::unique_ptr<SavePendingInstantiationsAndVTableUsesRAII> > + SavePendingInstantiationsAndVTableUses; > if (Recursive) { > - VTableUses.swap(SavedVTableUses); > - PendingInstantiations.swap(SavedPendingInstantiations); > + SavePendingInstantiationsAndVTableUses.reset( > + new SavePendingInstantiationsAndVTableUsesRAII(*this)); > } > > // Enter the scope of this instantiation. We don't use > @@ -3987,15 +3973,8 @@ void Sema::InstantiateVariableDefinition > // instantiation of this template. > PerformPendingInstantiations(); > > - // Restore the set of pending vtables. > - assert(VTableUses.empty() && > - "VTableUses should be empty before it is discarded."); > - VTableUses.swap(SavedVTableUses); > - > - // Restore the set of pending implicit instantiations. > - assert(PendingInstantiations.empty() && > - "PendingInstantiations should be empty before it is > discarded."); > - PendingInstantiations.swap(SavedPendingInstantiations); > + // Restore PendingInstantiations and VTableUses. > + SavePendingInstantiationsAndVTableUses.reset(); > } > } > > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
