]> granicus.if.org Git - clang/commitdiff
Fix ownership model of ParseAST to allow the dtor of
authorChris Lattner <sabre@nondot.org>
Sat, 3 Nov 2007 06:24:16 +0000 (06:24 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 3 Nov 2007 06:24:16 +0000 (06:24 +0000)
ASTConsumer to process the AST before it is destroyed.
This allows elimination of HandleObjcMetaDataEmission.

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

Driver/DiagChecker.cpp
Driver/RewriteTest.cpp
Driver/clang.cpp
Sema/ASTStreamer.cpp
include/clang/AST/ASTConsumer.h
include/clang/Sema/ASTStreamer.h

index 4b457290e328f3ea74ed8783eb45af6e6b2ab049..8daaa6cce2dc1228bdb9f35c2170c9a2512a1087 100644 (file)
@@ -227,8 +227,8 @@ static bool CheckResults(Preprocessor &PP,
 /// CheckASTConsumer - Implement diagnostic checking for AST consumers.
 bool clang::CheckASTConsumer(Preprocessor &PP, unsigned MainFileID,
                              ASTConsumer* C) {
-
-  ParseAST(PP, MainFileID, *C);
+  // Parse the AST and run the consumer, ultimately deleting C.
+  ParseAST(PP, MainFileID, C);
   
   // Gather the set of expected diagnostics.
   DiagList ExpectedErrors, ExpectedWarnings;
index ca9b1153f02f9dd01b8134ebfbed21165346641e..7bbd7afdb522dc2ab3b43a236beb690b88deae03 100644 (file)
@@ -79,7 +79,6 @@ namespace {
     void SynthGetClassFunctionDecl();
     
     // Metadata emission.
-    void HandleObjcMetaDataEmission();
     void RewriteObjcClassMetaData(ObjcImplementationDecl *IDecl,
                                   std::string &Result);
     
@@ -162,6 +161,12 @@ RewriteTest::~RewriteTest() {
   // Get the top-level buffer that this corresponds to.
   RewriteTabs();
   
+  // Rewrite Objective-c meta data*
+  std::string ResultStr;
+  WriteObjcMetaData(ResultStr);
+  // For now just print the string out.
+  printf("%s", ResultStr.c_str());
+  
   // Get the buffer corresponding to MainFileID.  If we haven't changed it, then
   // we are done.
   if (const RewriteBuffer *RewriteBuf = 
@@ -175,16 +180,6 @@ RewriteTest::~RewriteTest() {
 
 }
 
-/// HandleObjcMetaDataEmission - main routine to generate objective-c's 
-/// metadata.
-void RewriteTest::HandleObjcMetaDataEmission() {
-  // Rewrite Objective-c meta data*
-  std::string ResultStr;
-  WriteObjcMetaData(ResultStr);
-  // For now just print the string out.
-  printf("%s", ResultStr.c_str());
-}
-
 //===----------------------------------------------------------------------===//
 // Syntactic (non-AST) Rewriting Code
 //===----------------------------------------------------------------------===//
index 77779f7e80e78c02a757d04be56d6274e4c47b1b..f5683024443396a4a51de64bc8aebaa3c7943e4b 100644 (file)
@@ -821,11 +821,10 @@ static void ProcessInputFile(Preprocessor &PP, unsigned MainFileID,
   
   if (Consumer) {
     if (VerifyDiagnostics)
-      exit (CheckASTConsumer(PP, MainFileID, Consumer));
-    else
-      ParseAST(PP, MainFileID, *Consumer, Stats);
-
-    delete Consumer;
+      exit(CheckASTConsumer(PP, MainFileID, Consumer));
+    
+    // This deletes Consumer.
+    ParseAST(PP, MainFileID, Consumer, Stats);
   }
   
   if (Stats) {
index d7f59af04b93600202da1685b0881eeadc50d2cc..be43289be516b367bc5dd3a3b821ef2663368a33 100644 (file)
@@ -89,9 +89,10 @@ void ASTStreamer::PrintStats() const {
 //===----------------------------------------------------------------------===//
 
 /// ParseAST - Parse the entire file specified, notifying the ASTConsumer as
-/// the file is parsed.
+/// the file is parsed.  This takes ownership of the ASTConsumer and
+/// ultimately deletes it.
 void clang::ParseAST(Preprocessor &PP, unsigned MainFileID, 
-                     ASTConsumer &Consumer, bool PrintStats) {
+                     ASTConsumer *Consumer, bool PrintStats) {
   // Collect global stats on Decls/Stmts (until we have a module streamer).
   if (PrintStats) {
     Decl::CollectingStats(true);
@@ -103,22 +104,22 @@ void clang::ParseAST(Preprocessor &PP, unsigned MainFileID,
   
   ASTStreamer Streamer(PP, Context, MainFileID);
   
-  Consumer.Initialize(Context, MainFileID);
+  Consumer->Initialize(Context, MainFileID);
   
   while (Decl *D = Streamer.ReadTopLevelDecl())
-    Consumer.HandleTopLevelDecl(D);
+    Consumer->HandleTopLevelDecl(D);
 
-  Consumer.HandleObjcMetaDataEmission();
-  
   if (PrintStats) {
     fprintf(stderr, "\nSTATISTICS:\n");
     Streamer.PrintStats();
     Context.PrintStats();
     Decl::PrintStats();
     Stmt::PrintStats();
-    Consumer.PrintStats();
+    Consumer->PrintStats();
     
     Decl::CollectingStats(false);
     Stmt::CollectingStats(false);
   }
+  
+  delete Consumer;
 }
index 48b6f0cea40ccf0605e7704e418e014b14bb07bf..160260f030bc615ccb7667d6a4c5093fdfd0aa65 100644 (file)
@@ -34,11 +34,6 @@ public:
   virtual void HandleTopLevelDecl(Decl *D) {
   }
   
-  /// HandleObjcMetaDataEmission - top level routine for objective-c
-  /// metadata emission.
-  virtual void HandleObjcMetaDataEmission() {
-  }
-  
   /// PrintStats - If desired, print any statistics.
   virtual void PrintStats() {
   }
index 3130613e7a8f905242d30c5ecba0cde70db2ba76..bffc4db9939e1944564711949006978ff5ebdb2d 100644 (file)
@@ -21,9 +21,10 @@ namespace clang {
   class ASTConsumer;
   
   /// ParseAST - Parse the entire file specified, notifying the ASTConsumer as
-  /// the file is parsed.  This does not take ownership of the ASTConsumer.
+  /// the file is parsed.  This takes ownership of the ASTConsumer and
+  /// ultimately deletes it.
   void ParseAST(Preprocessor &pp, unsigned MainFileID, 
-                ASTConsumer &C, bool PrintStats = false);
+                ASTConsumer *C, bool PrintStats = false);
 }  // end namespace clang
 
 #endif