diff --git a/clang/include/clang/Lex/PTHLexer.h b/clang/include/clang/Lex/PTHLexer.h index 0ae4ac772fba..ab49e646eef5 100644 --- a/clang/include/clang/Lex/PTHLexer.h +++ b/clang/include/clang/Lex/PTHLexer.h @@ -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(); diff --git a/clang/lib/Lex/PTHLexer.cpp b/clang/lib/Lex/PTHLexer.cpp index ebbc96801f6e..3afbb5b71763 100644 --- a/clang/lib/Lex/PTHLexer.cpp +++ b/clang/lib/Lex/PTHLexer.cpp @@ -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)); } //===----------------------------------------------------------------------===//