1254721Semaste//===-- SBTypeSummary.cpp -----------------------------------------*- C++ -*-===// 2254721Semaste// 3254721Semaste// The LLVM Compiler Infrastructure 4254721Semaste// 5254721Semaste// This file is distributed under the University of Illinois Open Source 6254721Semaste// License. See LICENSE.TXT for details. 7254721Semaste// 8254721Semaste//===----------------------------------------------------------------------===// 9254721Semaste 10254721Semaste#include "lldb/lldb-python.h" 11254721Semaste 12254721Semaste#include "lldb/API/SBTypeSummary.h" 13254721Semaste 14254721Semaste#include "lldb/API/SBStream.h" 15254721Semaste 16254721Semaste#include "lldb/DataFormatters/DataVisualization.h" 17254721Semaste 18254721Semasteusing namespace lldb; 19254721Semasteusing namespace lldb_private; 20254721Semaste 21254721Semaste#ifndef LLDB_DISABLE_PYTHON 22254721Semaste 23254721SemasteSBTypeSummary::SBTypeSummary() : 24254721Semastem_opaque_sp() 25254721Semaste{ 26254721Semaste} 27254721Semaste 28254721SemasteSBTypeSummary 29254721SemasteSBTypeSummary::CreateWithSummaryString (const char* data, uint32_t options) 30254721Semaste{ 31254721Semaste if (!data || data[0] == 0) 32254721Semaste return SBTypeSummary(); 33254721Semaste 34254721Semaste return SBTypeSummary(TypeSummaryImplSP(new StringSummaryFormat(options, data))); 35254721Semaste} 36254721Semaste 37254721SemasteSBTypeSummary 38254721SemasteSBTypeSummary::CreateWithFunctionName (const char* data, uint32_t options) 39254721Semaste{ 40254721Semaste if (!data || data[0] == 0) 41254721Semaste return SBTypeSummary(); 42254721Semaste 43254721Semaste return SBTypeSummary(TypeSummaryImplSP(new ScriptSummaryFormat(options, data))); 44254721Semaste} 45254721Semaste 46254721SemasteSBTypeSummary 47254721SemasteSBTypeSummary::CreateWithScriptCode (const char* data, uint32_t options) 48254721Semaste{ 49254721Semaste if (!data || data[0] == 0) 50254721Semaste return SBTypeSummary(); 51254721Semaste 52254721Semaste return SBTypeSummary(TypeSummaryImplSP(new ScriptSummaryFormat(options, "", data))); 53254721Semaste} 54254721Semaste 55254721SemasteSBTypeSummary::SBTypeSummary (const lldb::SBTypeSummary &rhs) : 56254721Semastem_opaque_sp(rhs.m_opaque_sp) 57254721Semaste{ 58254721Semaste} 59254721Semaste 60254721SemasteSBTypeSummary::~SBTypeSummary () 61254721Semaste{ 62254721Semaste} 63254721Semaste 64254721Semastebool 65254721SemasteSBTypeSummary::IsValid() const 66254721Semaste{ 67254721Semaste return m_opaque_sp.get() != NULL; 68254721Semaste} 69254721Semaste 70254721Semastebool 71254721SemasteSBTypeSummary::IsFunctionCode() 72254721Semaste{ 73254721Semaste if (!IsValid()) 74254721Semaste return false; 75254721Semaste if (m_opaque_sp->IsScripted()) 76254721Semaste { 77254721Semaste ScriptSummaryFormat* script_summary_ptr = (ScriptSummaryFormat*)m_opaque_sp.get(); 78254721Semaste const char* ftext = script_summary_ptr->GetPythonScript(); 79254721Semaste return (ftext && *ftext != 0); 80254721Semaste } 81254721Semaste return false; 82254721Semaste} 83254721Semaste 84254721Semastebool 85254721SemasteSBTypeSummary::IsFunctionName() 86254721Semaste{ 87254721Semaste if (!IsValid()) 88254721Semaste return false; 89254721Semaste if (m_opaque_sp->IsScripted()) 90254721Semaste { 91254721Semaste ScriptSummaryFormat* script_summary_ptr = (ScriptSummaryFormat*)m_opaque_sp.get(); 92254721Semaste const char* ftext = script_summary_ptr->GetPythonScript(); 93254721Semaste return (!ftext || *ftext == 0); 94254721Semaste } 95254721Semaste return false; 96254721Semaste} 97254721Semaste 98254721Semastebool 99254721SemasteSBTypeSummary::IsSummaryString() 100254721Semaste{ 101254721Semaste if (!IsValid()) 102254721Semaste return false; 103254721Semaste 104254721Semaste if (m_opaque_sp->GetType() == lldb_private::TypeSummaryImpl::eTypeCallback) 105254721Semaste return false; 106254721Semaste 107254721Semaste return !m_opaque_sp->IsScripted(); 108254721Semaste} 109254721Semaste 110254721Semasteconst char* 111254721SemasteSBTypeSummary::GetData () 112254721Semaste{ 113254721Semaste if (!IsValid()) 114254721Semaste return NULL; 115254721Semaste if (m_opaque_sp->GetType() == lldb_private::TypeSummaryImpl::eTypeCallback) 116254721Semaste return NULL; 117254721Semaste if (m_opaque_sp->IsScripted()) 118254721Semaste { 119254721Semaste ScriptSummaryFormat* script_summary_ptr = (ScriptSummaryFormat*)m_opaque_sp.get(); 120254721Semaste const char* fname = script_summary_ptr->GetFunctionName(); 121254721Semaste const char* ftext = script_summary_ptr->GetPythonScript(); 122254721Semaste if (ftext && *ftext) 123254721Semaste return ftext; 124254721Semaste return fname; 125254721Semaste } 126254721Semaste else 127254721Semaste { 128254721Semaste StringSummaryFormat* string_summary_ptr = (StringSummaryFormat*)m_opaque_sp.get(); 129254721Semaste return string_summary_ptr->GetSummaryString(); 130254721Semaste } 131254721Semaste} 132254721Semaste 133254721Semasteuint32_t 134254721SemasteSBTypeSummary::GetOptions () 135254721Semaste{ 136254721Semaste if (!IsValid()) 137254721Semaste return lldb::eTypeOptionNone; 138254721Semaste return m_opaque_sp->GetOptions(); 139254721Semaste} 140254721Semaste 141254721Semastevoid 142254721SemasteSBTypeSummary::SetOptions (uint32_t value) 143254721Semaste{ 144254721Semaste if (!CopyOnWrite_Impl()) 145254721Semaste return; 146254721Semaste m_opaque_sp->SetOptions(value); 147254721Semaste} 148254721Semaste 149254721Semastevoid 150254721SemasteSBTypeSummary::SetSummaryString (const char* data) 151254721Semaste{ 152254721Semaste if (!IsValid()) 153254721Semaste return; 154254721Semaste if (m_opaque_sp->IsScripted() || (m_opaque_sp->GetType() == lldb_private::TypeSummaryImpl::eTypeCallback)) 155254721Semaste ChangeSummaryType(false); 156254721Semaste ((StringSummaryFormat*)m_opaque_sp.get())->SetSummaryString(data); 157254721Semaste} 158254721Semaste 159254721Semastevoid 160254721SemasteSBTypeSummary::SetFunctionName (const char* data) 161254721Semaste{ 162254721Semaste if (!IsValid()) 163254721Semaste return; 164254721Semaste if (!m_opaque_sp->IsScripted()) 165254721Semaste ChangeSummaryType(true); 166254721Semaste ((ScriptSummaryFormat*)m_opaque_sp.get())->SetFunctionName(data); 167254721Semaste} 168254721Semaste 169254721Semastevoid 170254721SemasteSBTypeSummary::SetFunctionCode (const char* data) 171254721Semaste{ 172254721Semaste if (!IsValid()) 173254721Semaste return; 174254721Semaste if (!m_opaque_sp->IsScripted()) 175254721Semaste ChangeSummaryType(true); 176254721Semaste ((ScriptSummaryFormat*)m_opaque_sp.get())->SetPythonScript(data); 177254721Semaste} 178254721Semaste 179254721Semastebool 180254721SemasteSBTypeSummary::GetDescription (lldb::SBStream &description, 181254721Semaste lldb::DescriptionLevel description_level) 182254721Semaste{ 183254721Semaste if (!CopyOnWrite_Impl()) 184254721Semaste return false; 185254721Semaste else { 186254721Semaste description.Printf("%s\n", 187254721Semaste m_opaque_sp->GetDescription().c_str()); 188254721Semaste return true; 189254721Semaste } 190254721Semaste} 191254721Semaste 192254721Semastelldb::SBTypeSummary & 193254721SemasteSBTypeSummary::operator = (const lldb::SBTypeSummary &rhs) 194254721Semaste{ 195254721Semaste if (this != &rhs) 196254721Semaste { 197254721Semaste m_opaque_sp = rhs.m_opaque_sp; 198254721Semaste } 199254721Semaste return *this; 200254721Semaste} 201254721Semaste 202254721Semastebool 203254721SemasteSBTypeSummary::operator == (lldb::SBTypeSummary &rhs) 204254721Semaste{ 205254721Semaste if (IsValid() == false) 206254721Semaste return !rhs.IsValid(); 207254721Semaste return m_opaque_sp == rhs.m_opaque_sp; 208254721Semaste} 209254721Semaste 210254721Semastebool 211254721SemasteSBTypeSummary::IsEqualTo (lldb::SBTypeSummary &rhs) 212254721Semaste{ 213254721Semaste if (IsValid() == false) 214254721Semaste return !rhs.IsValid(); 215254721Semaste 216254721Semaste if (m_opaque_sp->GetType() != rhs.m_opaque_sp->GetType()) 217254721Semaste return false; 218254721Semaste 219254721Semaste if (m_opaque_sp->GetType() == lldb_private::TypeSummaryImpl::eTypeCallback) 220254721Semaste { 221254721Semaste lldb_private::CXXFunctionSummaryFormat *self_cxx = (lldb_private::CXXFunctionSummaryFormat*)m_opaque_sp.get(); 222254721Semaste lldb_private::CXXFunctionSummaryFormat *other_cxx = (lldb_private::CXXFunctionSummaryFormat*)rhs.m_opaque_sp.get(); 223254721Semaste return (self_cxx->m_impl == other_cxx->m_impl); 224254721Semaste } 225254721Semaste 226254721Semaste if (m_opaque_sp->IsScripted() != rhs.m_opaque_sp->IsScripted()) 227254721Semaste return false; 228254721Semaste 229254721Semaste if (IsFunctionCode() != rhs.IsFunctionCode()) 230254721Semaste return false; 231254721Semaste 232254721Semaste if (IsSummaryString() != rhs.IsSummaryString()) 233254721Semaste return false; 234254721Semaste 235254721Semaste if (IsFunctionName() != rhs.IsFunctionName()) 236254721Semaste return false; 237254721Semaste 238254721Semaste if ( GetData() == NULL || rhs.GetData() == NULL || strcmp(GetData(), rhs.GetData()) ) 239254721Semaste return false; 240254721Semaste 241254721Semaste return GetOptions() == rhs.GetOptions(); 242254721Semaste 243254721Semaste} 244254721Semaste 245254721Semastebool 246254721SemasteSBTypeSummary::operator != (lldb::SBTypeSummary &rhs) 247254721Semaste{ 248254721Semaste if (IsValid() == false) 249254721Semaste return !rhs.IsValid(); 250254721Semaste return m_opaque_sp != rhs.m_opaque_sp; 251254721Semaste} 252254721Semaste 253254721Semastelldb::TypeSummaryImplSP 254254721SemasteSBTypeSummary::GetSP () 255254721Semaste{ 256254721Semaste return m_opaque_sp; 257254721Semaste} 258254721Semaste 259254721Semastevoid 260254721SemasteSBTypeSummary::SetSP (const lldb::TypeSummaryImplSP &typesummary_impl_sp) 261254721Semaste{ 262254721Semaste m_opaque_sp = typesummary_impl_sp; 263254721Semaste} 264254721Semaste 265254721SemasteSBTypeSummary::SBTypeSummary (const lldb::TypeSummaryImplSP &typesummary_impl_sp) : 266254721Semastem_opaque_sp(typesummary_impl_sp) 267254721Semaste{ 268254721Semaste} 269254721Semaste 270254721Semastebool 271254721SemasteSBTypeSummary::CopyOnWrite_Impl() 272254721Semaste{ 273254721Semaste if (!IsValid()) 274254721Semaste return false; 275254721Semaste 276254721Semaste if (m_opaque_sp.unique()) 277254721Semaste return true; 278254721Semaste 279254721Semaste TypeSummaryImplSP new_sp; 280254721Semaste 281254721Semaste if (m_opaque_sp->GetType() == lldb_private::TypeSummaryImpl::eTypeCallback) 282254721Semaste { 283254721Semaste CXXFunctionSummaryFormat* current_summary_ptr = (CXXFunctionSummaryFormat*)m_opaque_sp.get(); 284254721Semaste new_sp = TypeSummaryImplSP(new CXXFunctionSummaryFormat(GetOptions(), 285254721Semaste current_summary_ptr->m_impl, 286254721Semaste current_summary_ptr->m_description.c_str())); 287254721Semaste } 288254721Semaste else if (m_opaque_sp->IsScripted()) 289254721Semaste { 290254721Semaste ScriptSummaryFormat* current_summary_ptr = (ScriptSummaryFormat*)m_opaque_sp.get(); 291254721Semaste new_sp = TypeSummaryImplSP(new ScriptSummaryFormat(GetOptions(), 292254721Semaste current_summary_ptr->GetFunctionName(), 293254721Semaste current_summary_ptr->GetPythonScript())); 294254721Semaste } 295254721Semaste else { 296254721Semaste StringSummaryFormat* current_summary_ptr = (StringSummaryFormat*)m_opaque_sp.get(); 297254721Semaste new_sp = TypeSummaryImplSP(new StringSummaryFormat(GetOptions(), 298254721Semaste current_summary_ptr->GetSummaryString())); 299254721Semaste } 300254721Semaste 301254721Semaste SetSP(new_sp); 302254721Semaste 303254721Semaste return true; 304254721Semaste} 305254721Semaste 306254721Semastebool 307254721SemasteSBTypeSummary::ChangeSummaryType (bool want_script) 308254721Semaste{ 309254721Semaste if (!IsValid()) 310254721Semaste return false; 311254721Semaste 312254721Semaste TypeSummaryImplSP new_sp; 313254721Semaste 314254721Semaste if (want_script == m_opaque_sp->IsScripted()) 315254721Semaste { 316254721Semaste if (m_opaque_sp->GetType() == lldb_private::TypeSummaryImpl::eTypeCallback && !want_script) 317254721Semaste new_sp = TypeSummaryImplSP(new StringSummaryFormat(GetOptions(), "")); 318254721Semaste else 319254721Semaste return CopyOnWrite_Impl(); 320254721Semaste } 321254721Semaste 322254721Semaste if (!new_sp) 323254721Semaste { 324254721Semaste if (want_script) 325254721Semaste new_sp = TypeSummaryImplSP(new ScriptSummaryFormat(GetOptions(), "", "")); 326254721Semaste else 327254721Semaste new_sp = TypeSummaryImplSP(new StringSummaryFormat(GetOptions(), "")); 328254721Semaste } 329254721Semaste 330254721Semaste SetSP(new_sp); 331254721Semaste 332254721Semaste return true; 333254721Semaste} 334254721Semaste 335254721Semaste#endif // LLDB_DISABLE_PYTHON 336