From aa39197431a0a0b1326ecf6b3be6a11f6e2f8503 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sat, 19 Apr 2008 23:09:31 +0000 Subject: [PATCH] simplify ownership of the predefines buffer. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@49973 91177308-0d34-0410-b5e6-96231b3b80d8 --- Driver/HTMLPrint.cpp | 2 +- Driver/clang.cpp | 22 ++++++---------------- include/clang/Lex/Preprocessor.h | 15 +++++++-------- lib/Lex/Preprocessor.cpp | 6 +----- 4 files changed, 15 insertions(+), 30 deletions(-) diff --git a/Driver/HTMLPrint.cpp b/Driver/HTMLPrint.cpp index b1c4c6d998..e6e6ab7edf 100644 --- a/Driver/HTMLPrint.cpp +++ b/Driver/HTMLPrint.cpp @@ -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. diff --git a/Driver/clang.cpp b/Driver/clang.cpp index 1a6db481b6..5ff30a4c5b 100644 --- a/Driver/clang.cpp +++ b/Driver/clang.cpp @@ -588,10 +588,7 @@ static void AddImplicitInclude(std::vector &Buf, const std::string &File){ /// static unsigned InitializePreprocessor(Preprocessor &PP, bool InitializeSourceMgr, - const std::string &InFile, - std::vector &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 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 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; } }; diff --git a/include/clang/Lex/Preprocessor.h b/include/clang/Lex/Preprocessor.h index 6a0255e051..daa9b40662 100644 --- a/include/clang/Lex/Preprocessor.h +++ b/include/clang/Lex/Preprocessor.h @@ -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 diff --git a/lib/Lex/Preprocessor.cpp b/lib/Lex/Preprocessor.cpp index 370244b8f6..9240a0aa7f 100644 --- a/lib/Lex/Preprocessor.cpp +++ b/lib/Lex/Preprocessor.cpp @@ -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); -- 2.40.0