From 8d78a09a56d80840a6b8383825c35a60bfdac1bc Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Wed, 6 Aug 2008 15:50:59 +0000 Subject: [PATCH] Reorder serialization methods. When serializing DeclStmt, encode a bit indicating whether or not the DeclStmt owns the Decl. This is an interim solution. llvm-svn: 54410 --- clang/lib/AST/StmtSerialization.cpp | 55 ++++++++++++++++++----------- 1 file changed, 35 insertions(+), 20 deletions(-) diff --git a/clang/lib/AST/StmtSerialization.cpp b/clang/lib/AST/StmtSerialization.cpp index aad7e8160032..845f9024b178 100644 --- a/clang/lib/AST/StmtSerialization.cpp +++ b/clang/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 //===----------------------------------------------------------------------===//