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

Douglas Gregor dgregor at apple.com
Tue Jan 20 13:46:43 PST 2009


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*.

   - Doug



More information about the cfe-commits mailing list