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