On Wed, Sep 24, 2014 at 11:58 AM, Richard Smith <[email protected]> wrote:
> 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; > Another way to avoid the heap would be to use Optional<SavePendingInstantiationsAndVTableUsesRAII> instead. Not sure if that'd be better. > 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 > >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
