[cfe-commits] r62605 - in /cfe/trunk: include/clang/AST/DeclBase.h lib/AST/DeclBase.cpp lib/Sema/SemaExpr.cpp

steve naroff snaroff at apple.com
Tue Jan 20 14:01:02 PST 2009


On Jan 20, 2009, at 1:46 PM, Douglas Gregor wrote:

>
> On Jan 20, 2009, at 1:33 PM, Sebastian Redl wrote:
>
>> Steve Naroff wrote:
>>> Author: snaroff
>>> Date: Tue Jan 20 13:53:53 2009
>>> New Revision: 62605
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=62605&view=rev
>>> Log:
>>> Allocate expresssions through ASTContext (still more work to do).
>>>
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> ====================================================================
>>> --- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
>>> +++ cfe/trunk/lib/Sema/SemaExpr.cpp Tue Jan 20 13:53:53 2009
>>> @@ -373,11 +373,14 @@
>>> DeclRefExpr *Sema::BuildDeclRefExpr(NamedDecl *D, QualType Ty,  
>>> SourceLocation Loc,
>>>                                    bool TypeDependent, bool  
>>> ValueDependent,
>>>                                    const CXXScopeSpec *SS) {
>>> -  if (SS && !SS->isEmpty())
>>> -    return new QualifiedDeclRefExpr(D, Ty, Loc, TypeDependent,  
>>> ValueDependent,
>>> -                                    SS->getRange().getBegin());
>>> -  else
>>> -    return new DeclRefExpr(D, Ty, Loc, TypeDependent,  
>>> ValueDependent);
>>> +  if (SS && !SS->isEmpty()) {
>>> +    void *Mem =  
>>> Context.getAllocator().Allocate<QualifiedDeclRefExpr>();
>>> +    return new (Mem) QualifiedDeclRefExpr(D, Ty, Loc,  
>>> TypeDependent,
>>> +                       ValueDependent, SS->getRange().getBegin());
>>> +  } else {
>>> +    void *Mem = Context.getAllocator().Allocate<DeclRefExpr>();
>>> +    return new (Mem) DeclRefExpr(D, Ty, Loc, TypeDependent,  
>>> ValueDependent);
>>> +  }
>>> }
>>>
>>>
>>
>> Oh, dear. Shouldn't we write Create() functions like decls use? Or  
>> are
>> the few places where Exprs and Stmts are allocated not worth it?
>>
>> How about a placement new?
>>
>> void *operator new(size_t bytes, ASTContext& C) {
>> return C.getAllocator().Allocate(bytes, some_default_alignment);
>> }
>> // This one is not really necessary, as it cannot be called  
>> directly. It
>> is called implicitly
>> // by the compiler if the constructor in a placement new expression  
>> throws.
>> void operator delete(void *ptr, ASTContext& C) {
>> C.getAllocator().Deallocate(ptr);
>> }
>>
>> This allows this nice syntax for creating the nodes:
>>
>> return new (Context) QualifiedDeclRefExpr(D, Ty, Loc, ...);
>
>
> I like this a *lot*.
>

Fine with me (I was focused more on performance than aesthetics:-)

I can convert over to user-defined placement new's.

Do you think we should convert Decl's over?

snaroff

>  - Doug




More information about the cfe-commits mailing list