r215780 - Add a RAII class for saving and restoring instantiations and uses. No behavior change.
David Blaikie
dblaikie at gmail.com
Wed Sep 24 12:09:11 PDT 2014
On Wed, Sep 24, 2014 at 11:58 AM, Richard Smith <richard at metafoo.co.uk>
wrote:
> On Fri, Aug 15, 2014 at 3:29 PM, Nico Weber <nicolasweber at gmx.de> 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
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140924/8fd6b8be/attachment.html>
More information about the cfe-commits
mailing list