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
This commit is contained in:
Ted Kremenek 2008-08-06 15:50:59 +00:00
parent 44a15697ad
commit 8d78a09a56
1 changed files with 35 additions and 20 deletions

View File

@ -470,12 +470,34 @@ 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);
S.Emit(getType());
@ -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
//===----------------------------------------------------------------------===//