diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2008-01-29 18:21:32 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2008-01-29 18:21:32 +0000 |
commit | c385c90c68dfa376650e2facfbb444b2ec9bd110 (patch) | |
tree | 89fa1d81158c9b6fdbf30faf1b645629ff238e32 | |
parent | 356916ec84826a793b0353e5db0e9a7589b9ec5c (diff) |
Bunch of type defs, etc. for @synchronized.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46520 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | AST/StmtPrinter.cpp | 11 | ||||
-rw-r--r-- | Parse/ParseObjc.cpp | 7 | ||||
-rw-r--r-- | Parse/ParseStmt.cpp | 4 | ||||
-rw-r--r-- | include/clang/AST/Stmt.h | 34 | ||||
-rw-r--r-- | include/clang/AST/StmtNodes.def | 3 | ||||
-rw-r--r-- | include/clang/Parse/Parser.h | 1 |
6 files changed, 58 insertions, 2 deletions
diff --git a/AST/StmtPrinter.cpp b/AST/StmtPrinter.cpp index 81bad22a7e..2bdeadfbef 100644 --- a/AST/StmtPrinter.cpp +++ b/AST/StmtPrinter.cpp @@ -455,6 +455,17 @@ void StmtPrinter::VisitObjCAtThrowStmt (ObjCAtThrowStmt *Node) { OS << ";\n"; } +void StmtPrinter::VisitObjCAtSynchronizedStmt (ObjCAtSynchronizedStmt *Node) { + Indent() << "@synchronized ("; + PrintExpr(Node->getSynchExpr()); + OS << ")"; + if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getSynchBody())) + { + PrintRawCompoundStmt(CS); + OS << "\n"; + } +} + //===----------------------------------------------------------------------===// // Expr printing methods. //===----------------------------------------------------------------------===// diff --git a/Parse/ParseObjc.cpp b/Parse/ParseObjc.cpp index c07a16ca47..87e5c183fc 100644 --- a/Parse/ParseObjc.cpp +++ b/Parse/ParseObjc.cpp @@ -1109,6 +1109,13 @@ Parser::StmtResult Parser::ParseObjCThrowStmt(SourceLocation atLoc) { return Actions.ActOnObjCAtThrowStmt(atLoc, Res.Val); } +/// objc-synchronized-statement: +/// @synchronized '(' expression ')' +/// +Parser::StmtResult Parser::ParseObjCSynchronizedStmt(SourceLocation atLoc) { + return 0; +} + /// objc-try-catch-statement: /// @try compound-statement objc-catch-list[opt] /// @try compound-statement objc-catch-list[opt] @finally compound-statement diff --git a/Parse/ParseStmt.cpp b/Parse/ParseStmt.cpp index 688cfe792e..1eac2549d7 100644 --- a/Parse/ParseStmt.cpp +++ b/Parse/ParseStmt.cpp @@ -36,7 +36,7 @@ using namespace clang; /// jump-statement /// [OBC] objc-throw-statement /// [OBC] objc-try-catch-statement -/// [OBC] objc-synchronized-statement [TODO] +/// [OBC] objc-synchronized-statement /// [GNU] asm-statement /// [OMP] openmp-construct [TODO] /// @@ -91,6 +91,8 @@ Parser::StmtResult Parser::ParseStatementOrDeclaration(bool OnlyStatement) { return ParseObjCTryStmt(AtLoc); else if (Tok.isObjCAtKeyword(tok::objc_throw)) return ParseObjCThrowStmt(AtLoc); + else if (Tok.isObjCAtKeyword(tok::objc_synchronized)) + return ParseObjCSynchronizedStmt(AtLoc); ExprResult Res = ParseExpressionWithLeadingAt(AtLoc); if (Res.isInvalid) { // If the expression is invalid, skip ahead to the next semicolon. Not diff --git a/include/clang/AST/Stmt.h b/include/clang/AST/Stmt.h index c34f5c5a11..94ae9c88c4 100644 --- a/include/clang/AST/Stmt.h +++ b/include/clang/AST/Stmt.h @@ -962,6 +962,40 @@ public: static ObjCAtTryStmt* CreateImpl(llvm::Deserializer& D); }; +/// ObjCAtSynchronizedStmt - This is for objective-c's @synchronized statement. +/// +class ObjCAtSynchronizedStmt : public Stmt { +private: + Expr* SynchExpr; + Stmt* SynchBody; + SourceLocation AtSynchronizedLoc; + +public: + ObjCAtSynchronizedStmt(SourceLocation atSynchronizedLoc, Expr *synchExpr, + Stmt *synchBody) + : Stmt(ObjCAtSynchronizedStmtClass), + SynchExpr(synchExpr), SynchBody(synchBody), + AtSynchronizedLoc(atSynchronizedLoc) {} + + const Stmt *getSynchBody() const { return SynchBody; } + Stmt *getSynchBody() { return SynchBody; } + + const Expr *getSynchExpr() const { return SynchExpr; } + Expr *getSynchExpr() { return SynchExpr; } + + virtual SourceRange getSourceRange() const { + return SourceRange(AtSynchronizedLoc, SynchBody->getLocEnd()); + } + + static bool classof(const Stmt *T) { + return T->getStmtClass() == ObjCAtSynchronizedStmtClass; + } + static bool classof(const ObjCAtSynchronizedStmt *) { return true; } + + virtual void EmitImpl(llvm::Serializer& S) const; + static ObjCAtSynchronizedStmt* CreateImpl(llvm::Deserializer& D); +}; + /// ObjCAtThrowStmt - This represents objective-c's @throw statement. class ObjCAtThrowStmt : public Stmt { Stmt *Throw; diff --git a/include/clang/AST/StmtNodes.def b/include/clang/AST/StmtNodes.def index 89953b1315..a8083e6adb 100644 --- a/include/clang/AST/StmtNodes.def +++ b/include/clang/AST/StmtNodes.def @@ -49,8 +49,9 @@ STMT(19, ObjCAtTryStmt , Stmt) STMT(20, ObjCAtCatchStmt , Stmt) STMT(21, ObjCAtFinallyStmt , Stmt) STMT(22, ObjCAtThrowStmt , Stmt) +STMT(23, ObjCAtSynchronizedStmt , Stmt) // Obj-C2 statements -STMT(23, ObjCForCollectionStmt, Stmt) +STMT(24, ObjCForCollectionStmt, Stmt) LAST_STMT(23) diff --git a/include/clang/Parse/Parser.h b/include/clang/Parse/Parser.h index 379148b76d..6c3bbcddb2 100644 --- a/include/clang/Parse/Parser.h +++ b/include/clang/Parse/Parser.h @@ -405,6 +405,7 @@ private: StmtResult ParseAsmStatement(); StmtResult ParseObjCTryStmt(SourceLocation atLoc); StmtResult ParseObjCThrowStmt(SourceLocation atLoc); + StmtResult ParseObjCSynchronizedStmt(SourceLocation atLoc); void ParseAsmOperandsOpt(llvm::SmallVectorImpl<std::string> &Names, llvm::SmallVectorImpl<ExprTy*> &Constraints, llvm::SmallVectorImpl<ExprTy*> &Exprs); |