]> granicus.if.org Git - clang/commitdiff
simplify ownership of the predefines buffer.
authorChris Lattner <sabre@nondot.org>
Sat, 19 Apr 2008 23:09:31 +0000 (23:09 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 19 Apr 2008 23:09:31 +0000 (23:09 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@49973 91177308-0d34-0410-b5e6-96231b3b80d8

Driver/HTMLPrint.cpp
Driver/clang.cpp
include/clang/Lex/Preprocessor.h
lib/Lex/Preprocessor.cpp

index b1c4c6d998fbab748775f8e52b995c7efd5c44cb..e6e6ab7edf764bf6f1e6ea845803c6820603f326 100644 (file)
@@ -67,7 +67,7 @@ HTMLPrinter::~HTMLPrinter() {
   // for example.
   
   if (PP) html::SyntaxHighlight(R, FileID, *PP);
-  if (PPF) html::HighlightMacros(R, FileID, *PP);  
+  if (PPF) html::HighlightMacros(R, FileID, *PP);
   html::EscapeText(R, FileID, false, true);
   
   // Open the output.
index 1a6db481b617e782996cde1539472a7014498d2a..5ff30a4c5ba7c80231e451e6beba9ddf0ea2acd9 100644 (file)
@@ -588,10 +588,7 @@ static void AddImplicitInclude(std::vector<char> &Buf, const std::string &File){
 ///
 static unsigned InitializePreprocessor(Preprocessor &PP,
                                        bool InitializeSourceMgr, 
-                                       const std::string &InFile,
-                                       std::vector<char> &PredefineBuffer) {
-  
-
+                                       const std::string &InFile) {
   FileManager &FileMgr = PP.getFileManager();
   
   // Figure out where to get and map in the main file.
@@ -615,6 +612,8 @@ static unsigned InitializePreprocessor(Preprocessor &PP,
     }
   }
 
+  std::vector<char> PredefineBuffer;
+
   // Add macros from the command line.
   unsigned d = 0, D = D_macros.size();
   unsigned u = 0, U = U_macros.size();
@@ -631,13 +630,9 @@ static unsigned InitializePreprocessor(Preprocessor &PP,
   for (unsigned i = 0, e = ImplicitIncludes.size(); i != e; ++i)
     AddImplicitInclude(PredefineBuffer, ImplicitIncludes[i]);
   
-  // Null terminate PredefinedBuffer and add it.  We actually need to make a
-  // copy because PP will own the string.
+  // Null terminate PredefinedBuffer and add it.
   PredefineBuffer.push_back(0);
-  
-  char* predefines = new char[PredefineBuffer.size()];
-  std::copy(PredefineBuffer.begin(), PredefineBuffer.end(), predefines);
-  PP.setPredefines(predefines);
+  PP.setPredefines(&PredefineBuffer[0]);
   
   // Once we've read this, we're done.
   return SourceMgr.getMainFileID();
@@ -1031,7 +1026,6 @@ class VISIBILITY_HIDDEN DriverPreprocessorFactory : public PreprocessorFactory {
   TargetInfo        &Target;
   SourceManager     &SourceMgr;
   HeaderSearch      &HeaderInfo;
-  std::vector<char> PredefineBuffer;
   bool              InitializeSourceMgr;
   
 public:
@@ -1046,19 +1040,15 @@ public:
   virtual ~DriverPreprocessorFactory() {}
   
   virtual Preprocessor* CreatePreprocessor() {
-    PredefineBuffer.clear();
-
     Preprocessor* PP = new Preprocessor(Diags, LangInfo, Target,
                                         SourceMgr, HeaderInfo);
     
-    if (!InitializePreprocessor(*PP, InitializeSourceMgr, InFile,
-                                PredefineBuffer)) {
+    if (!InitializePreprocessor(*PP, InitializeSourceMgr, InFile)) {
       delete PP;
       return NULL;
     }
     
     InitializeSourceMgr = false;
-    
     return PP;
   }
 };
index 6a0255e05169d93d75f0af452566b45276493fa9..daa9b406623ec956004ad7241eb5f7a8301fe559 100644 (file)
@@ -130,9 +130,9 @@ class Preprocessor {
   unsigned NumFastMacroExpanded, NumTokenPaste, NumFastTokenPaste;
   unsigned NumSkipped;
   
-  /// Predefines - This pointer, if non-null, are the predefined macros that 
-  /// preprocessor should use from the command line etc.
-  const char *Predefines;
+  /// Predefines - This string is the predefined macros that preprocessor
+  /// should use from the command line etc.
+  std::string Predefines;
   
   /// TokenLexerCache - Cache macro expanders to reduce malloc traffic.
   enum { TokenLexerCacheSize = 8 };
@@ -196,11 +196,10 @@ public:
   ///
   void setMacroInfo(IdentifierInfo *II, MacroInfo *MI);
   
-  /// setPredefines - Set the predefines for this Preprocessor.
-  ///  The Preprocessor assumes ownership of this pointer.
-  void setPredefines(const char *P) {
-    Predefines = P;
-  }
+  /// setPredefines - Set the predefines for this Preprocessor.  These
+  /// predefines are automatically injected when parsing the main file.
+  void setPredefines(const char *P) { Predefines = P; }
+  void setPredefines(const std::string &P) { Predefines = P; }
   
   /// getIdentifierInfo - Return information about the specified preprocessor
   /// identifier token.  The version of this method that takes two character
index 370244b8f6bd0f28be8b46064ad6ce4d52f513d6..9240a0aa7f5e109bf30f564aab24e2d40ebe8a2d 100644 (file)
@@ -72,8 +72,6 @@ Preprocessor::Preprocessor(Diagnostic &diags, const LangOptions &opts,
   // This gets unpoisoned where it is allowed.
   (Ident__VA_ARGS__ = getIdentifierInfo("__VA_ARGS__"))->setIsPoisoned();
   
-  Predefines = 0;
-  
   // Initialize the pragma handlers.
   PragmaHandlers = new PragmaNamespace(0);
   RegisterBuiltinPragmas();
@@ -112,8 +110,6 @@ Preprocessor::~Preprocessor() {
   delete ScratchBuf;
 
   delete Callbacks;
-  
-  delete [] Predefines;
 }
 
 /// Diag - Forwarding function for diagnostics.  This emits a diagnostic at
@@ -463,7 +459,7 @@ void Preprocessor::EnterMainSourceFile() {
   InitializePredefinedMacros(*this, PrologFile);
   
   // Add on the predefines from the driver.
-  PrologFile.insert(PrologFile.end(), Predefines,Predefines+strlen(Predefines));
+  PrologFile.insert(PrologFile.end(), Predefines.begin(), Predefines.end());
   
   // Memory buffer must end with a null byte!
   PrologFile.push_back(0);