PTHLexer: Keep track of the location of the last '#' token and provide the means to jump ahead in the token stream.

llvm-svn: 60905
This commit is contained in:
Ted Kremenek 2008-12-11 22:41:47 +00:00
parent 90893187c4
commit ca153f7349
2 changed files with 25 additions and 6 deletions

View File

@ -24,6 +24,14 @@ class PTHManager;
class PTHLexer : public PreprocessorLexer {
/// TokBuf - Buffer from PTH file containing raw token data.
const char* TokBuf;
/// CurPtr - Pointer into current offset of the token buffer where
/// the next token will be read.
const char* CurPtr;
/// LastHashTokPtr - Pointer into TokBuf of the last processed '#'
/// token that appears at the start of a line.
const char* LastHashTokPtr;
PTHLexer(const PTHLexer&); // DO NOT IMPLEMENT
void operator=(const PTHLexer&); // DO NOT IMPLEMENT
@ -72,6 +80,14 @@ public:
private:
/// SkipToToken - Skip to the token at the specified offset in TokBuf.
void SkipToToken(unsigned offset) {
const char* NewPtr = TokBuf + offset;
assert(NewPtr > CurPtr && "SkipToToken should not go backwards!");
NeedsFetching = true;
CurPtr = NewPtr;
}
/// AtLastToken - Returns true if the PTHLexer is at the last token.
bool AtLastToken() {
Token T = GetToken();

View File

@ -28,7 +28,8 @@ using namespace clang;
PTHLexer::PTHLexer(Preprocessor& pp, SourceLocation fileloc, const char* D,
PTHManager& PM)
: PreprocessorLexer(&pp, fileloc), TokBuf(D), PTHMgr(PM),
: PreprocessorLexer(&pp, fileloc), TokBuf(D), CurPtr(D), LastHashTokPtr(0),
PTHMgr(PM),
NeedsFetching(true) {
// Make sure the EofToken is completely clean.
EofToken.startToken();
@ -82,6 +83,8 @@ LexNextToken:
if (Tok.is(tok::hash)) {
if (Tok.isAtStartOfLine() && !LexingRawMode) {
LastHashTokPtr = CurPtr;
PP->HandleDirective(Tok);
if (PP->isCurrentLexer(this))
@ -163,20 +166,20 @@ void PTHLexer::ReadToken(Token& T) {
T.startToken();
// Read the type of the token.
T.setKind((tok::TokenKind) Read8(TokBuf));
T.setKind((tok::TokenKind) Read8(CurPtr));
// Set flags. This is gross, since we are really setting multiple flags.
T.setFlag((Token::TokenFlags) Read8(TokBuf));
T.setFlag((Token::TokenFlags) Read8(CurPtr));
// Set the IdentifierInfo* (if any).
T.setIdentifierInfo(PTHMgr.ReadIdentifierInfo(TokBuf));
T.setIdentifierInfo(PTHMgr.ReadIdentifierInfo(CurPtr));
// Set the SourceLocation. Since all tokens are constructed using a
// raw lexer, they will all be offseted from the same FileID.
T.setLocation(SourceLocation::getFileLoc(FileID, Read32(TokBuf)));
T.setLocation(SourceLocation::getFileLoc(FileID, Read32(CurPtr)));
// Finally, read and set the length of the token.
T.setLength(Read32(TokBuf));
T.setLength(Read32(CurPtr));
}
//===----------------------------------------------------------------------===//