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/Symbol/SymbolContext.h" 13 14 using namespace lldb; 15 using namespace lldb_private; 16 17 18 19 SBSymbolContext::SBSymbolContext () : 20 m_opaque_ap () 21 { 22 } 23 24 SBSymbolContext::SBSymbolContext (const SymbolContext *sc_ptr) : 25 m_opaque_ap () 26 { 27 if (sc_ptr) 28 m_opaque_ap.reset (new SymbolContext (*sc_ptr)); 29 } 30 31 SBSymbolContext::SBSymbolContext (const SBSymbolContext& rhs) : 32 m_opaque_ap () 33 { 34 if (rhs.IsValid()) 35 { 36 if (m_opaque_ap.get()) 37 *m_opaque_ap = *rhs.m_opaque_ap; 38 else 39 ref() = *rhs.m_opaque_ap; 40 } 41 } 42 43 SBSymbolContext::~SBSymbolContext () 44 { 45 } 46 47 const SBSymbolContext & 48 SBSymbolContext::operator = (const SBSymbolContext &rhs) 49 { 50 if (this != &rhs) 51 { 52 if (rhs.IsValid()) 53 m_opaque_ap.reset (new lldb_private::SymbolContext(*rhs.m_opaque_ap.get())); 54 } 55 return *this; 56 } 57 58 void 59 SBSymbolContext::SetSymbolContext (const SymbolContext *sc_ptr) 60 { 61 if (sc_ptr) 62 { 63 if (m_opaque_ap.get()) 64 *m_opaque_ap = *sc_ptr; 65 else 66 m_opaque_ap.reset (new SymbolContext (*sc_ptr)); 67 } 68 else 69 { 70 if (m_opaque_ap.get()) 71 m_opaque_ap->Clear(); 72 } 73 } 74 75 bool 76 SBSymbolContext::IsValid () const 77 { 78 return m_opaque_ap.get() != NULL; 79 } 80 81 82 83 SBModule 84 SBSymbolContext::GetModule () 85 { 86 SBModule sb_module; 87 if (m_opaque_ap.get()) 88 sb_module.SetModule(m_opaque_ap->module_sp); 89 return sb_module; 90 } 91 92 SBCompileUnit 93 SBSymbolContext::GetCompileUnit () 94 { 95 return SBCompileUnit (m_opaque_ap.get() ? m_opaque_ap->comp_unit : NULL); 96 } 97 98 SBFunction 99 SBSymbolContext::GetFunction () 100 { 101 return SBFunction (m_opaque_ap.get() ? m_opaque_ap->function : NULL); 102 } 103 104 SBBlock 105 SBSymbolContext::GetBlock () 106 { 107 return SBBlock (m_opaque_ap.get() ? m_opaque_ap->block : NULL); 108 } 109 110 SBLineEntry 111 SBSymbolContext::GetLineEntry () 112 { 113 SBLineEntry sb_line_entry; 114 if (m_opaque_ap.get()) 115 sb_line_entry.SetLineEntry (m_opaque_ap->line_entry); 116 117 return sb_line_entry; 118 } 119 120 SBSymbol 121 SBSymbolContext::GetSymbol () 122 { 123 return SBSymbol (m_opaque_ap.get() ? m_opaque_ap->symbol : NULL); 124 } 125 126 lldb_private::SymbolContext* 127 SBSymbolContext::operator->() const 128 { 129 return m_opaque_ap.get(); 130 } 131 132 133 const lldb_private::SymbolContext& 134 SBSymbolContext::operator*() const 135 { 136 assert (m_opaque_ap.get()); 137 return *m_opaque_ap.get(); 138 } 139 140 141 lldb_private::SymbolContext& 142 SBSymbolContext::operator*() 143 { 144 if (m_opaque_ap.get() == NULL) 145 m_opaque_ap.reset (new SymbolContext); 146 return *m_opaque_ap.get(); 147 } 148 149 lldb_private::SymbolContext& 150 SBSymbolContext::ref() 151 { 152 if (m_opaque_ap.get() == NULL) 153 m_opaque_ap.reset (new SymbolContext); 154 return *m_opaque_ap.get(); 155 } 156 157 lldb_private::SymbolContext * 158 SBSymbolContext::get() const 159 { 160 return m_opaque_ap.get(); 161 } 162 163 bool 164 SBSymbolContext::GetDescription (SBStream &description) 165 { 166 if (m_opaque_ap.get()) 167 { 168 description.ref(); 169 m_opaque_ap->GetDescription (description.get(), lldb::eDescriptionLevelFull, NULL); 170 } 171 else 172 description.Printf ("No value"); 173 174 return true; 175 } 176