From 0770dabb1ae81a2a9c2e7199262067103062a0b3 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sat, 17 Jan 2009 07:56:59 +0000 Subject: [PATCH] More simplifications to the lexer ctors. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@62419 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Lex/Lexer.h | 5 ++++- lib/Lex/Lexer.cpp | 34 ++++++++++++++++++++++++---------- 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/include/clang/Lex/Lexer.h b/include/clang/Lex/Lexer.h index bed77b667d..ff89e8197d 100644 --- a/include/clang/Lex/Lexer.h +++ b/include/clang/Lex/Lexer.h @@ -77,8 +77,9 @@ public: /// with the specified preprocessor managing the lexing process. This lexer /// assumes that the associated file buffer and Preprocessor objects will /// outlive it, so it doesn't take ownership of either of them. + Lexer(SourceLocation FileLoc, Preprocessor &PP); Lexer(SourceLocation FileLoc, Preprocessor &PP, - const char *BufStart = 0, const char *BufEnd = 0); + const char *BufStart, const char *BufEnd); /// Lexer constructor - Create a new raw lexer object. This object is only /// suitable for calls to 'LexRawToken'. This lexer assumes that the text @@ -310,6 +311,7 @@ private: /// getCharAndSizeSlow - Handle the slow/uncommon case of the getCharAndSize /// method. char getCharAndSizeSlow(const char *Ptr, unsigned &Size, Token *Tok = 0); +public: /// getCharAndSizeNoWarn - Like the getCharAndSize method, but does not ever /// emit a warning. @@ -325,6 +327,7 @@ private: Size = 0; return getCharAndSizeSlowNoWarn(Ptr, Size, Features); } +private: /// getCharAndSizeSlowNoWarn - Same as getCharAndSizeSlow, but never emits a /// diagnostic. diff --git a/lib/Lex/Lexer.cpp b/lib/Lex/Lexer.cpp index c5b36fce61..c379f58b0c 100644 --- a/lib/Lex/Lexer.cpp +++ b/lib/Lex/Lexer.cpp @@ -90,6 +90,28 @@ void Lexer::InitLexer(const char *BufStart, const char *BufPtr, ExtendedTokenMode = 0; } +/// Lexer constructor - Create a new lexer object for the specified buffer +/// with the specified preprocessor managing the lexing process. This lexer +/// assumes that the associated file buffer and Preprocessor objects will +/// outlive it, so it doesn't take ownership of either of them. +Lexer::Lexer(SourceLocation fileloc, Preprocessor &PP) +// FIXME: This is really horrible and only needed for _Pragma lexers, split this +// out of the main lexer path! +: PreprocessorLexer(&PP, + PP.getSourceManager().getCanonicalFileID( + PP.getSourceManager().getSpellingLoc(fileloc))), + FileLoc(fileloc), + Features(PP.getLangOptions()) { + + SourceManager &SourceMgr = PP.getSourceManager(); + const llvm::MemoryBuffer *InputFile = SourceMgr.getBuffer(getFileID()); + + InitLexer(InputFile->getBufferStart(), InputFile->getBufferStart(), + InputFile->getBufferEnd()); + + // Default to keeping comments if the preprocessor wants them. + SetCommentRetentionState(PP.getCommentRetentionState()); +} /// Lexer constructor - Create a new lexer object for the specified buffer /// with the specified preprocessor managing the lexing process. This lexer @@ -105,16 +127,8 @@ Lexer::Lexer(SourceLocation fileloc, Preprocessor &PP, FileLoc(fileloc), Features(PP.getLangOptions()) { - SourceManager &SourceMgr = PP.getSourceManager(); - const llvm::MemoryBuffer *InputFile = SourceMgr.getBuffer(getFileID()); - - // BufferPtr and BufferEnd can start out somewhere inside the current buffer. - // If unspecified, they starts at the start/end of the buffer. - const char *BufStart = InputFile->getBufferStart(); - if (BufPtr == 0) BufPtr = BufStart; - if (BufEnd == 0) BufEnd = InputFile->getBufferEnd(); - - InitLexer(BufStart, BufPtr, BufEnd); + InitLexer(PP.getSourceManager().getBuffer(getFileID())->getBufferStart(), + BufPtr, BufEnd); // Default to keeping comments if the preprocessor wants them. SetCommentRetentionState(PP.getCommentRetentionState()); -- 2.40.0