aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2008-01-29 18:21:32 +0000
committerFariborz Jahanian <fjahanian@apple.com>2008-01-29 18:21:32 +0000
commitc385c90c68dfa376650e2facfbb444b2ec9bd110 (patch)
tree89fa1d81158c9b6fdbf30faf1b645629ff238e32
parent356916ec84826a793b0353e5db0e9a7589b9ec5c (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.cpp11
-rw-r--r--Parse/ParseObjc.cpp7
-rw-r--r--Parse/ParseStmt.cpp4
-rw-r--r--include/clang/AST/Stmt.h34
-rw-r--r--include/clang/AST/StmtNodes.def3
-rw-r--r--include/clang/Parse/Parser.h1
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);