From: Ted Kremenek Date: Wed, 6 Aug 2008 15:50:59 +0000 (+0000) Subject: Reorder serialization methods. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a1a78246b1be7e64232af18941333eeb0731a1b9;p=clang Reorder serialization methods. 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 --- diff --git a/lib/AST/StmtSerialization.cpp b/lib/AST/StmtSerialization.cpp index aad7e81600..845f9024b1 100644 --- a/lib/AST/StmtSerialization.cpp +++ b/lib/AST/StmtSerialization.cpp @@ -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(OwnsDecl ? D.ReadOwnedPtr(C) + : D.ReadPtr()); + + 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(D.ReadOwnedPtr(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 //===----------------------------------------------------------------------===//