simplify ownership of the predefines buffer.
llvm-svn: 49973
This commit is contained in:
parent
0f103e1304
commit
ba1f37bfdf
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
};
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue