]> granicus.if.org Git - clang/commitdiff
Change PTHLexer::getSourceLocation() to not call GetToken() and instead just read...
authorTed Kremenek <kremenek@apple.com>
Wed, 17 Dec 2008 23:36:32 +0000 (23:36 +0000)
committerTed Kremenek <kremenek@apple.com>
Wed, 17 Dec 2008 23:36:32 +0000 (23:36 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@61170 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Lex/PTHLexer.h
lib/Lex/PTHLexer.cpp

index 34e0b8a9fbdc0f022fb6a43a17eda5634aaac7d5..b5655ffb8111d3c651ef4dfa58fc52c5fadce081 100644 (file)
@@ -90,8 +90,8 @@ public:
   
   /// getSourceLocation - Return a source location for the token in
   /// the current file.
-  SourceLocation getSourceLocation() { return GetToken().getLocation(); }
-  
+  SourceLocation getSourceLocation();
+
   /// SkipBlock - Used by Preprocessor to skip the current conditional block.
   bool SkipBlock();
 
index a107a3811905ad57bcb064d7a4d5cbb90c124025..9a883b01722a09ee56caad2555acff4ce4cabc80 100644 (file)
@@ -262,6 +262,21 @@ bool PTHLexer::SkipBlock() {
   return isEndif;
 }
 
+SourceLocation PTHLexer::getSourceLocation() {
+  // getLocation is not on the hot path.  It is used to get the location of
+  // the next token when transitioning back to this lexer when done
+  // handling a #included file.  Just read the necessary data from the token
+  // data buffer to construct the SourceLocation object.
+  // NOTE: This is a virtual function; hence it is defined out-of-line.
+  const char* p = CurPtr + (1 + 1 + 4);
+  uint32_t offset = 
+       ((uint32_t) ((uint8_t) p[0]))
+    | (((uint32_t) ((uint8_t) p[1])) << 8)
+    | (((uint32_t) ((uint8_t) p[2])) << 16)
+    | (((uint32_t) ((uint8_t) p[3])) << 24);
+  return SourceLocation::getFileLoc(FileID, offset);
+}
+
 //===----------------------------------------------------------------------===//
 // Token reconstruction from the PTH file.
 //===----------------------------------------------------------------------===//