Centralize where we update the source file contents in SourceManager::GetFile() in...
authorGreg Clayton <gclayton@apple.com>
Wed, 29 Jul 2015 18:37:25 +0000 (18:37 +0000)
committerGreg Clayton <gclayton@apple.com>
Wed, 29 Jul 2015 18:37:25 +0000 (18:37 +0000)
The following functions were the only functions that updates the source file:

SourceManager::File::DisplaySourceLines()
SourceManager::File::FindLinesMatchingRegex()

But there we API calls that were using the SourceManager::File and asking it questions, like "is line 12 valid" and that might respond incorrectly if the source file had been updated.

<rdar://problem/21269402>

llvm-svn: 243551

lldb/include/lldb/Core/SourceManager.h
lldb/source/Core/SourceManager.cpp

index 0f65be1..5f58b5a 100644 (file)
@@ -35,6 +35,9 @@ public:
         File (const FileSpec &file_spec, Target *target);
         ~File();
 
+        void
+        UpdateIfNeeded ();
+
         size_t
         DisplaySourceLines (uint32_t line,
                             uint32_t context_before,
index 324ed34..b93c9d8 100644 (file)
@@ -83,6 +83,10 @@ SourceManager::GetFile (const FileSpec &file_spec)
     if (target_sp && file_sp && file_sp->GetSourceMapModificationID() != target_sp->GetSourcePathMap().GetModificationID())
         file_sp.reset();
 
+    // Update the file contents if needed if we found a file
+    if (file_sp)
+        file_sp->UpdateIfNeeded();
+
     // If file_sp is no good or it points to a non-existent file, reset it.
     if (!file_sp || !file_sp->GetFileSpec().Exists())
     {
@@ -492,8 +496,8 @@ SourceManager::File::LineIsValid (uint32_t line)
     return false;
 }
 
-size_t
-SourceManager::File::DisplaySourceLines (uint32_t line, uint32_t context_before, uint32_t context_after, Stream *s)
+void
+SourceManager::File::UpdateIfNeeded ()
 {
     // TODO: use host API to sign up for file modifications to anything in our
     // source cache and only update when we determine a file has been updated.
@@ -506,7 +510,11 @@ SourceManager::File::DisplaySourceLines (uint32_t line, uint32_t context_before,
         m_data_sp = m_file_spec.ReadFileContents ();
         m_offsets.clear();
     }
+}
 
+size_t
+SourceManager::File::DisplaySourceLines (uint32_t line, uint32_t context_before, uint32_t context_after, Stream *s)
+{
     // Sanity check m_data_sp before proceeding.
     if (!m_data_sp)
         return 0;
@@ -538,14 +546,6 @@ SourceManager::File::DisplaySourceLines (uint32_t line, uint32_t context_before,
 void
 SourceManager::File::FindLinesMatchingRegex (RegularExpression& regex, uint32_t start_line, uint32_t end_line, std::vector<uint32_t> &match_lines)
 {
-    TimeValue curr_mod_time (m_file_spec.GetModificationTime());
-    if (m_mod_time != curr_mod_time)
-    {
-        m_mod_time = curr_mod_time;
-        m_data_sp = m_file_spec.ReadFileContents ();
-        m_offsets.clear();
-    }
-    
     match_lines.clear();
     
     if (!LineIsValid(start_line) || (end_line != UINT32_MAX && !LineIsValid(end_line)))