зеркало из https://github.com/microsoft/clang.git
Using llvm::OwningPtr<> for CurLexer and CurTokenLexer. This makes both the ownership semantics of these objects explicit within the Preprocessor and also tightens up the code (explicit deletes not needed).
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59249 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
ed04c4cdca
Коммит
caaa7df2c7
|
@ -20,6 +20,7 @@
|
|||
#include "clang/Basic/IdentifierTable.h"
|
||||
#include "clang/Basic/SourceLocation.h"
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/ADT/OwningPtr.h"
|
||||
|
||||
namespace clang {
|
||||
|
||||
|
@ -93,7 +94,7 @@ class Preprocessor {
|
|||
|
||||
/// CurLexer - This is the current top of the stack that we're lexing from if
|
||||
/// not expanding a macro. One of CurLexer and CurTokenLexer must be null.
|
||||
Lexer *CurLexer;
|
||||
llvm::OwningPtr<Lexer> CurLexer;
|
||||
|
||||
/// CurLookup - The DirectoryLookup structure used to find the current
|
||||
/// FileEntry, if CurLexer is non-null and if applicable. This allows us to
|
||||
|
@ -102,7 +103,7 @@ class Preprocessor {
|
|||
|
||||
/// CurTokenLexer - This is the current macro we are expanding, if we are
|
||||
/// expanding a macro. One of CurLexer and CurTokenLexer must be null.
|
||||
TokenLexer *CurTokenLexer;
|
||||
llvm::OwningPtr<TokenLexer> CurTokenLexer;
|
||||
|
||||
/// IncludeMacroStack - This keeps track of the stack of files currently
|
||||
/// #included, and macros currently being expanded from, not counting
|
||||
|
@ -191,7 +192,7 @@ public:
|
|||
/// isCurrentLexer - Return true if we are lexing directly from the specified
|
||||
/// lexer.
|
||||
bool isCurrentLexer(const Lexer *L) const {
|
||||
return CurLexer == L;
|
||||
return CurLexer.get() == L;
|
||||
}
|
||||
|
||||
/// getCurrentLexer - Return the current file lexer being lexed from. Note
|
||||
|
@ -484,16 +485,14 @@ public:
|
|||
private:
|
||||
|
||||
void PushIncludeMacroStack() {
|
||||
IncludeMacroStack.push_back(IncludeStackInfo(CurLexer, CurDirLookup,
|
||||
CurTokenLexer));
|
||||
CurLexer = 0;
|
||||
CurTokenLexer = 0;
|
||||
IncludeMacroStack.push_back(IncludeStackInfo(CurLexer.take(), CurDirLookup,
|
||||
CurTokenLexer.take()));
|
||||
}
|
||||
|
||||
void PopIncludeMacroStack() {
|
||||
CurLexer = IncludeMacroStack.back().TheLexer;
|
||||
CurLexer.reset(IncludeMacroStack.back().TheLexer);
|
||||
CurDirLookup = IncludeMacroStack.back().TheDirLookup;
|
||||
CurTokenLexer = IncludeMacroStack.back().TheTokenLexer;
|
||||
CurTokenLexer.reset(IncludeMacroStack.back().TheTokenLexer);
|
||||
IncludeMacroStack.pop_back();
|
||||
}
|
||||
|
||||
|
|
|
@ -48,7 +48,7 @@ bool Preprocessor::isInPrimaryFile() const {
|
|||
/// that this ignores any potentially active macro expansions and _Pragma
|
||||
/// expansions going on at the time.
|
||||
Lexer *Preprocessor::getCurrentFileLexer() const {
|
||||
if (CurLexer && !CurLexer->Is_PragmaLexer) return CurLexer;
|
||||
if (CurLexer && !CurLexer->Is_PragmaLexer) return CurLexer.get();
|
||||
|
||||
// Look for a stacked lexer.
|
||||
for (unsigned i = IncludeMacroStack.size(); i != 0; --i) {
|
||||
|
@ -88,7 +88,7 @@ void Preprocessor::EnterSourceFileWithLexer(Lexer *TheLexer,
|
|||
if (CurLexer || CurTokenLexer)
|
||||
PushIncludeMacroStack();
|
||||
|
||||
CurLexer = TheLexer;
|
||||
CurLexer.reset(TheLexer);
|
||||
CurDirLookup = CurDir;
|
||||
|
||||
// Notify the client, if desired, that we are in a new source file.
|
||||
|
@ -110,9 +110,9 @@ void Preprocessor::EnterMacro(Token &Tok, MacroArgs *Args) {
|
|||
CurDirLookup = 0;
|
||||
|
||||
if (NumCachedTokenLexers == 0) {
|
||||
CurTokenLexer = new TokenLexer(Tok, Args, *this);
|
||||
CurTokenLexer.reset(new TokenLexer(Tok, Args, *this));
|
||||
} else {
|
||||
CurTokenLexer = TokenLexerCache[--NumCachedTokenLexers];
|
||||
CurTokenLexer.reset(TokenLexerCache[--NumCachedTokenLexers]);
|
||||
CurTokenLexer->Init(Tok, Args);
|
||||
}
|
||||
}
|
||||
|
@ -138,10 +138,10 @@ void Preprocessor::EnterTokenStream(const Token *Toks, unsigned NumToks,
|
|||
|
||||
// Create a macro expander to expand from the specified token stream.
|
||||
if (NumCachedTokenLexers == 0) {
|
||||
CurTokenLexer = new TokenLexer(Toks, NumToks, DisableMacroExpansion,
|
||||
OwnsTokens, *this);
|
||||
CurTokenLexer.reset(new TokenLexer(Toks, NumToks, DisableMacroExpansion,
|
||||
OwnsTokens, *this));
|
||||
} else {
|
||||
CurTokenLexer = TokenLexerCache[--NumCachedTokenLexers];
|
||||
CurTokenLexer.reset(TokenLexerCache[--NumCachedTokenLexers]);
|
||||
CurTokenLexer->Init(Toks, NumToks, DisableMacroExpansion, OwnsTokens);
|
||||
}
|
||||
}
|
||||
|
@ -204,8 +204,7 @@ bool Preprocessor::HandleEndOfFile(Token &Result, bool isEndOfMacro) {
|
|||
CurLexer->FormTokenWithChars(Result, EndPos, tok::eof);
|
||||
|
||||
// We're done with the #included file.
|
||||
delete CurLexer;
|
||||
CurLexer = 0;
|
||||
CurLexer.reset();
|
||||
|
||||
// This is the end of the top-level file. If the diag::pp_macro_not_used
|
||||
// diagnostic is enabled, look for macros that have not been used.
|
||||
|
@ -227,12 +226,11 @@ bool Preprocessor::HandleEndOfTokenLexer(Token &Result) {
|
|||
|
||||
// Delete or cache the now-dead macro expander.
|
||||
if (NumCachedTokenLexers == TokenLexerCacheSize)
|
||||
delete CurTokenLexer;
|
||||
CurTokenLexer.reset();
|
||||
else
|
||||
TokenLexerCache[NumCachedTokenLexers++] = CurTokenLexer;
|
||||
TokenLexerCache[NumCachedTokenLexers++] = CurTokenLexer.take();
|
||||
|
||||
// Handle this like a #include file being popped off the stack.
|
||||
CurTokenLexer = 0;
|
||||
return HandleEndOfFile(Result, true);
|
||||
}
|
||||
|
||||
|
@ -245,11 +243,11 @@ void Preprocessor::RemoveTopOfLexerStack() {
|
|||
if (CurTokenLexer) {
|
||||
// Delete or cache the now-dead macro expander.
|
||||
if (NumCachedTokenLexers == TokenLexerCacheSize)
|
||||
delete CurTokenLexer;
|
||||
CurTokenLexer.reset();
|
||||
else
|
||||
TokenLexerCache[NumCachedTokenLexers++] = CurTokenLexer;
|
||||
TokenLexerCache[NumCachedTokenLexers++] = CurTokenLexer.take();
|
||||
} else {
|
||||
delete CurLexer;
|
||||
CurLexer.reset();
|
||||
}
|
||||
|
||||
PopIncludeMacroStack();
|
||||
|
|
|
@ -87,9 +87,6 @@ Preprocessor::Preprocessor(Diagnostic &diags, const LangOptions &opts,
|
|||
Preprocessor::~Preprocessor() {
|
||||
assert(BacktrackPositions.empty() && "EnableBacktrack/Backtrack imbalance!");
|
||||
|
||||
// Free any active lexers.
|
||||
delete CurLexer;
|
||||
|
||||
while (!IncludeMacroStack.empty()) {
|
||||
delete IncludeMacroStack.back().TheLexer;
|
||||
delete IncludeMacroStack.back().TheTokenLexer;
|
||||
|
|
Загрузка…
Ссылка в новой задаче