#include "clang/Basic/IdentifierTable.h"
#include "clang/Basic/SourceLocation.h"
#include "llvm/ADT/DenseMap.h"
+#include "llvm/ADT/OwningPtr.h"
namespace clang {
/// 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
/// 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
/// 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
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();
}
/// 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) {
if (CurLexer || CurTokenLexer)
PushIncludeMacroStack();
- CurLexer = TheLexer;
+ CurLexer.reset(TheLexer);
CurDirLookup = CurDir;
// Notify the client, if desired, that we are in a new source file.
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);
}
}
// 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);
}
}
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.
// 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);
}
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();