1 //===-- SBSourceManager.cpp -------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "lldb/API/SBSourceManager.h" 11 #include "lldb/API/SBDebugger.h" 12 #include "lldb/API/SBStream.h" 13 #include "lldb/API/SBTarget.h" 14 15 #include "lldb/API/SBFileSpec.h" 16 #include "lldb/Core/Debugger.h" 17 #include "lldb/Core/SourceManager.h" 18 #include "lldb/Core/StreamFile.h" 19 #include "lldb/Utility/Stream.h" 20 21 #include "lldb/Target/Target.h" 22 23 namespace lldb_private { 24 class SourceManagerImpl { 25 public: 26 SourceManagerImpl(const lldb::DebuggerSP &debugger_sp) 27 : m_debugger_wp(debugger_sp), m_target_wp() {} 28 29 SourceManagerImpl(const lldb::TargetSP &target_sp) 30 : m_debugger_wp(), m_target_wp(target_sp) {} 31 32 SourceManagerImpl(const SourceManagerImpl &rhs) { 33 if (&rhs == this) 34 return; 35 m_debugger_wp = rhs.m_debugger_wp; 36 m_target_wp = rhs.m_target_wp; 37 } 38 39 size_t DisplaySourceLinesWithLineNumbers(const lldb_private::FileSpec &file, 40 uint32_t line, uint32_t column, 41 uint32_t context_before, 42 uint32_t context_after, 43 const char *current_line_cstr, 44 lldb_private::Stream *s) { 45 if (!file) 46 return 0; 47 48 lldb::TargetSP target_sp(m_target_wp.lock()); 49 if (target_sp) { 50 return target_sp->GetSourceManager().DisplaySourceLinesWithLineNumbers( 51 file, line, column, context_before, context_after, current_line_cstr, 52 s); 53 } else { 54 lldb::DebuggerSP debugger_sp(m_debugger_wp.lock()); 55 if (debugger_sp) { 56 return debugger_sp->GetSourceManager() 57 .DisplaySourceLinesWithLineNumbers(file, line, column, 58 context_before, context_after, 59 current_line_cstr, s); 60 } 61 } 62 return 0; 63 } 64 65 private: 66 lldb::DebuggerWP m_debugger_wp; 67 lldb::TargetWP m_target_wp; 68 }; 69 } 70 71 using namespace lldb; 72 using namespace lldb_private; 73 74 SBSourceManager::SBSourceManager(const SBDebugger &debugger) { 75 m_opaque_ap.reset(new SourceManagerImpl(debugger.get_sp())); 76 } 77 78 SBSourceManager::SBSourceManager(const SBTarget &target) { 79 m_opaque_ap.reset(new SourceManagerImpl(target.GetSP())); 80 } 81 82 SBSourceManager::SBSourceManager(const SBSourceManager &rhs) { 83 if (&rhs == this) 84 return; 85 86 m_opaque_ap.reset(new SourceManagerImpl(*(rhs.m_opaque_ap.get()))); 87 } 88 89 const lldb::SBSourceManager &SBSourceManager:: 90 operator=(const lldb::SBSourceManager &rhs) { 91 m_opaque_ap.reset(new SourceManagerImpl(*(rhs.m_opaque_ap.get()))); 92 return *this; 93 } 94 95 SBSourceManager::~SBSourceManager() {} 96 97 size_t SBSourceManager::DisplaySourceLinesWithLineNumbers( 98 const SBFileSpec &file, uint32_t line, uint32_t context_before, 99 uint32_t context_after, const char *current_line_cstr, SBStream &s) { 100 const uint32_t column = 0; 101 return DisplaySourceLinesWithLineNumbersAndColumn( 102 file.ref(), line, column, context_before, context_after, 103 current_line_cstr, s); 104 } 105 106 size_t SBSourceManager::DisplaySourceLinesWithLineNumbersAndColumn( 107 const SBFileSpec &file, uint32_t line, uint32_t column, 108 uint32_t context_before, uint32_t context_after, 109 const char *current_line_cstr, SBStream &s) { 110 if (m_opaque_ap.get() == NULL) 111 return 0; 112 113 return m_opaque_ap->DisplaySourceLinesWithLineNumbers( 114 file.ref(), line, column, context_before, context_after, 115 current_line_cstr, s.get()); 116 } 117