]> granicus.if.org Git - clang/commitdiff
Reorder serialization methods.
authorTed Kremenek <kremenek@apple.com>
Wed, 6 Aug 2008 15:50:59 +0000 (15:50 +0000)
committerTed Kremenek <kremenek@apple.com>
Wed, 6 Aug 2008 15:50:59 +0000 (15:50 +0000)
When serializing DeclStmt, encode a bit indicating whether or not the DeclStmt owns the Decl.  This is an interim solution.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@54410 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/StmtSerialization.cpp

index aad7e8160032d37cf45347e99f432c55a3f8b968..845f9024b178da3f683aebf6065834b507940f19 100644 (file)
@@ -470,11 +470,33 @@ ContinueStmt* ContinueStmt::CreateImpl(Deserializer& D, ASTContext& C) {
 }
 
 void DeclStmt::EmitImpl(Serializer& S) const {
-  // FIXME: special handling for struct decls.
-  S.EmitOwnedPtr(getDecl());  
   S.Emit(StartLoc);
   S.Emit(EndLoc);
+
+  // FIXME: Clean up ownership of the Decl.
+  const ScopedDecl* d = getDecl();
+  
+  if (!S.isRegistered(d)) {
+    S.EmitBool(true);
+    S.EmitOwnedPtr(d);
+  }
+  else {
+    S.EmitBool(false);
+    S.EmitPtr(d);
+  }
+}
+    
+DeclStmt* DeclStmt::CreateImpl(Deserializer& D, ASTContext& C) {
+  SourceLocation StartLoc = SourceLocation::ReadVal(D);
+  SourceLocation EndLoc = SourceLocation::ReadVal(D);
+  
+  bool OwnsDecl = D.ReadBool();  
+  ScopedDecl* decl = cast<ScopedDecl>(OwnsDecl ? D.ReadOwnedPtr<Decl>(C)
+                                               : D.ReadPtr<Decl>());
+  
+  return new DeclStmt(decl, StartLoc, EndLoc);
 }
+    
 
 void DeclRefExpr::EmitImpl(Serializer& S) const {
   S.Emit(Loc);
@@ -520,24 +542,6 @@ DeclRefExpr* DeclRefExpr::CreateImpl(Deserializer& D, ASTContext& C) {
   return new DeclRefExpr(decl,T,Loc);
 }
 
-void ObjCSuperRefExpr::EmitImpl(Serializer& S) const {
-  S.Emit(Loc);
-  S.Emit(getType());
-}
-
-ObjCSuperRefExpr* ObjCSuperRefExpr::CreateImpl(Deserializer& D, ASTContext& C) {
-  SourceLocation Loc = SourceLocation::ReadVal(D);
-  QualType T = QualType::ReadVal(D); 
-  return new ObjCSuperRefExpr(T, Loc); 
-}
-
-DeclStmt* DeclStmt::CreateImpl(Deserializer& D, ASTContext& C) {
-  ScopedDecl* decl = cast<ScopedDecl>(D.ReadOwnedPtr<Decl>(C));
-  SourceLocation StartLoc = SourceLocation::ReadVal(D);
-  SourceLocation EndLoc = SourceLocation::ReadVal(D);
-  return new DeclStmt(decl, StartLoc, EndLoc);
-}
-
 void DefaultStmt::EmitImpl(Serializer& S) const {
   S.Emit(DefaultLoc);
   S.EmitOwnedPtr(getSubStmt());
@@ -1101,6 +1105,17 @@ ObjCStringLiteral* ObjCStringLiteral::CreateImpl(Deserializer& D, ASTContext& C)
   return new ObjCStringLiteral(String,T,L);
 }
 
+void ObjCSuperRefExpr::EmitImpl(Serializer& S) const {
+  S.Emit(Loc);
+  S.Emit(getType());
+}
+
+ObjCSuperRefExpr* ObjCSuperRefExpr::CreateImpl(Deserializer& D, ASTContext& C) {
+  SourceLocation Loc = SourceLocation::ReadVal(D);
+  QualType T = QualType::ReadVal(D); 
+  return new ObjCSuperRefExpr(T, Loc); 
+}
+
 //===----------------------------------------------------------------------===//
 //   C++ Serialization
 //===----------------------------------------------------------------------===//