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 
1093a64300SDaniel Malea #include "lldb/lldb-python.h"
1193a64300SDaniel 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:
30*9585fbfcSGreg Clayton         SourceManagerImpl (const lldb::DebuggerSP &debugger_sp) :
31*9585fbfcSGreg Clayton             m_debugger_wp (debugger_sp),
32*9585fbfcSGreg Clayton             m_target_wp ()
33e37d605eSJim Ingham         {
34e37d605eSJim Ingham         }
35e37d605eSJim Ingham 
36*9585fbfcSGreg Clayton         SourceManagerImpl (const lldb::TargetSP &target_sp) :
37*9585fbfcSGreg Clayton             m_debugger_wp (),
38*9585fbfcSGreg Clayton             m_target_wp (target_sp)
39e37d605eSJim Ingham         {
40e37d605eSJim Ingham         }
41e37d605eSJim Ingham 
429a37766eSGreg Clayton         SourceManagerImpl (const SourceManagerImpl &rhs)
43e37d605eSJim Ingham         {
44e37d605eSJim Ingham             if (&rhs == this)
45e37d605eSJim Ingham                 return;
46*9585fbfcSGreg Clayton             m_debugger_wp = rhs.m_debugger_wp;
47*9585fbfcSGreg Clayton             m_target_wp   = rhs.m_target_wp;
48e37d605eSJim Ingham         }
49e37d605eSJim Ingham 
50e37d605eSJim Ingham         size_t
519a37766eSGreg Clayton         DisplaySourceLinesWithLineNumbers (const lldb_private::FileSpec &file,
52e37d605eSJim Ingham                                            uint32_t line,
53e37d605eSJim Ingham                                            uint32_t context_before,
54e37d605eSJim Ingham                                            uint32_t context_after,
55e37d605eSJim Ingham                                            const char *current_line_cstr,
569a37766eSGreg Clayton                                            lldb_private::Stream *s)
57e37d605eSJim Ingham         {
5844d6d2c5SJohnny Chen             if (!file)
59e37d605eSJim Ingham                 return 0;
60e37d605eSJim Ingham 
61*9585fbfcSGreg Clayton             lldb::TargetSP target_sp (m_target_wp.lock());
62*9585fbfcSGreg Clayton             if (target_sp)
63*9585fbfcSGreg Clayton             {
64*9585fbfcSGreg Clayton                 return target_sp->GetSourceManager().DisplaySourceLinesWithLineNumbers (file,
65e37d605eSJim Ingham                                                                                         line,
66e37d605eSJim Ingham                                                                                         context_before,
67e37d605eSJim Ingham                                                                                         context_after,
68e37d605eSJim Ingham                                                                                         current_line_cstr,
699a37766eSGreg Clayton                                                                                         s);
70*9585fbfcSGreg Clayton             }
71e37d605eSJim Ingham             else
72*9585fbfcSGreg Clayton             {
73*9585fbfcSGreg Clayton                 lldb::DebuggerSP debugger_sp (m_debugger_wp.lock());
74*9585fbfcSGreg Clayton                 if (debugger_sp)
75*9585fbfcSGreg Clayton                 {
76*9585fbfcSGreg Clayton                     return debugger_sp->GetSourceManager().DisplaySourceLinesWithLineNumbers (file,
77*9585fbfcSGreg Clayton                                                                                               line,
78*9585fbfcSGreg Clayton                                                                                               context_before,
79*9585fbfcSGreg Clayton                                                                                               context_after,
80*9585fbfcSGreg Clayton                                                                                               current_line_cstr,
81*9585fbfcSGreg Clayton                                                                                               s);
82*9585fbfcSGreg Clayton                 }
83*9585fbfcSGreg Clayton             }
84e37d605eSJim Ingham             return 0;
85e37d605eSJim Ingham         }
86e37d605eSJim Ingham 
87e37d605eSJim Ingham     private:
88*9585fbfcSGreg Clayton         lldb::DebuggerWP m_debugger_wp;
89*9585fbfcSGreg Clayton         lldb::TargetWP   m_target_wp;
90e37d605eSJim Ingham 
91e37d605eSJim Ingham     };
929a37766eSGreg Clayton }
939a37766eSGreg Clayton 
949a37766eSGreg Clayton using namespace lldb;
959a37766eSGreg Clayton using namespace lldb_private;
96e37d605eSJim Ingham 
97e37d605eSJim Ingham SBSourceManager::SBSourceManager (const SBDebugger &debugger)
98e37d605eSJim Ingham {
999a37766eSGreg Clayton     m_opaque_ap.reset(new SourceManagerImpl (debugger.get_sp()));
100e37d605eSJim Ingham }
101e37d605eSJim Ingham 
102e37d605eSJim Ingham SBSourceManager::SBSourceManager (const SBTarget &target)
103e37d605eSJim Ingham {
104b9556accSGreg Clayton     m_opaque_ap.reset(new SourceManagerImpl (target.GetSP()));
105e37d605eSJim Ingham }
106e37d605eSJim Ingham 
107e37d605eSJim Ingham SBSourceManager::SBSourceManager (const SBSourceManager &rhs)
108e37d605eSJim Ingham {
109e37d605eSJim Ingham     if (&rhs == this)
110e37d605eSJim Ingham         return;
111e37d605eSJim Ingham 
1129a37766eSGreg Clayton     m_opaque_ap.reset(new SourceManagerImpl (*(rhs.m_opaque_ap.get())));
113e37d605eSJim Ingham }
114e37d605eSJim Ingham 
115e37d605eSJim Ingham const lldb::SBSourceManager &
116e37d605eSJim Ingham SBSourceManager::operator = (const lldb::SBSourceManager &rhs)
117e37d605eSJim Ingham {
1189a37766eSGreg Clayton     m_opaque_ap.reset (new SourceManagerImpl (*(rhs.m_opaque_ap.get())));
119e37d605eSJim Ingham     return *this;
12030fdc8d8SChris Lattner }
12130fdc8d8SChris Lattner 
12230fdc8d8SChris Lattner SBSourceManager::~SBSourceManager()
12330fdc8d8SChris Lattner {
12430fdc8d8SChris Lattner }
12530fdc8d8SChris Lattner 
12630fdc8d8SChris Lattner size_t
12730fdc8d8SChris Lattner SBSourceManager::DisplaySourceLinesWithLineNumbers
12830fdc8d8SChris Lattner (
12930fdc8d8SChris Lattner     const SBFileSpec &file,
13030fdc8d8SChris Lattner     uint32_t line,
13130fdc8d8SChris Lattner     uint32_t context_before,
13230fdc8d8SChris Lattner     uint32_t context_after,
13330fdc8d8SChris Lattner     const char *current_line_cstr,
134f6eaba85SJohnny Chen     SBStream &s
13530fdc8d8SChris Lattner )
13630fdc8d8SChris Lattner {
137e37d605eSJim Ingham     if (m_opaque_ap.get() == NULL)
138efabb123SGreg Clayton         return 0;
139efabb123SGreg Clayton 
1409a37766eSGreg Clayton     return m_opaque_ap->DisplaySourceLinesWithLineNumbers (file.ref(),
14130fdc8d8SChris Lattner                                                            line,
14230fdc8d8SChris Lattner                                                            context_before,
14330fdc8d8SChris Lattner                                                            context_after,
14430fdc8d8SChris Lattner                                                            current_line_cstr,
1459a37766eSGreg Clayton                                                            s.get());
14630fdc8d8SChris Lattner }
147