130fdc8d8SChris Lattner //===-- SBSourceManager.cpp -------------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
330fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
430fdc8d8SChris Lattner //
530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
630fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
730fdc8d8SChris Lattner //
830fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
930fdc8d8SChris Lattner 
10*93a64300SDaniel Malea #include "lldb/lldb-python.h"
11*93a64300SDaniel Malea 
12e37d605eSJim Ingham #include "lldb/API/SBDebugger.h"
134c5de699SEli Friedman #include "lldb/API/SBSourceManager.h"
14e37d605eSJim Ingham #include "lldb/API/SBTarget.h"
15f6eaba85SJohnny Chen #include "lldb/API/SBStream.h"
1630fdc8d8SChris Lattner 
1730fdc8d8SChris Lattner #include "lldb/API/SBFileSpec.h"
18e37d605eSJim Ingham #include "lldb/Core/Debugger.h"
1930fdc8d8SChris Lattner #include "lldb/Core/Stream.h"
2030fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
2130fdc8d8SChris Lattner #include "lldb/Core/SourceManager.h"
2230fdc8d8SChris Lattner 
23e37d605eSJim Ingham #include "lldb/Target/Target.h"
2430fdc8d8SChris Lattner 
259a37766eSGreg Clayton namespace lldb_private
269a37766eSGreg Clayton {
279a37766eSGreg Clayton     class SourceManagerImpl
2830fdc8d8SChris Lattner     {
29e37d605eSJim Ingham     public:
309a37766eSGreg Clayton         SourceManagerImpl (const lldb::DebuggerSP &debugger_sp)
31e37d605eSJim Ingham         {
329a37766eSGreg Clayton             m_debugger_sp = debugger_sp;
33e37d605eSJim Ingham         }
34e37d605eSJim Ingham 
359a37766eSGreg Clayton         SourceManagerImpl (const lldb::TargetSP &target_sp)
36e37d605eSJim Ingham         {
379a37766eSGreg Clayton             m_target_sp = target_sp;
38e37d605eSJim Ingham         }
39e37d605eSJim Ingham 
409a37766eSGreg Clayton         SourceManagerImpl (const SourceManagerImpl &rhs)
41e37d605eSJim Ingham         {
42e37d605eSJim Ingham             if (&rhs == this)
43e37d605eSJim Ingham                 return;
44e37d605eSJim Ingham             m_debugger_sp = rhs.m_debugger_sp;
45e37d605eSJim Ingham             m_target_sp   = rhs.m_target_sp;
46e37d605eSJim Ingham         }
47e37d605eSJim Ingham 
48e37d605eSJim Ingham         size_t
499a37766eSGreg Clayton         DisplaySourceLinesWithLineNumbers (const lldb_private::FileSpec &file,
50e37d605eSJim Ingham                                            uint32_t line,
51e37d605eSJim Ingham                                            uint32_t context_before,
52e37d605eSJim Ingham                                            uint32_t context_after,
53e37d605eSJim Ingham                                            const char *current_line_cstr,
549a37766eSGreg Clayton                                            lldb_private::Stream *s)
55e37d605eSJim Ingham         {
5644d6d2c5SJohnny Chen             if (!file)
57e37d605eSJim Ingham                 return 0;
58e37d605eSJim Ingham 
59e37d605eSJim Ingham             if (m_debugger_sp)
609a37766eSGreg Clayton                 return m_debugger_sp->GetSourceManager().DisplaySourceLinesWithLineNumbers (file,
61e37d605eSJim Ingham                                                                                             line,
62e37d605eSJim Ingham                                                                                             context_before,
63e37d605eSJim Ingham                                                                                             context_after,
64e37d605eSJim Ingham                                                                                             current_line_cstr,
659a37766eSGreg Clayton                                                                                             s);
66e37d605eSJim Ingham             else if (m_target_sp)
679a37766eSGreg Clayton                 return m_target_sp->GetSourceManager().DisplaySourceLinesWithLineNumbers (file,
68e37d605eSJim Ingham                                                                                           line,
69e37d605eSJim Ingham                                                                                           context_before,
70e37d605eSJim Ingham                                                                                           context_after,
71e37d605eSJim Ingham                                                                                           current_line_cstr,
729a37766eSGreg Clayton                                                                                           s);
73e37d605eSJim Ingham             else
74e37d605eSJim Ingham                 return 0;
75e37d605eSJim Ingham         }
76e37d605eSJim Ingham 
77e37d605eSJim Ingham     private:
78e37d605eSJim Ingham         lldb::DebuggerSP m_debugger_sp;
79e37d605eSJim Ingham         lldb::TargetSP   m_target_sp;
80e37d605eSJim Ingham 
81e37d605eSJim Ingham     };
829a37766eSGreg Clayton }
839a37766eSGreg Clayton 
849a37766eSGreg Clayton using namespace lldb;
859a37766eSGreg Clayton using namespace lldb_private;
86e37d605eSJim Ingham 
87e37d605eSJim Ingham SBSourceManager::SBSourceManager (const SBDebugger &debugger)
88e37d605eSJim Ingham {
899a37766eSGreg Clayton     m_opaque_ap.reset(new SourceManagerImpl (debugger.get_sp()));
90e37d605eSJim Ingham }
91e37d605eSJim Ingham 
92e37d605eSJim Ingham SBSourceManager::SBSourceManager (const SBTarget &target)
93e37d605eSJim Ingham {
94b9556accSGreg Clayton     m_opaque_ap.reset(new SourceManagerImpl (target.GetSP()));
95e37d605eSJim Ingham }
96e37d605eSJim Ingham 
97e37d605eSJim Ingham SBSourceManager::SBSourceManager (const SBSourceManager &rhs)
98e37d605eSJim Ingham {
99e37d605eSJim Ingham     if (&rhs == this)
100e37d605eSJim Ingham         return;
101e37d605eSJim Ingham 
1029a37766eSGreg Clayton     m_opaque_ap.reset(new SourceManagerImpl (*(rhs.m_opaque_ap.get())));
103e37d605eSJim Ingham }
104e37d605eSJim Ingham 
105e37d605eSJim Ingham const lldb::SBSourceManager &
106e37d605eSJim Ingham SBSourceManager::operator = (const lldb::SBSourceManager &rhs)
107e37d605eSJim Ingham {
1089a37766eSGreg Clayton     m_opaque_ap.reset (new SourceManagerImpl (*(rhs.m_opaque_ap.get())));
109e37d605eSJim Ingham     return *this;
11030fdc8d8SChris Lattner }
11130fdc8d8SChris Lattner 
11230fdc8d8SChris Lattner SBSourceManager::~SBSourceManager()
11330fdc8d8SChris Lattner {
11430fdc8d8SChris Lattner }
11530fdc8d8SChris Lattner 
11630fdc8d8SChris Lattner size_t
11730fdc8d8SChris Lattner SBSourceManager::DisplaySourceLinesWithLineNumbers
11830fdc8d8SChris Lattner (
11930fdc8d8SChris Lattner     const SBFileSpec &file,
12030fdc8d8SChris Lattner     uint32_t line,
12130fdc8d8SChris Lattner     uint32_t context_before,
12230fdc8d8SChris Lattner     uint32_t context_after,
12330fdc8d8SChris Lattner     const char *current_line_cstr,
124f6eaba85SJohnny Chen     SBStream &s
12530fdc8d8SChris Lattner )
12630fdc8d8SChris Lattner {
127e37d605eSJim Ingham     if (m_opaque_ap.get() == NULL)
128efabb123SGreg Clayton         return 0;
129efabb123SGreg Clayton 
1309a37766eSGreg Clayton     return m_opaque_ap->DisplaySourceLinesWithLineNumbers (file.ref(),
13130fdc8d8SChris Lattner                                                            line,
13230fdc8d8SChris Lattner                                                            context_before,
13330fdc8d8SChris Lattner                                                            context_after,
13430fdc8d8SChris Lattner                                                            current_line_cstr,
1359a37766eSGreg Clayton                                                            s.get());
13630fdc8d8SChris Lattner }
137