1 //===-- SBSymbolContext.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/SBSymbolContext.h"
11 #include "lldb/API/SBStream.h"
12 #include "lldb/Core/Log.h"
13 #include "lldb/Symbol/Function.h"
14 #include "lldb/Symbol/Symbol.h"
15 #include "lldb/Symbol/SymbolContext.h"
16 
17 using namespace lldb;
18 using namespace lldb_private;
19 
20 
21 
22 SBSymbolContext::SBSymbolContext () :
23     m_opaque_ap ()
24 {
25 }
26 
27 SBSymbolContext::SBSymbolContext (const SymbolContext *sc_ptr) :
28     m_opaque_ap ()
29 {
30     if (sc_ptr)
31         m_opaque_ap.reset (new SymbolContext (*sc_ptr));
32 }
33 
34 SBSymbolContext::SBSymbolContext (const SBSymbolContext& rhs) :
35     m_opaque_ap ()
36 {
37     if (rhs.IsValid())
38     {
39         if (m_opaque_ap.get())
40             *m_opaque_ap = *rhs.m_opaque_ap;
41         else
42             ref() = *rhs.m_opaque_ap;
43     }
44 }
45 
46 SBSymbolContext::~SBSymbolContext ()
47 {
48 }
49 
50 const SBSymbolContext &
51 SBSymbolContext::operator = (const SBSymbolContext &rhs)
52 {
53     if (this != &rhs)
54     {
55         if (rhs.IsValid())
56             m_opaque_ap.reset (new lldb_private::SymbolContext(*rhs.m_opaque_ap.get()));
57     }
58     return *this;
59 }
60 
61 void
62 SBSymbolContext::SetSymbolContext (const SymbolContext *sc_ptr)
63 {
64     if (sc_ptr)
65     {
66         if (m_opaque_ap.get())
67             *m_opaque_ap = *sc_ptr;
68         else
69             m_opaque_ap.reset (new SymbolContext (*sc_ptr));
70     }
71     else
72     {
73         if (m_opaque_ap.get())
74             m_opaque_ap->Clear();
75     }
76 }
77 
78 bool
79 SBSymbolContext::IsValid () const
80 {
81     return m_opaque_ap.get() != NULL;
82 }
83 
84 
85 
86 SBModule
87 SBSymbolContext::GetModule ()
88 {
89     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
90 
91     SBModule sb_module;
92     if (m_opaque_ap.get())
93         sb_module.SetModule(m_opaque_ap->module_sp);
94 
95     if (log)
96     {
97         SBStream sstr;
98         sb_module.GetDescription (sstr);
99         log->Printf ("SBSymbolContext(%p)::GetModule () => SBModule(%p): %s",
100                      m_opaque_ap.get(), sb_module.get(), sstr.GetData());
101     }
102 
103     return sb_module;
104 }
105 
106 SBCompileUnit
107 SBSymbolContext::GetCompileUnit ()
108 {
109     return SBCompileUnit (m_opaque_ap.get() ? m_opaque_ap->comp_unit : NULL);
110 }
111 
112 SBFunction
113 SBSymbolContext::GetFunction ()
114 {
115     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
116 
117     Function *function = NULL;
118 
119     if (m_opaque_ap.get())
120         function = m_opaque_ap->function;
121 
122     SBFunction sb_function (function);
123 
124     if (log)
125         log->Printf ("SBSymbolContext(%p)::GetFunction () => SBFunction(%p)",
126                      m_opaque_ap.get(), function);
127 
128     return sb_function;
129 }
130 
131 SBBlock
132 SBSymbolContext::GetBlock ()
133 {
134     return SBBlock (m_opaque_ap.get() ? m_opaque_ap->block : NULL);
135 }
136 
137 SBLineEntry
138 SBSymbolContext::GetLineEntry ()
139 {
140     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
141 
142     SBLineEntry sb_line_entry;
143     if (m_opaque_ap.get())
144         sb_line_entry.SetLineEntry (m_opaque_ap->line_entry);
145 
146     if (log)
147     {
148         log->Printf ("SBSymbolContext(%p)::GetLineEntry () => SBLineEntry(%p)",
149                      m_opaque_ap.get(), sb_line_entry.get());
150     }
151 
152     return sb_line_entry;
153 }
154 
155 SBSymbol
156 SBSymbolContext::GetSymbol ()
157 {
158     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
159 
160     Symbol *symbol = NULL;
161 
162     if (m_opaque_ap.get())
163         symbol = m_opaque_ap->symbol;
164 
165     SBSymbol sb_symbol (symbol);
166 
167     if (log)
168     {
169         log->Printf ("SBSymbolContext(%p)::GetSymbol () => SBSymbol(%p)",
170                      m_opaque_ap.get(), symbol);
171     }
172 
173     return sb_symbol;
174 }
175 
176 lldb_private::SymbolContext*
177 SBSymbolContext::operator->() const
178 {
179     return m_opaque_ap.get();
180 }
181 
182 
183 const lldb_private::SymbolContext&
184 SBSymbolContext::operator*() const
185 {
186     assert (m_opaque_ap.get());
187     return *m_opaque_ap.get();
188 }
189 
190 
191 lldb_private::SymbolContext&
192 SBSymbolContext::operator*()
193 {
194     if (m_opaque_ap.get() == NULL)
195         m_opaque_ap.reset (new SymbolContext);
196     return *m_opaque_ap.get();
197 }
198 
199 lldb_private::SymbolContext&
200 SBSymbolContext::ref()
201 {
202     if (m_opaque_ap.get() == NULL)
203         m_opaque_ap.reset (new SymbolContext);
204     return *m_opaque_ap.get();
205 }
206 
207 lldb_private::SymbolContext *
208 SBSymbolContext::get() const
209 {
210     return m_opaque_ap.get();
211 }
212 
213 bool
214 SBSymbolContext::GetDescription (SBStream &description)
215 {
216     if (m_opaque_ap.get())
217     {
218         description.ref();
219         m_opaque_ap->GetDescription (description.get(), lldb::eDescriptionLevelFull, NULL);
220     }
221     else
222         description.Printf ("No value");
223 
224     return true;
225 }
226