1 //===-- SBTypeSummary.cpp -----------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "lldb/API/SBTypeSummary.h"
11 #include "lldb/API/SBStream.h"
12 #include "lldb/API/SBValue.h"
13 #include "lldb/DataFormatters/DataVisualization.h"
15 #include "llvm/Support/Casting.h"
18 using namespace lldb_private;
20 SBTypeSummaryOptions::SBTypeSummaryOptions()
22 m_opaque_ap.reset(new TypeSummaryOptions());
25 SBTypeSummaryOptions::SBTypeSummaryOptions (const lldb::SBTypeSummaryOptions &rhs)
28 m_opaque_ap.reset(new TypeSummaryOptions(*rhs.m_opaque_ap.get()));
30 m_opaque_ap.reset(new TypeSummaryOptions());
33 SBTypeSummaryOptions::~SBTypeSummaryOptions ()
38 SBTypeSummaryOptions::IsValid()
40 return m_opaque_ap.get();
44 SBTypeSummaryOptions::GetLanguage ()
47 return m_opaque_ap->GetLanguage();
48 return lldb::eLanguageTypeUnknown;
51 lldb::TypeSummaryCapping
52 SBTypeSummaryOptions::GetCapping ()
55 return m_opaque_ap->GetCapping();
56 return eTypeSummaryCapped;
60 SBTypeSummaryOptions::SetLanguage (lldb::LanguageType l)
63 m_opaque_ap->SetLanguage(l);
67 SBTypeSummaryOptions::SetCapping (lldb::TypeSummaryCapping c)
70 m_opaque_ap->SetCapping(c);
73 lldb_private::TypeSummaryOptions *
74 SBTypeSummaryOptions::operator->()
76 return m_opaque_ap.get();
79 const lldb_private::TypeSummaryOptions *
80 SBTypeSummaryOptions::operator->() const
82 return m_opaque_ap.get();
85 lldb_private::TypeSummaryOptions *
86 SBTypeSummaryOptions::get ()
88 return m_opaque_ap.get();
91 lldb_private::TypeSummaryOptions &
92 SBTypeSummaryOptions::ref()
94 return *m_opaque_ap.get();
97 const lldb_private::TypeSummaryOptions &
98 SBTypeSummaryOptions::ref() const
100 return *m_opaque_ap.get();
103 SBTypeSummaryOptions::SBTypeSummaryOptions (const lldb_private::TypeSummaryOptions *lldb_object_ptr)
105 SetOptions(lldb_object_ptr);
109 SBTypeSummaryOptions::SetOptions (const lldb_private::TypeSummaryOptions *lldb_object_ptr)
112 m_opaque_ap.reset(new TypeSummaryOptions(*lldb_object_ptr));
114 m_opaque_ap.reset(new TypeSummaryOptions());
117 SBTypeSummary::SBTypeSummary() :
123 SBTypeSummary::CreateWithSummaryString (const char* data, uint32_t options)
125 if (!data || data[0] == 0)
126 return SBTypeSummary();
128 return SBTypeSummary(TypeSummaryImplSP(new StringSummaryFormat(options, data)));
132 SBTypeSummary::CreateWithFunctionName (const char* data, uint32_t options)
134 if (!data || data[0] == 0)
135 return SBTypeSummary();
137 return SBTypeSummary(TypeSummaryImplSP(new ScriptSummaryFormat(options, data)));
141 SBTypeSummary::CreateWithScriptCode (const char* data, uint32_t options)
143 if (!data || data[0] == 0)
144 return SBTypeSummary();
146 return SBTypeSummary(TypeSummaryImplSP(new ScriptSummaryFormat(options, "", data)));
150 SBTypeSummary::CreateWithCallback (FormatCallback cb, uint32_t options, const char* description)
152 SBTypeSummary retval;
155 retval.SetSP(TypeSummaryImplSP(new CXXFunctionSummaryFormat(options,
156 [cb] (ValueObject& valobj, Stream& stm, const TypeSummaryOptions& opt) -> bool {
158 SBValue sb_value(valobj.GetSP());
159 SBTypeSummaryOptions options(&opt);
160 if (!cb(sb_value, options, stream))
162 stm.Write(stream.GetData(), stream.GetSize());
165 description ? description : "callback summary formatter")));
171 SBTypeSummary::SBTypeSummary (const lldb::SBTypeSummary &rhs) :
172 m_opaque_sp(rhs.m_opaque_sp)
176 SBTypeSummary::~SBTypeSummary ()
181 SBTypeSummary::IsValid() const
183 return m_opaque_sp.get() != NULL;
187 SBTypeSummary::IsFunctionCode()
191 if (ScriptSummaryFormat* script_summary_ptr = llvm::dyn_cast<ScriptSummaryFormat>(m_opaque_sp.get()))
193 const char* ftext = script_summary_ptr->GetPythonScript();
194 return (ftext && *ftext != 0);
200 SBTypeSummary::IsFunctionName()
204 if (ScriptSummaryFormat* script_summary_ptr = llvm::dyn_cast<ScriptSummaryFormat>(m_opaque_sp.get()))
206 const char* ftext = script_summary_ptr->GetPythonScript();
207 return (!ftext || *ftext == 0);
213 SBTypeSummary::IsSummaryString()
218 return m_opaque_sp->GetKind() == TypeSummaryImpl::Kind::eSummaryString;
222 SBTypeSummary::GetData ()
226 if (ScriptSummaryFormat* script_summary_ptr = llvm::dyn_cast<ScriptSummaryFormat>(m_opaque_sp.get()))
228 const char* fname = script_summary_ptr->GetFunctionName();
229 const char* ftext = script_summary_ptr->GetPythonScript();
234 else if (StringSummaryFormat* string_summary_ptr = llvm::dyn_cast<StringSummaryFormat>(m_opaque_sp.get()))
235 return string_summary_ptr->GetSummaryString();
240 SBTypeSummary::GetOptions ()
243 return lldb::eTypeOptionNone;
244 return m_opaque_sp->GetOptions();
248 SBTypeSummary::SetOptions (uint32_t value)
250 if (!CopyOnWrite_Impl())
252 m_opaque_sp->SetOptions(value);
256 SBTypeSummary::SetSummaryString (const char* data)
260 if (!llvm::isa<StringSummaryFormat>(m_opaque_sp.get()))
261 ChangeSummaryType(false);
262 if (StringSummaryFormat* string_summary_ptr = llvm::dyn_cast<StringSummaryFormat>(m_opaque_sp.get()))
263 string_summary_ptr->SetSummaryString(data);
267 SBTypeSummary::SetFunctionName (const char* data)
271 if (!llvm::isa<ScriptSummaryFormat>(m_opaque_sp.get()))
272 ChangeSummaryType(true);
273 if (ScriptSummaryFormat* script_summary_ptr = llvm::dyn_cast<ScriptSummaryFormat>(m_opaque_sp.get()))
274 script_summary_ptr->SetFunctionName(data);
278 SBTypeSummary::SetFunctionCode (const char* data)
282 if (!llvm::isa<ScriptSummaryFormat>(m_opaque_sp.get()))
283 ChangeSummaryType(true);
284 if (ScriptSummaryFormat* script_summary_ptr = llvm::dyn_cast<ScriptSummaryFormat>(m_opaque_sp.get()))
285 script_summary_ptr->SetPythonScript(data);
289 SBTypeSummary::GetDescription (lldb::SBStream &description,
290 lldb::DescriptionLevel description_level)
292 if (!CopyOnWrite_Impl())
295 description.Printf("%s\n",
296 m_opaque_sp->GetDescription().c_str());
302 SBTypeSummary::DoesPrintValue (lldb::SBValue value)
306 lldb::ValueObjectSP value_sp = value.GetSP();
307 return m_opaque_sp->DoesPrintValue(value_sp.get());
310 lldb::SBTypeSummary &
311 SBTypeSummary::operator = (const lldb::SBTypeSummary &rhs)
315 m_opaque_sp = rhs.m_opaque_sp;
321 SBTypeSummary::operator == (lldb::SBTypeSummary &rhs)
323 if (IsValid() == false)
324 return !rhs.IsValid();
325 return m_opaque_sp == rhs.m_opaque_sp;
329 SBTypeSummary::IsEqualTo (lldb::SBTypeSummary &rhs)
333 // valid and invalid are different
339 // invalid and valid are different
343 // both invalid are the same
347 if (m_opaque_sp->GetKind() != rhs.m_opaque_sp->GetKind())
350 switch (m_opaque_sp->GetKind())
352 case TypeSummaryImpl::Kind::eCallback:
353 return llvm::dyn_cast<CXXFunctionSummaryFormat>(m_opaque_sp.get()) == llvm::dyn_cast<CXXFunctionSummaryFormat>(rhs.m_opaque_sp.get());
354 case TypeSummaryImpl::Kind::eScript:
355 if (IsFunctionCode() != rhs.IsFunctionCode())
357 if (IsFunctionName() != rhs.IsFunctionName())
359 return GetOptions() == rhs.GetOptions();
360 case TypeSummaryImpl::Kind::eSummaryString:
361 if (IsSummaryString() != rhs.IsSummaryString())
363 return GetOptions() == rhs.GetOptions();
364 case TypeSummaryImpl::Kind::eInternal:
365 return (m_opaque_sp.get() == rhs.m_opaque_sp.get());
372 SBTypeSummary::operator != (lldb::SBTypeSummary &rhs)
374 if (IsValid() == false)
375 return !rhs.IsValid();
376 return m_opaque_sp != rhs.m_opaque_sp;
379 lldb::TypeSummaryImplSP
380 SBTypeSummary::GetSP ()
386 SBTypeSummary::SetSP (const lldb::TypeSummaryImplSP &typesummary_impl_sp)
388 m_opaque_sp = typesummary_impl_sp;
391 SBTypeSummary::SBTypeSummary (const lldb::TypeSummaryImplSP &typesummary_impl_sp) :
392 m_opaque_sp(typesummary_impl_sp)
397 SBTypeSummary::CopyOnWrite_Impl()
402 if (m_opaque_sp.unique())
405 TypeSummaryImplSP new_sp;
407 if (CXXFunctionSummaryFormat* current_summary_ptr = llvm::dyn_cast<CXXFunctionSummaryFormat>(m_opaque_sp.get()))
409 new_sp = TypeSummaryImplSP(new CXXFunctionSummaryFormat(GetOptions(),
410 current_summary_ptr->m_impl,
411 current_summary_ptr->m_description.c_str()));
413 else if (ScriptSummaryFormat* current_summary_ptr = llvm::dyn_cast<ScriptSummaryFormat>(m_opaque_sp.get()))
415 new_sp = TypeSummaryImplSP(new ScriptSummaryFormat(GetOptions(),
416 current_summary_ptr->GetFunctionName(),
417 current_summary_ptr->GetPythonScript()));
419 else if (StringSummaryFormat* current_summary_ptr = llvm::dyn_cast<StringSummaryFormat>(m_opaque_sp.get()))
421 new_sp = TypeSummaryImplSP(new StringSummaryFormat(GetOptions(),
422 current_summary_ptr->GetSummaryString()));
427 return nullptr != new_sp.get();
431 SBTypeSummary::ChangeSummaryType (bool want_script)
436 TypeSummaryImplSP new_sp;
438 if (want_script == (m_opaque_sp->GetKind() == TypeSummaryImpl::Kind::eScript))
440 if (m_opaque_sp->GetKind() == lldb_private::TypeSummaryImpl::Kind::eCallback && !want_script)
441 new_sp = TypeSummaryImplSP(new StringSummaryFormat(GetOptions(), ""));
443 return CopyOnWrite_Impl();
449 new_sp = TypeSummaryImplSP(new ScriptSummaryFormat(GetOptions(), "", ""));
451 new_sp = TypeSummaryImplSP(new StringSummaryFormat(GetOptions(), ""));