]> granicus.if.org Git - clang/commitdiff
AST for @synchronized.
authorFariborz Jahanian <fjahanian@apple.com>
Tue, 29 Jan 2008 19:14:59 +0000 (19:14 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Tue, 29 Jan 2008 19:14:59 +0000 (19:14 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46524 91177308-0d34-0410-b5e6-96231b3b80d8

AST/Stmt.cpp
AST/StmtSerialization.cpp
Parse/ParseObjc.cpp
Sema/Sema.h
Sema/SemaStmt.cpp
include/clang/AST/Stmt.h
include/clang/Parse/Action.h

index 8d4f6133efeb32ba3bdd1103f0260c89ecab96db..0f4936b1bbf056eba1d0f6f4406c21ab8289fd35 100644 (file)
@@ -249,3 +249,13 @@ Stmt::child_iterator ObjCAtThrowStmt::child_begin() {
 Stmt::child_iterator ObjCAtThrowStmt::child_end() {
   return &Throw+1;
 }
+
+// ObjCAtSynchronizedStmt
+Stmt::child_iterator ObjCAtSynchronizedStmt::child_begin() {
+  return &SynchBody;
+}
+
+Stmt::child_iterator ObjCAtSynchronizedStmt::child_end() {
+  return &SynchBody+1;
+}
+
index 545813cfba97881647067e6afeb7fb233af03931..8394dc6ea0d9d7ff3bae57d8314afcce3e0addaf 100644 (file)
@@ -893,6 +893,20 @@ ObjCAtThrowStmt* ObjCAtThrowStmt::CreateImpl(Deserializer& D) {
   Stmt* Throw = D.ReadOwnedPtr<Stmt>();
   return new ObjCAtThrowStmt(L,Throw);  
 }
+
+void ObjCAtSynchronizedStmt::EmitImpl(Serializer& S) const {
+  S.Emit(AtSynchronizedLoc);
+  S.EmitOwnedPtr(SynchExpr);
+  S.EmitOwnedPtr(SynchBody);
+}
+
+ObjCAtSynchronizedStmt* ObjCAtSynchronizedStmt::CreateImpl(Deserializer& D) {
+  SourceLocation L = SourceLocation::ReadVal(D);
+  Expr *syncExpr = D.ReadOwnedPtr<Expr>();
+  Stmt *synchBody = D.ReadOwnedPtr<Stmt>();
+  ObjCAtSynchronizedStmt* stmt = new ObjCAtSynchronizedStmt(L,syncExpr,synchBody);
+  return stmt;
+}
   
 void ObjCAtTryStmt::EmitImpl(Serializer& S) const {
   S.Emit(AtTryLoc);
index 87e5c183fcb3d68a9d2b7becf9d548ab6d9e3605..41cab3bf77914c0aef992c9262857b435beff9c5 100644 (file)
@@ -1113,7 +1113,27 @@ Parser::StmtResult Parser::ParseObjCThrowStmt(SourceLocation atLoc) {
 ///   @synchronized '(' expression ')'
 ///
 Parser::StmtResult Parser::ParseObjCSynchronizedStmt(SourceLocation atLoc) {
-  return 0;
+  ExprResult Res;
+  ConsumeToken(); // consume synchronized
+  if (Tok.isNot(tok::l_paren)) {
+    Diag (Tok, diag::err_expected_lparen_after, "@synchronized");
+    return true;
+  }
+  ConsumeParen();  // '('
+  Res = ParseExpression();
+  if (Res.isInvalid) {
+    SkipUntil(tok::semi);
+    return true;
+  }
+  if (Tok.isNot(tok::r_paren)) {
+    Diag (Tok, diag::err_expected_rparen);
+    return true;
+  }
+  ConsumeParen();  // ')'
+  StmtResult SynchBody = ParseCompoundStatementBody();
+  if (SynchBody.isInvalid)
+    SynchBody = Actions.ActOnNullStmt(Tok.getLocation());
+  return Actions.ActOnObjCAtSynchronizedStmt(atLoc, Res.Val, SynchBody.Val);
 }
 
 ///  objc-try-catch-statement:
index c402baef949c4de6fa54156bbfb3016855af574b..a35af4341fc2c7cbebaf1b149e160a506cf1c638 100644 (file)
@@ -378,6 +378,9 @@ public:
   
   virtual StmtResult ActOnObjCAtThrowStmt(SourceLocation AtLoc, 
                                           StmtTy *Throw);
+  virtual StmtResult ActOnObjCAtSynchronizedStmt(SourceLocation AtLoc, 
+                                                 ExprTy *SynchExpr, 
+                                                 StmtTy *SynchBody);
   
   //===--------------------------------------------------------------------===//
   // Expression Parsing Callbacks: SemaExpr.cpp.
index b8483866f5bfbaff59404dcb5d47115373367529..e702ce802a38aa8627c79d669a5afaf86fa7bd23 100644 (file)
@@ -809,5 +809,12 @@ Sema::ActOnObjCAtThrowStmt(SourceLocation AtLoc, StmtTy *Throw) {
   return TS;
 }
 
+Action::StmtResult
+Sema::ActOnObjCAtSynchronizedStmt(SourceLocation AtLoc, ExprTy *SynchExpr, 
+                                  StmtTy *SynchBody) {
+  ObjCAtSynchronizedStmt *SS = new ObjCAtSynchronizedStmt(AtLoc, 
+    static_cast<Expr*>(SynchExpr), static_cast<Stmt*>(SynchBody));
+  return SS;
+}
 
 
index 94ae9c88c46541799c3739a8844ddb151ee952b3..17757fb52d91f83be6aaed9a1c791139a8326fd6 100644 (file)
@@ -992,6 +992,9 @@ public:
   }
   static bool classof(const ObjCAtSynchronizedStmt *) { return true; }
   
+  virtual child_iterator child_begin();
+  virtual child_iterator child_end();
+  
   virtual void EmitImpl(llvm::Serializer& S) const;
   static ObjCAtSynchronizedStmt* CreateImpl(llvm::Deserializer& D);
 };
index d948b94b863bc71c6778c0bb79eb9259bf786955..ce4781b91a8d752864fd43403f1947e6e73d1c94 100644 (file)
@@ -335,6 +335,12 @@ public:
     return 0;
   }
   
+  virtual StmtResult ActOnObjCAtSynchronizedStmt(SourceLocation AtLoc, 
+                                        ExprTy *SynchExpr, 
+                                        StmtTy *SynchBody) {
+    return 0;
+  }
+  
   //===--------------------------------------------------------------------===//
   // Expression Parsing Callbacks.
   //===--------------------------------------------------------------------===//