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