1 //===-- SBTypeSummary.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/SBTypeSummary.h" 11 12 #include "lldb/API/SBStream.h" 13 14 #include "lldb/Core/DataVisualization.h" 15 16 using namespace lldb; 17 using namespace lldb_private; 18 19 #ifndef LLDB_DISABLE_PYTHON 20 21 SBTypeSummary::SBTypeSummary() : 22 m_opaque_sp() 23 { 24 } 25 26 SBTypeSummary 27 SBTypeSummary::CreateWithSummaryString (const char* data, uint32_t options) 28 { 29 if (!data || data[0] == 0) 30 return SBTypeSummary(); 31 32 return SBTypeSummary(TypeSummaryImplSP(new StringSummaryFormat(options, data))); 33 } 34 35 SBTypeSummary 36 SBTypeSummary::CreateWithFunctionName (const char* data, uint32_t options) 37 { 38 if (!data || data[0] == 0) 39 return SBTypeSummary(); 40 41 return SBTypeSummary(TypeSummaryImplSP(new ScriptSummaryFormat(options, data))); 42 } 43 44 SBTypeSummary 45 SBTypeSummary::CreateWithScriptCode (const char* data, uint32_t options) 46 { 47 if (!data || data[0] == 0) 48 return SBTypeSummary(); 49 50 return SBTypeSummary(TypeSummaryImplSP(new ScriptSummaryFormat(options, "", data))); 51 } 52 53 SBTypeSummary::SBTypeSummary (const lldb::SBTypeSummary &rhs) : 54 m_opaque_sp(rhs.m_opaque_sp) 55 { 56 } 57 58 SBTypeSummary::~SBTypeSummary () 59 { 60 } 61 62 bool 63 SBTypeSummary::IsValid() const 64 { 65 return m_opaque_sp.get() != NULL; 66 } 67 68 bool 69 SBTypeSummary::IsFunctionCode() 70 { 71 if (!IsValid()) 72 return false; 73 if (m_opaque_sp->IsScripted()) 74 { 75 ScriptSummaryFormat* script_summary_ptr = (ScriptSummaryFormat*)m_opaque_sp.get(); 76 const char* ftext = script_summary_ptr->GetPythonScript(); 77 return (ftext && *ftext != 0); 78 } 79 return false; 80 } 81 82 bool 83 SBTypeSummary::IsFunctionName() 84 { 85 if (!IsValid()) 86 return false; 87 if (m_opaque_sp->IsScripted()) 88 { 89 ScriptSummaryFormat* script_summary_ptr = (ScriptSummaryFormat*)m_opaque_sp.get(); 90 const char* ftext = script_summary_ptr->GetPythonScript(); 91 return (!ftext || *ftext == 0); 92 } 93 return false; 94 } 95 96 bool 97 SBTypeSummary::IsSummaryString() 98 { 99 if (!IsValid()) 100 return false; 101 102 return !m_opaque_sp->IsScripted(); 103 } 104 105 const char* 106 SBTypeSummary::GetData () 107 { 108 if (!IsValid()) 109 return NULL; 110 if (m_opaque_sp->IsScripted()) 111 { 112 ScriptSummaryFormat* script_summary_ptr = (ScriptSummaryFormat*)m_opaque_sp.get(); 113 const char* fname = script_summary_ptr->GetFunctionName(); 114 const char* ftext = script_summary_ptr->GetPythonScript(); 115 if (ftext && *ftext) 116 return ftext; 117 return fname; 118 } 119 else 120 { 121 StringSummaryFormat* string_summary_ptr = (StringSummaryFormat*)m_opaque_sp.get(); 122 return string_summary_ptr->GetSummaryString(); 123 } 124 } 125 126 uint32_t 127 SBTypeSummary::GetOptions () 128 { 129 if (!IsValid()) 130 return lldb::eTypeOptionNone; 131 return m_opaque_sp->GetOptions(); 132 } 133 134 void 135 SBTypeSummary::SetOptions (uint32_t value) 136 { 137 if (!CopyOnWrite_Impl()) 138 return; 139 m_opaque_sp->SetOptions(value); 140 } 141 142 void 143 SBTypeSummary::SetSummaryString (const char* data) 144 { 145 if (!IsValid()) 146 return; 147 if (m_opaque_sp->IsScripted()) 148 ChangeSummaryType(false); 149 ((StringSummaryFormat*)m_opaque_sp.get())->SetSummaryString(data); 150 } 151 152 void 153 SBTypeSummary::SetFunctionName (const char* data) 154 { 155 if (!IsValid()) 156 return; 157 if (!m_opaque_sp->IsScripted()) 158 ChangeSummaryType(true); 159 ((ScriptSummaryFormat*)m_opaque_sp.get())->SetFunctionName(data); 160 } 161 162 void 163 SBTypeSummary::SetFunctionCode (const char* data) 164 { 165 if (!IsValid()) 166 return; 167 if (!m_opaque_sp->IsScripted()) 168 ChangeSummaryType(true); 169 ((ScriptSummaryFormat*)m_opaque_sp.get())->SetPythonScript(data); 170 } 171 172 bool 173 SBTypeSummary::GetDescription (lldb::SBStream &description, 174 lldb::DescriptionLevel description_level) 175 { 176 if (!CopyOnWrite_Impl()) 177 return false; 178 else { 179 description.Printf("%s\n", 180 m_opaque_sp->GetDescription().c_str()); 181 return true; 182 } 183 } 184 185 lldb::SBTypeSummary & 186 SBTypeSummary::operator = (const lldb::SBTypeSummary &rhs) 187 { 188 if (this != &rhs) 189 { 190 m_opaque_sp = rhs.m_opaque_sp; 191 } 192 return *this; 193 } 194 195 bool 196 SBTypeSummary::operator == (lldb::SBTypeSummary &rhs) 197 { 198 if (IsValid() == false) 199 return !rhs.IsValid(); 200 return m_opaque_sp == rhs.m_opaque_sp; 201 } 202 203 bool 204 SBTypeSummary::IsEqualTo (lldb::SBTypeSummary &rhs) 205 { 206 if (IsValid() == false) 207 return !rhs.IsValid(); 208 209 if (m_opaque_sp->IsScripted() != rhs.m_opaque_sp->IsScripted()) 210 return false; 211 212 if (IsFunctionCode() != rhs.IsFunctionCode()) 213 return false; 214 215 if (IsSummaryString() != rhs.IsSummaryString()) 216 return false; 217 218 if (IsFunctionName() != rhs.IsFunctionName()) 219 return false; 220 221 if ( strcmp(GetData(), rhs.GetData()) ) 222 return false; 223 224 return GetOptions() == rhs.GetOptions(); 225 226 } 227 228 bool 229 SBTypeSummary::operator != (lldb::SBTypeSummary &rhs) 230 { 231 if (IsValid() == false) 232 return !rhs.IsValid(); 233 return m_opaque_sp != rhs.m_opaque_sp; 234 } 235 236 lldb::TypeSummaryImplSP 237 SBTypeSummary::GetSP () 238 { 239 return m_opaque_sp; 240 } 241 242 void 243 SBTypeSummary::SetSP (const lldb::TypeSummaryImplSP &typesummary_impl_sp) 244 { 245 m_opaque_sp = typesummary_impl_sp; 246 } 247 248 SBTypeSummary::SBTypeSummary (const lldb::TypeSummaryImplSP &typesummary_impl_sp) : 249 m_opaque_sp(typesummary_impl_sp) 250 { 251 } 252 253 bool 254 SBTypeSummary::CopyOnWrite_Impl() 255 { 256 if (!IsValid()) 257 return false; 258 if (m_opaque_sp.unique()) 259 return true; 260 261 TypeSummaryImplSP new_sp; 262 263 if (m_opaque_sp->IsScripted()) 264 { 265 ScriptSummaryFormat* current_summary_ptr = (ScriptSummaryFormat*)m_opaque_sp.get(); 266 new_sp = TypeSummaryImplSP(new ScriptSummaryFormat(GetOptions(), 267 current_summary_ptr->GetFunctionName(), 268 current_summary_ptr->GetPythonScript())); 269 } 270 else { 271 StringSummaryFormat* current_summary_ptr = (StringSummaryFormat*)m_opaque_sp.get(); 272 new_sp = TypeSummaryImplSP(new StringSummaryFormat(GetOptions(), 273 current_summary_ptr->GetSummaryString())); 274 } 275 276 SetSP(new_sp); 277 278 return true; 279 } 280 281 bool 282 SBTypeSummary::ChangeSummaryType (bool want_script) 283 { 284 if (!IsValid()) 285 return false; 286 287 if (want_script == m_opaque_sp->IsScripted()) 288 return CopyOnWrite_Impl(); 289 290 TypeSummaryImplSP new_sp; 291 292 if (want_script) 293 new_sp = TypeSummaryImplSP(new ScriptSummaryFormat(GetOptions(), "", "")); 294 else 295 new_sp = TypeSummaryImplSP(new StringSummaryFormat(GetOptions(), "")); 296 297 SetSP(new_sp); 298 299 return true; 300 } 301 302 #endif // LLDB_DISABLE_PYTHON 303