diff options
author | Douglas Gregor <dgregor@apple.com> | 2012-02-14 17:54:36 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2012-02-14 17:54:36 +0000 |
commit | 99ae806aff77f7e6487eb9fb4857e2ac244010b5 (patch) | |
tree | 69f5ac5a5c0583f358b47cf2447827f19b0dd62b /clang/lib/AST/ExprCXX.cpp | |
parent | b1ba885b4945a701e5a70b3190adb6b8c9a24746 (diff) | |
download | bcm5719-llvm-99ae806aff77f7e6487eb9fb4857e2ac244010b5.tar.gz bcm5719-llvm-99ae806aff77f7e6487eb9fb4857e2ac244010b5.zip |
Implement AST (de-)serialization for lambda expressions.
llvm-svn: 150491
Diffstat (limited to 'clang/lib/AST/ExprCXX.cpp')
-rw-r--r-- | clang/lib/AST/ExprCXX.cpp | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/clang/lib/AST/ExprCXX.cpp b/clang/lib/AST/ExprCXX.cpp index 6825390772d..e09d88091be 100644 --- a/clang/lib/AST/ExprCXX.cpp +++ b/clang/lib/AST/ExprCXX.cpp @@ -832,6 +832,16 @@ LambdaExpr *LambdaExpr::Create(ASTContext &Context, ClosingBrace); } +LambdaExpr *LambdaExpr::CreateDeserialized(ASTContext &C, unsigned NumCaptures, + unsigned NumArrayIndexVars) { + unsigned Size = sizeof(LambdaExpr) + sizeof(Stmt *) * (NumCaptures + 1); + if (NumArrayIndexVars) + Size += sizeof(VarDecl) * NumArrayIndexVars + + sizeof(unsigned) * (NumCaptures + 1); + void *Mem = C.Allocate(Size); + return new (Mem) LambdaExpr(EmptyShell(), NumCaptures, NumArrayIndexVars > 0); +} + LambdaExpr::capture_iterator LambdaExpr::capture_begin() const { return getLambdaClass()->getLambdaData().Captures; } @@ -886,6 +896,13 @@ CXXMethodDecl *LambdaExpr::getCallOperator() const { return Result; } +CompoundStmt *LambdaExpr::getBody() const { + if (!getStoredStmts()[NumCaptures]) + getStoredStmts()[NumCaptures] = getCallOperator()->getBody(); + + return reinterpret_cast<CompoundStmt *>(getStoredStmts()[NumCaptures]); +} + bool LambdaExpr::isMutable() const { return (getCallOperator()->getTypeQualifiers() & Qualifiers::Const) == 0; } |