diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/AST/Decl.cpp | 24 | ||||
-rw-r--r-- | lib/AST/DeclBase.cpp | 3 | ||||
-rw-r--r-- | lib/AST/DeclSerialization.cpp | 16 | ||||
-rw-r--r-- | lib/AST/Expr.cpp | 11 | ||||
-rw-r--r-- | lib/AST/StmtPrinter.cpp | 13 | ||||
-rw-r--r-- | lib/AST/StmtSerialization.cpp | 12 | ||||
-rw-r--r-- | lib/Sema/SemaExpr.cpp | 7 |
7 files changed, 67 insertions, 19 deletions
diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp index 3ddf81974b..c900a734ae 100644 --- a/lib/AST/Decl.cpp +++ b/lib/AST/Decl.cpp @@ -76,6 +76,13 @@ FunctionDecl *FunctionDecl::Create(ASTContext &C, DeclContext *DC, TypeSpecStartLoc); } +BlockDecl *BlockDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L, + ParmVarDecl **args, unsigned numargs, + CompoundStmt *body) { + void *Mem = C.getAllocator().Allocate<BlockDecl>(); + return new (Mem) BlockDecl(DC, L, args, numargs, body); +} + FieldDecl *FieldDecl::Create(ASTContext &C, SourceLocation L, IdentifierInfo *Id, QualType T, Expr *BW) { void *Mem = C.getAllocator().Allocate<FieldDecl>(); @@ -285,3 +292,20 @@ FieldDecl *RecordDecl::getMember(IdentifierInfo *II) { return Members[i]; return 0; } + +//===----------------------------------------------------------------------===// +// BlockDecl Implementation +//===----------------------------------------------------------------------===// + +BlockDecl::~BlockDecl() { +} + +void BlockDecl::Destroy(ASTContext& C) { + if (Body) + Body->Destroy(C); + + for (param_iterator I=param_begin(), E=param_end(); I!=E; ++I) + (*I)->Destroy(C); + + Decl::Destroy(C); +} diff --git a/lib/AST/DeclBase.cpp b/lib/AST/DeclBase.cpp index db179fec3e..b42950ffc0 100644 --- a/lib/AST/DeclBase.cpp +++ b/lib/AST/DeclBase.cpp @@ -49,6 +49,7 @@ static unsigned nObjCPropertyDecl = 0; static unsigned nObjCPropertyImplDecl = 0; static unsigned nLinkageSpecDecl = 0; static unsigned nFileScopeAsmDecl = 0; +static unsigned nBlockDecls = 0; static bool StatSwitch = false; @@ -77,6 +78,7 @@ const char *Decl::getDeclKindName() const { case Union: return "Union"; case Class: return "Class"; case Enum: return "Enum"; + case Block: return "Block"; } } @@ -221,6 +223,7 @@ void Decl::addDeclKind(Kind k) { case ObjCPropertyImpl: nObjCPropertyImplDecl++; break; case LinkageSpec: nLinkageSpecDecl++; break; case FileScopeAsm: nFileScopeAsmDecl++; break; + case Block: nBlockDecls++; break; case ImplicitParam: case TranslationUnit: break; diff --git a/lib/AST/DeclSerialization.cpp b/lib/AST/DeclSerialization.cpp index 3f36e3ac89..2ebcb76fbf 100644 --- a/lib/AST/DeclSerialization.cpp +++ b/lib/AST/DeclSerialization.cpp @@ -441,6 +441,22 @@ FunctionDecl* FunctionDecl::CreateImpl(Deserializer& D, ASTContext& C) { return decl; } +void BlockDecl::EmitImpl(Serializer& S) const { + // FIXME: what about arguments? + S.Emit(getCaretLocation()); + S.EmitOwnedPtr(Body); +} + +BlockDecl* BlockDecl::CreateImpl(Deserializer& D, ASTContext& C) { + QualType Q = QualType::ReadVal(D); + SourceLocation L = SourceLocation::ReadVal(D); + /*CompoundStmt* BodyStmt = cast<CompoundStmt>(*/D.ReadOwnedPtr<Stmt>(C)/*)*/; + assert(0 && "Cannot deserialize BlockBlockExpr yet"); + // FIXME: need to handle parameters. + //return new BlockBlockExpr(L, Q, BodyStmt); + return 0; +} + //===----------------------------------------------------------------------===// // RecordDecl Serialization. //===----------------------------------------------------------------------===// diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp index 6cdaacd689..dfe412f4fc 100644 --- a/lib/AST/Expr.cpp +++ b/lib/AST/Expr.cpp @@ -217,6 +217,13 @@ const FunctionType *BlockExpr::getFunctionType() const { getPointeeType()->getAsFunctionType(); } +SourceLocation BlockExpr::getCaretLocation() const { + return TheBlock->getCaretLocation(); +} +const Stmt *BlockExpr::getBody() const { return TheBlock->getBody(); } +Stmt *BlockExpr::getBody() { return TheBlock->getBody(); } + + //===----------------------------------------------------------------------===// // Generic Expression Routines //===----------------------------------------------------------------------===// @@ -1400,8 +1407,8 @@ Stmt::child_iterator ObjCMessageExpr::child_end() { } // Blocks -Stmt::child_iterator BlockExpr::child_begin() { return &Body; } -Stmt::child_iterator BlockExpr::child_end() { return &Body+1; } +Stmt::child_iterator BlockExpr::child_begin() { return child_iterator(); } +Stmt::child_iterator BlockExpr::child_end() { return child_iterator(); } Stmt::child_iterator BlockDeclRefExpr::child_begin() { return child_iterator();} Stmt::child_iterator BlockDeclRefExpr::child_end() { return child_iterator(); } diff --git a/lib/AST/StmtPrinter.cpp b/lib/AST/StmtPrinter.cpp index 844a3e8560..ba67a97deb 100644 --- a/lib/AST/StmtPrinter.cpp +++ b/lib/AST/StmtPrinter.cpp @@ -895,26 +895,27 @@ void StmtPrinter::VisitObjCMessageExpr(ObjCMessageExpr *Mess) { } void StmtPrinter::VisitBlockExpr(BlockExpr *Node) { + BlockDecl *BD = Node->getBlockDecl(); OS << "^"; const FunctionType *AFT = Node->getFunctionType(); if (isa<FunctionTypeNoProto>(AFT)) { OS << "()"; - } else if (!Node->arg_empty() || cast<FunctionTypeProto>(AFT)->isVariadic()) { - const FunctionTypeProto *FT = cast<FunctionTypeProto>(AFT); + } else if (!BD->param_empty() || cast<FunctionTypeProto>(AFT)->isVariadic()) { OS << '('; std::string ParamStr; - for (BlockExpr::arg_iterator AI = Node->arg_begin(), - E = Node->arg_end(); AI != E; ++AI) { - if (AI != Node->arg_begin()) OS << ", "; + for (BlockDecl::param_iterator AI = BD->param_begin(), + E = BD->param_end(); AI != E; ++AI) { + if (AI != BD->param_begin()) OS << ", "; ParamStr = (*AI)->getName(); (*AI)->getType().getAsStringInternal(ParamStr); OS << ParamStr; } + const FunctionTypeProto *FT = cast<FunctionTypeProto>(AFT); if (FT->isVariadic()) { - if (!Node->arg_empty()) OS << ", "; + if (!BD->param_empty()) OS << ", "; OS << "..."; } OS << ')'; diff --git a/lib/AST/StmtSerialization.cpp b/lib/AST/StmtSerialization.cpp index f72800d8ad..a4fd8c3567 100644 --- a/lib/AST/StmtSerialization.cpp +++ b/lib/AST/StmtSerialization.cpp @@ -1114,18 +1114,12 @@ ObjCStringLiteral* ObjCStringLiteral::CreateImpl(Deserializer& D, ASTContext& C) void BlockExpr::EmitImpl(Serializer& S) const { S.Emit(getType()); - S.Emit(getCaretLocation()); - S.EmitOwnedPtr(Body); + S.EmitOwnedPtr(TheBlock); } BlockExpr* BlockExpr::CreateImpl(Deserializer& D, ASTContext& C) { - QualType Q = QualType::ReadVal(D); - SourceLocation L = SourceLocation::ReadVal(D); - /*CompoundStmt* BodyStmt = cast<CompoundStmt>(*/D.ReadOwnedPtr<Stmt>(C)/*)*/; - assert(0 && "Cannot deserialize BlockBlockExpr yet"); - // FIXME: need to handle parameters. - //return new BlockBlockExpr(L, Q, BodyStmt); - return 0; + QualType T = QualType::ReadVal(D); + return new BlockExpr(cast<BlockDecl>(D.ReadOwnedPtr<Decl>(C)),T); } void BlockDeclRefExpr::EmitImpl(Serializer& S) const { diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index fa18ce313e..b8b614db07 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -2931,8 +2931,11 @@ Sema::ExprResult Sema::ActOnBlockStmtExpr(SourceLocation CaretLoc, StmtTy *body, BSI->isVariadic); BlockTy = Context.getBlockPointerType(BlockTy); - return new BlockExpr(CaretLoc, BlockTy, &BSI->Params[0], BSI->Params.size(), - Body.take()); + + BlockDecl *NewBD = BlockDecl::Create(Context, CurContext, CaretLoc, + &BSI->Params[0], BSI->Params.size(), + Body.take()); + return new BlockExpr(NewBD, BlockTy); } /// ExprsMatchFnType - return true if the Exprs in array Args have |