diff options
| author | Anders Carlsson <andersca@mac.com> | 2009-12-16 06:10:22 +0000 | 
|---|---|---|
| committer | Anders Carlsson <andersca@mac.com> | 2009-12-16 06:10:22 +0000 | 
| commit | a5ca598ce6fa5cf018e1f6a29abbe28adc458c9b (patch) | |
| tree | 40d7d2facfa6e7f669867f6566936df43f47f524 /clang/lib/AST | |
| parent | 9bcc264494b76ee6af5c435ce9829a8d694fadce (diff) | |
| download | bcm5719-llvm-a5ca598ce6fa5cf018e1f6a29abbe28adc458c9b.tar.gz bcm5719-llvm-a5ca598ce6fa5cf018e1f6a29abbe28adc458c9b.zip | |
More work on the FullExpr class.
llvm-svn: 91513
Diffstat (limited to 'clang/lib/AST')
| -rw-r--r-- | clang/lib/AST/FullExpr.cpp | 52 | 
1 files changed, 34 insertions, 18 deletions
| diff --git a/clang/lib/AST/FullExpr.cpp b/clang/lib/AST/FullExpr.cpp index 39c3bad0a77..f47284f3d06 100644 --- a/clang/lib/AST/FullExpr.cpp +++ b/clang/lib/AST/FullExpr.cpp @@ -16,27 +16,43 @@  #include "clang/AST/ASTContext.h"  #include "clang/AST/FullExpr.h" +#include "clang/AST/Expr.h" +#include "clang/AST/ExprCXX.h"  #include "llvm/Support/AlignOf.h"  using namespace clang; -FullExpr FullExpr::Create(ASTContext &Context, Expr *SubExpr,  +FullExpr FullExpr::Create(ASTContext &Context, Expr *SubExpr,                            CXXTemporary **Temporaries, unsigned NumTemporaries) { -    FullExpr E; -     -    if (!NumTemporaries) { -        E.SubExpr = SubExpr; -        return E; -    } -     -    unsigned Size = sizeof(FullExpr)  -        + sizeof(CXXTemporary *) * NumTemporaries; -     -    unsigned Align = llvm::AlignOf<ExprAndTemporaries>::Alignment; -    ExprAndTemporaries *ET =  -        static_cast<ExprAndTemporaries *>(Context.Allocate(Size, Align)); -     -    ET->SubExpr = SubExpr; -    std::copy(Temporaries, Temporaries + NumTemporaries, ET->begin()); +  FullExpr E; + +  if (!NumTemporaries) { +      E.SubExpr = SubExpr; +      return E; +  } + +  unsigned Size = sizeof(FullExpr)  +      + sizeof(CXXTemporary *) * NumTemporaries; + +  unsigned Align = llvm::AlignOf<ExprAndTemporaries>::Alignment; +  ExprAndTemporaries *ET =  +      static_cast<ExprAndTemporaries *>(Context.Allocate(Size, Align)); + +  ET->SubExpr = SubExpr; +  std::copy(Temporaries, Temporaries + NumTemporaries, ET->temps_begin()); -    return E; +  return E; +} + +void FullExpr::Destroy(ASTContext &Context) { +  if (Expr *E = SubExpr.dyn_cast<Expr *>()) { +    E->Destroy(Context); +    return; +  } +   +  ExprAndTemporaries *ET = SubExpr.get<ExprAndTemporaries *>(); +  for (ExprAndTemporaries::temps_iterator i = ET->temps_begin(),  +       e = ET->temps_end(); i != e; ++i) +    (*i)->Destroy(Context); + +  Context.Deallocate(ET);  } | 

