r215780 - Add a RAII class for saving and restoring instantiations and uses. No behavior change.

Nico Weber thakis at chromium.org
Sat Jan 17 17:52:20 PST 2015


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; maybe instead pass
> a flag to the RAII object to tell it whether to do this save/load instead?
>

Done in r226389. Sorry about the delay!


>
>
>>    }
>>
>>    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/20150117/8d44cd93/attachment.html>


More information about the cfe-commits mailing list