From 5965a28a4b7a5ba204c045297097da1f925eb285 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sat, 17 Jan 2009 07:56:59 +0000 Subject: More simplifications to the lexer ctors. llvm-svn: 62419 --- clang/lib/Lex/Lexer.cpp | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) (limited to 'clang/lib/Lex/Lexer.cpp') diff --git a/clang/lib/Lex/Lexer.cpp b/clang/lib/Lex/Lexer.cpp index c5b36fce613..c379f58b0c6 100644 --- a/clang/lib/Lex/Lexer.cpp +++ b/clang/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()); -- cgit v1.2.3