]> granicus.if.org Git - clang/commitdiff
Bunch of type defs, etc. for @synchronized.
authorFariborz Jahanian <fjahanian@apple.com>
Tue, 29 Jan 2008 18:21:32 +0000 (18:21 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Tue, 29 Jan 2008 18:21:32 +0000 (18:21 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46520 91177308-0d34-0410-b5e6-96231b3b80d8

AST/StmtPrinter.cpp
Parse/ParseObjc.cpp
Parse/ParseStmt.cpp
include/clang/AST/Stmt.h
include/clang/AST/StmtNodes.def
include/clang/Parse/Parser.h

index 81bad22a7e7e9e9eddab24d59afb27f795cad47f..2bdeadfbef11d75d804cec476ff445dc176be3c8 100644 (file)
@@ -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.
 //===----------------------------------------------------------------------===//
index c07a16ca47748b67848ae2b853c5f4a98bd941f0..87e5c183fcb3d68a9d2b7becf9d548ab6d9e3605 100644 (file)
@@ -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
index 688cfe792ef60b7a4f6f6938f083f574c4e41f59..1eac2549d7666953adaea8cc8a2cb020060dd07c 100644 (file)
@@ -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
index c34f5c5a113cbd9e46ffbe644b0b9db31986100d..94ae9c88c46541799c3739a8844ddb151ee952b3 100644 (file)
@@ -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;
index 89953b1315c583b8e0503f9695ab03a1e05acc85..a8083e6adbe3b11f74d95679b58a53f1bb9c5341 100644 (file)
@@ -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)
 
index 379148b76d66fa8013b3d5cebb35009bb02b5491..6c3bbcddb2efa14f3b2c642a9c4f4ff47d093682 100644 (file)
@@ -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);