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