180814287SRaphael Isemann //===-- SBTypeSummary.cpp -------------------------------------------------===//
2061858ceSEnrico Granata //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6061858ceSEnrico Granata //
7061858ceSEnrico Granata //===----------------------------------------------------------------------===//
8061858ceSEnrico Granata
9061858ceSEnrico Granata #include "lldb/API/SBTypeSummary.h"
10bd4bf82aSJonas Devlieghere #include "Utils.h"
11061858ceSEnrico Granata #include "lldb/API/SBStream.h"
1274b8f4cbSDawn Perchik #include "lldb/API/SBValue.h"
135548cb50SEnrico Granata #include "lldb/DataFormatters/DataVisualization.h"
14*1755f5b1SJonas Devlieghere #include "lldb/Utility/Instrumentation.h"
15061858ceSEnrico Granata
16da7cb142SEnrico Granata #include "llvm/Support/Casting.h"
17da7cb142SEnrico Granata
18061858ceSEnrico Granata using namespace lldb;
19061858ceSEnrico Granata using namespace lldb_private;
20061858ceSEnrico Granata
SBTypeSummaryOptions()21baf5664fSJonas Devlieghere SBTypeSummaryOptions::SBTypeSummaryOptions() {
22*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
23baf5664fSJonas Devlieghere
241c0bbe43SJonas Devlieghere m_opaque_up = std::make_unique<TypeSummaryOptions>();
25baf5664fSJonas Devlieghere }
26c1247f55SEnrico Granata
SBTypeSummaryOptions(const lldb::SBTypeSummaryOptions & rhs)27b9c1b51eSKate Stone SBTypeSummaryOptions::SBTypeSummaryOptions(
28b9c1b51eSKate Stone const lldb::SBTypeSummaryOptions &rhs) {
29*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs);
30baf5664fSJonas Devlieghere
31bd4bf82aSJonas Devlieghere m_opaque_up = clone(rhs.m_opaque_up);
32c1247f55SEnrico Granata }
33c1247f55SEnrico Granata
34866b7a65SJonas Devlieghere SBTypeSummaryOptions::~SBTypeSummaryOptions() = default;
35c1247f55SEnrico Granata
IsValid()36baf5664fSJonas Devlieghere bool SBTypeSummaryOptions::IsValid() {
37*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
387f5237bcSPavel Labath return this->operator bool();
397f5237bcSPavel Labath }
operator bool() const407f5237bcSPavel Labath SBTypeSummaryOptions::operator bool() const {
41*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
42baf5664fSJonas Devlieghere
43baf5664fSJonas Devlieghere return m_opaque_up.get();
44baf5664fSJonas Devlieghere }
45c1247f55SEnrico Granata
GetLanguage()46b9c1b51eSKate Stone lldb::LanguageType SBTypeSummaryOptions::GetLanguage() {
47*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
48baf5664fSJonas Devlieghere
49c1247f55SEnrico Granata if (IsValid())
50d5b44036SJonas Devlieghere return m_opaque_up->GetLanguage();
51c1247f55SEnrico Granata return lldb::eLanguageTypeUnknown;
52c1247f55SEnrico Granata }
53c1247f55SEnrico Granata
GetCapping()54b9c1b51eSKate Stone lldb::TypeSummaryCapping SBTypeSummaryOptions::GetCapping() {
55*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
56baf5664fSJonas Devlieghere
57c1247f55SEnrico Granata if (IsValid())
58d5b44036SJonas Devlieghere return m_opaque_up->GetCapping();
59c1247f55SEnrico Granata return eTypeSummaryCapped;
60c1247f55SEnrico Granata }
61c1247f55SEnrico Granata
SetLanguage(lldb::LanguageType l)62b9c1b51eSKate Stone void SBTypeSummaryOptions::SetLanguage(lldb::LanguageType l) {
63*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, l);
64baf5664fSJonas Devlieghere
65c1247f55SEnrico Granata if (IsValid())
66d5b44036SJonas Devlieghere m_opaque_up->SetLanguage(l);
67c1247f55SEnrico Granata }
68c1247f55SEnrico Granata
SetCapping(lldb::TypeSummaryCapping c)69b9c1b51eSKate Stone void SBTypeSummaryOptions::SetCapping(lldb::TypeSummaryCapping c) {
70*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, c);
71baf5664fSJonas Devlieghere
72c1247f55SEnrico Granata if (IsValid())
73d5b44036SJonas Devlieghere m_opaque_up->SetCapping(c);
74c1247f55SEnrico Granata }
75c1247f55SEnrico Granata
operator ->()76b9c1b51eSKate Stone lldb_private::TypeSummaryOptions *SBTypeSummaryOptions::operator->() {
77d5b44036SJonas Devlieghere return m_opaque_up.get();
78c1247f55SEnrico Granata }
79c1247f55SEnrico Granata
80b9c1b51eSKate Stone const lldb_private::TypeSummaryOptions *SBTypeSummaryOptions::
operator ->() const81b9c1b51eSKate Stone operator->() const {
82d5b44036SJonas Devlieghere return m_opaque_up.get();
83c1247f55SEnrico Granata }
84c1247f55SEnrico Granata
get()85b9c1b51eSKate Stone lldb_private::TypeSummaryOptions *SBTypeSummaryOptions::get() {
86d5b44036SJonas Devlieghere return m_opaque_up.get();
87c1247f55SEnrico Granata }
88c1247f55SEnrico Granata
ref()89b9c1b51eSKate Stone lldb_private::TypeSummaryOptions &SBTypeSummaryOptions::ref() {
90d5b44036SJonas Devlieghere return *m_opaque_up;
91c1247f55SEnrico Granata }
92c1247f55SEnrico Granata
ref() const93b9c1b51eSKate Stone const lldb_private::TypeSummaryOptions &SBTypeSummaryOptions::ref() const {
94d5b44036SJonas Devlieghere return *m_opaque_up;
95c1247f55SEnrico Granata }
96c1247f55SEnrico Granata
SBTypeSummaryOptions(const lldb_private::TypeSummaryOptions & lldb_object)97b9c1b51eSKate Stone SBTypeSummaryOptions::SBTypeSummaryOptions(
982efc6892SPavel Labath const lldb_private::TypeSummaryOptions &lldb_object)
992efc6892SPavel Labath : m_opaque_up(std::make_unique<TypeSummaryOptions>(lldb_object)) {
100*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, lldb_object);
101c1247f55SEnrico Granata }
102c1247f55SEnrico Granata
SBTypeSummary()103*1755f5b1SJonas Devlieghere SBTypeSummary::SBTypeSummary() { LLDB_INSTRUMENT_VA(this); }
104061858ceSEnrico Granata
CreateWithSummaryString(const char * data,uint32_t options)105b9c1b51eSKate Stone SBTypeSummary SBTypeSummary::CreateWithSummaryString(const char *data,
106b9c1b51eSKate Stone uint32_t options) {
107*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(data, options);
108061858ceSEnrico Granata
109baf5664fSJonas Devlieghere if (!data || data[0] == 0)
110d232abc3SJonas Devlieghere return SBTypeSummary();
111baf5664fSJonas Devlieghere
112d232abc3SJonas Devlieghere return SBTypeSummary(
113d232abc3SJonas Devlieghere TypeSummaryImplSP(new StringSummaryFormat(options, data)));
114061858ceSEnrico Granata }
115061858ceSEnrico Granata
CreateWithFunctionName(const char * data,uint32_t options)116b9c1b51eSKate Stone SBTypeSummary SBTypeSummary::CreateWithFunctionName(const char *data,
117b9c1b51eSKate Stone uint32_t options) {
118*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(data, options);
119061858ceSEnrico Granata
120baf5664fSJonas Devlieghere if (!data || data[0] == 0)
121d232abc3SJonas Devlieghere return SBTypeSummary();
122baf5664fSJonas Devlieghere
123d232abc3SJonas Devlieghere return SBTypeSummary(
124d232abc3SJonas Devlieghere TypeSummaryImplSP(new ScriptSummaryFormat(options, data)));
125061858ceSEnrico Granata }
126061858ceSEnrico Granata
CreateWithScriptCode(const char * data,uint32_t options)127b9c1b51eSKate Stone SBTypeSummary SBTypeSummary::CreateWithScriptCode(const char *data,
128b9c1b51eSKate Stone uint32_t options) {
129*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(data, options);
130061858ceSEnrico Granata
131baf5664fSJonas Devlieghere if (!data || data[0] == 0)
132d232abc3SJonas Devlieghere return SBTypeSummary();
133baf5664fSJonas Devlieghere
134d232abc3SJonas Devlieghere return SBTypeSummary(
135d232abc3SJonas Devlieghere TypeSummaryImplSP(new ScriptSummaryFormat(options, "", data)));
136061858ceSEnrico Granata }
137061858ceSEnrico Granata
CreateWithCallback(FormatCallback cb,uint32_t options,const char * description)138b9c1b51eSKate Stone SBTypeSummary SBTypeSummary::CreateWithCallback(FormatCallback cb,
139b9c1b51eSKate Stone uint32_t options,
140b9c1b51eSKate Stone const char *description) {
141*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(cb, options, description);
1420d7b0c96SJonas Devlieghere
143e7cbaf3eSEnrico Granata SBTypeSummary retval;
144b9c1b51eSKate Stone if (cb) {
145b9c1b51eSKate Stone retval.SetSP(TypeSummaryImplSP(new CXXFunctionSummaryFormat(
146b9c1b51eSKate Stone options,
147b9c1b51eSKate Stone [cb](ValueObject &valobj, Stream &stm,
148b9c1b51eSKate Stone const TypeSummaryOptions &opt) -> bool {
1492592fb96SSean Callanan SBStream stream;
150e7cbaf3eSEnrico Granata SBValue sb_value(valobj.GetSP());
1512efc6892SPavel Labath SBTypeSummaryOptions options(opt);
152e7cbaf3eSEnrico Granata if (!cb(sb_value, options, stream))
1538826519eSDawn Perchik return false;
1548826519eSDawn Perchik stm.Write(stream.GetData(), stream.GetSize());
1558826519eSDawn Perchik return true;
1568826519eSDawn Perchik },
157e7cbaf3eSEnrico Granata description ? description : "callback summary formatter")));
158e7cbaf3eSEnrico Granata }
159e7cbaf3eSEnrico Granata
160e7cbaf3eSEnrico Granata return retval;
1618826519eSDawn Perchik }
1628826519eSDawn Perchik
SBTypeSummary(const lldb::SBTypeSummary & rhs)163b9c1b51eSKate Stone SBTypeSummary::SBTypeSummary(const lldb::SBTypeSummary &rhs)
164baf5664fSJonas Devlieghere : m_opaque_sp(rhs.m_opaque_sp) {
165*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs);
166baf5664fSJonas Devlieghere }
167061858ceSEnrico Granata
168866b7a65SJonas Devlieghere SBTypeSummary::~SBTypeSummary() = default;
169061858ceSEnrico Granata
IsValid() const170baf5664fSJonas Devlieghere bool SBTypeSummary::IsValid() const {
171*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
1727f5237bcSPavel Labath return this->operator bool();
1737f5237bcSPavel Labath }
operator bool() const1747f5237bcSPavel Labath SBTypeSummary::operator bool() const {
175*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
176baf5664fSJonas Devlieghere
177248a1305SKonrad Kleine return m_opaque_sp.get() != nullptr;
178baf5664fSJonas Devlieghere }
179061858ceSEnrico Granata
IsFunctionCode()180b9c1b51eSKate Stone bool SBTypeSummary::IsFunctionCode() {
181*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
182baf5664fSJonas Devlieghere
183061858ceSEnrico Granata if (!IsValid())
184061858ceSEnrico Granata return false;
185b9c1b51eSKate Stone if (ScriptSummaryFormat *script_summary_ptr =
186b9c1b51eSKate Stone llvm::dyn_cast<ScriptSummaryFormat>(m_opaque_sp.get())) {
187061858ceSEnrico Granata const char *ftext = script_summary_ptr->GetPythonScript();
188061858ceSEnrico Granata return (ftext && *ftext != 0);
189061858ceSEnrico Granata }
190061858ceSEnrico Granata return false;
191061858ceSEnrico Granata }
192061858ceSEnrico Granata
IsFunctionName()193b9c1b51eSKate Stone bool SBTypeSummary::IsFunctionName() {
194*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
195baf5664fSJonas Devlieghere
196061858ceSEnrico Granata if (!IsValid())
197061858ceSEnrico Granata return false;
198b9c1b51eSKate Stone if (ScriptSummaryFormat *script_summary_ptr =
199b9c1b51eSKate Stone llvm::dyn_cast<ScriptSummaryFormat>(m_opaque_sp.get())) {
200061858ceSEnrico Granata const char *ftext = script_summary_ptr->GetPythonScript();
201061858ceSEnrico Granata return (!ftext || *ftext == 0);
202061858ceSEnrico Granata }
203061858ceSEnrico Granata return false;
204061858ceSEnrico Granata }
205061858ceSEnrico Granata
IsSummaryString()206b9c1b51eSKate Stone bool SBTypeSummary::IsSummaryString() {
207*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
208baf5664fSJonas Devlieghere
209061858ceSEnrico Granata if (!IsValid())
210061858ceSEnrico Granata return false;
211061858ceSEnrico Granata
212da7cb142SEnrico Granata return m_opaque_sp->GetKind() == TypeSummaryImpl::Kind::eSummaryString;
213061858ceSEnrico Granata }
214061858ceSEnrico Granata
GetData()215b9c1b51eSKate Stone const char *SBTypeSummary::GetData() {
216*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
217baf5664fSJonas Devlieghere
218061858ceSEnrico Granata if (!IsValid())
219248a1305SKonrad Kleine return nullptr;
220b9c1b51eSKate Stone if (ScriptSummaryFormat *script_summary_ptr =
221b9c1b51eSKate Stone llvm::dyn_cast<ScriptSummaryFormat>(m_opaque_sp.get())) {
222061858ceSEnrico Granata const char *fname = script_summary_ptr->GetFunctionName();
223061858ceSEnrico Granata const char *ftext = script_summary_ptr->GetPythonScript();
224061858ceSEnrico Granata if (ftext && *ftext)
225061858ceSEnrico Granata return ftext;
226061858ceSEnrico Granata return fname;
227b9c1b51eSKate Stone } else if (StringSummaryFormat *string_summary_ptr =
228b9c1b51eSKate Stone llvm::dyn_cast<StringSummaryFormat>(m_opaque_sp.get()))
229061858ceSEnrico Granata return string_summary_ptr->GetSummaryString();
230da7cb142SEnrico Granata return nullptr;
231061858ceSEnrico Granata }
232061858ceSEnrico Granata
GetOptions()233b9c1b51eSKate Stone uint32_t SBTypeSummary::GetOptions() {
234*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
235baf5664fSJonas Devlieghere
236061858ceSEnrico Granata if (!IsValid())
237061858ceSEnrico Granata return lldb::eTypeOptionNone;
238061858ceSEnrico Granata return m_opaque_sp->GetOptions();
239061858ceSEnrico Granata }
240061858ceSEnrico Granata
SetOptions(uint32_t value)241b9c1b51eSKate Stone void SBTypeSummary::SetOptions(uint32_t value) {
242*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, value);
243baf5664fSJonas Devlieghere
244061858ceSEnrico Granata if (!CopyOnWrite_Impl())
245061858ceSEnrico Granata return;
246061858ceSEnrico Granata m_opaque_sp->SetOptions(value);
247061858ceSEnrico Granata }
248061858ceSEnrico Granata
SetSummaryString(const char * data)249b9c1b51eSKate Stone void SBTypeSummary::SetSummaryString(const char *data) {
250*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, data);
251baf5664fSJonas Devlieghere
252061858ceSEnrico Granata if (!IsValid())
253061858ceSEnrico Granata return;
254da7cb142SEnrico Granata if (!llvm::isa<StringSummaryFormat>(m_opaque_sp.get()))
255061858ceSEnrico Granata ChangeSummaryType(false);
256b9c1b51eSKate Stone if (StringSummaryFormat *string_summary_ptr =
257b9c1b51eSKate Stone llvm::dyn_cast<StringSummaryFormat>(m_opaque_sp.get()))
258da7cb142SEnrico Granata string_summary_ptr->SetSummaryString(data);
259061858ceSEnrico Granata }
260061858ceSEnrico Granata
SetFunctionName(const char * data)261b9c1b51eSKate Stone void SBTypeSummary::SetFunctionName(const char *data) {
262*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, data);
263baf5664fSJonas Devlieghere
264061858ceSEnrico Granata if (!IsValid())
265061858ceSEnrico Granata return;
266da7cb142SEnrico Granata if (!llvm::isa<ScriptSummaryFormat>(m_opaque_sp.get()))
267061858ceSEnrico Granata ChangeSummaryType(true);
268b9c1b51eSKate Stone if (ScriptSummaryFormat *script_summary_ptr =
269b9c1b51eSKate Stone llvm::dyn_cast<ScriptSummaryFormat>(m_opaque_sp.get()))
270da7cb142SEnrico Granata script_summary_ptr->SetFunctionName(data);
271061858ceSEnrico Granata }
272061858ceSEnrico Granata
SetFunctionCode(const char * data)273b9c1b51eSKate Stone void SBTypeSummary::SetFunctionCode(const char *data) {
274*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, data);
275baf5664fSJonas Devlieghere
276061858ceSEnrico Granata if (!IsValid())
277061858ceSEnrico Granata return;
278da7cb142SEnrico Granata if (!llvm::isa<ScriptSummaryFormat>(m_opaque_sp.get()))
279061858ceSEnrico Granata ChangeSummaryType(true);
280b9c1b51eSKate Stone if (ScriptSummaryFormat *script_summary_ptr =
281b9c1b51eSKate Stone llvm::dyn_cast<ScriptSummaryFormat>(m_opaque_sp.get()))
282da7cb142SEnrico Granata script_summary_ptr->SetPythonScript(data);
283061858ceSEnrico Granata }
284061858ceSEnrico Granata
GetDescription(lldb::SBStream & description,lldb::DescriptionLevel description_level)285b9c1b51eSKate Stone bool SBTypeSummary::GetDescription(lldb::SBStream &description,
286b9c1b51eSKate Stone lldb::DescriptionLevel description_level) {
287*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, description, description_level);
288baf5664fSJonas Devlieghere
289061858ceSEnrico Granata if (!CopyOnWrite_Impl())
290061858ceSEnrico Granata return false;
291061858ceSEnrico Granata else {
292b9c1b51eSKate Stone description.Printf("%s\n", m_opaque_sp->GetDescription().c_str());
293061858ceSEnrico Granata return true;
294061858ceSEnrico Granata }
295061858ceSEnrico Granata }
296061858ceSEnrico Granata
DoesPrintValue(lldb::SBValue value)297b9c1b51eSKate Stone bool SBTypeSummary::DoesPrintValue(lldb::SBValue value) {
298*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, value);
299baf5664fSJonas Devlieghere
30074b8f4cbSDawn Perchik if (!IsValid())
30174b8f4cbSDawn Perchik return false;
30274b8f4cbSDawn Perchik lldb::ValueObjectSP value_sp = value.GetSP();
30374b8f4cbSDawn Perchik return m_opaque_sp->DoesPrintValue(value_sp.get());
30474b8f4cbSDawn Perchik }
30574b8f4cbSDawn Perchik
operator =(const lldb::SBTypeSummary & rhs)306b9c1b51eSKate Stone lldb::SBTypeSummary &SBTypeSummary::operator=(const lldb::SBTypeSummary &rhs) {
307*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs);
308baf5664fSJonas Devlieghere
309b9c1b51eSKate Stone if (this != &rhs) {
310061858ceSEnrico Granata m_opaque_sp = rhs.m_opaque_sp;
311061858ceSEnrico Granata }
312d232abc3SJonas Devlieghere return *this;
313061858ceSEnrico Granata }
314061858ceSEnrico Granata
operator ==(lldb::SBTypeSummary & rhs)315b9c1b51eSKate Stone bool SBTypeSummary::operator==(lldb::SBTypeSummary &rhs) {
316*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs);
317baf5664fSJonas Devlieghere
318a6682a41SJonas Devlieghere if (!IsValid())
319061858ceSEnrico Granata return !rhs.IsValid();
320061858ceSEnrico Granata return m_opaque_sp == rhs.m_opaque_sp;
321061858ceSEnrico Granata }
322061858ceSEnrico Granata
IsEqualTo(lldb::SBTypeSummary & rhs)323b9c1b51eSKate Stone bool SBTypeSummary::IsEqualTo(lldb::SBTypeSummary &rhs) {
324*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs);
325baf5664fSJonas Devlieghere
326b9c1b51eSKate Stone if (IsValid()) {
327204aa1d9SEnrico Granata // valid and invalid are different
328204aa1d9SEnrico Granata if (!rhs.IsValid())
329204aa1d9SEnrico Granata return false;
330b9c1b51eSKate Stone } else {
331204aa1d9SEnrico Granata // invalid and valid are different
332204aa1d9SEnrico Granata if (rhs.IsValid())
333204aa1d9SEnrico Granata return false;
334204aa1d9SEnrico Granata else
335204aa1d9SEnrico Granata // both invalid are the same
336204aa1d9SEnrico Granata return true;
337204aa1d9SEnrico Granata }
338061858ceSEnrico Granata
339da7cb142SEnrico Granata if (m_opaque_sp->GetKind() != rhs.m_opaque_sp->GetKind())
3403467d80bSEnrico Granata return false;
3413467d80bSEnrico Granata
342b9c1b51eSKate Stone switch (m_opaque_sp->GetKind()) {
343da7cb142SEnrico Granata case TypeSummaryImpl::Kind::eCallback:
344b9c1b51eSKate Stone return llvm::dyn_cast<CXXFunctionSummaryFormat>(m_opaque_sp.get()) ==
345b9c1b51eSKate Stone llvm::dyn_cast<CXXFunctionSummaryFormat>(rhs.m_opaque_sp.get());
346da7cb142SEnrico Granata case TypeSummaryImpl::Kind::eScript:
347061858ceSEnrico Granata if (IsFunctionCode() != rhs.IsFunctionCode())
348061858ceSEnrico Granata return false;
349061858ceSEnrico Granata if (IsFunctionName() != rhs.IsFunctionName())
350061858ceSEnrico Granata return false;
351061858ceSEnrico Granata return GetOptions() == rhs.GetOptions();
352da7cb142SEnrico Granata case TypeSummaryImpl::Kind::eSummaryString:
353da7cb142SEnrico Granata if (IsSummaryString() != rhs.IsSummaryString())
354da7cb142SEnrico Granata return false;
355da7cb142SEnrico Granata return GetOptions() == rhs.GetOptions();
356204aa1d9SEnrico Granata case TypeSummaryImpl::Kind::eInternal:
357204aa1d9SEnrico Granata return (m_opaque_sp.get() == rhs.m_opaque_sp.get());
358da7cb142SEnrico Granata }
359061858ceSEnrico Granata
360da7cb142SEnrico Granata return false;
361061858ceSEnrico Granata }
362061858ceSEnrico Granata
operator !=(lldb::SBTypeSummary & rhs)363b9c1b51eSKate Stone bool SBTypeSummary::operator!=(lldb::SBTypeSummary &rhs) {
364*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs);
365baf5664fSJonas Devlieghere
366a6682a41SJonas Devlieghere if (!IsValid())
367061858ceSEnrico Granata return !rhs.IsValid();
368061858ceSEnrico Granata return m_opaque_sp != rhs.m_opaque_sp;
369061858ceSEnrico Granata }
370061858ceSEnrico Granata
GetSP()371b9c1b51eSKate Stone lldb::TypeSummaryImplSP SBTypeSummary::GetSP() { return m_opaque_sp; }
372061858ceSEnrico Granata
SetSP(const lldb::TypeSummaryImplSP & typesummary_impl_sp)373b9c1b51eSKate Stone void SBTypeSummary::SetSP(const lldb::TypeSummaryImplSP &typesummary_impl_sp) {
374061858ceSEnrico Granata m_opaque_sp = typesummary_impl_sp;
375061858ceSEnrico Granata }
376061858ceSEnrico Granata
SBTypeSummary(const lldb::TypeSummaryImplSP & typesummary_impl_sp)377b9c1b51eSKate Stone SBTypeSummary::SBTypeSummary(const lldb::TypeSummaryImplSP &typesummary_impl_sp)
378b9c1b51eSKate Stone : m_opaque_sp(typesummary_impl_sp) {}
379061858ceSEnrico Granata
CopyOnWrite_Impl()380b9c1b51eSKate Stone bool SBTypeSummary::CopyOnWrite_Impl() {
381061858ceSEnrico Granata if (!IsValid())
382061858ceSEnrico Granata return false;
3833467d80bSEnrico Granata
384061858ceSEnrico Granata if (m_opaque_sp.unique())
385061858ceSEnrico Granata return true;
386061858ceSEnrico Granata
387061858ceSEnrico Granata TypeSummaryImplSP new_sp;
388061858ceSEnrico Granata
389b9c1b51eSKate Stone if (CXXFunctionSummaryFormat *current_summary_ptr =
390b9c1b51eSKate Stone llvm::dyn_cast<CXXFunctionSummaryFormat>(m_opaque_sp.get())) {
391b9c1b51eSKate Stone new_sp = TypeSummaryImplSP(new CXXFunctionSummaryFormat(
392b9c1b51eSKate Stone GetOptions(), current_summary_ptr->m_impl,
3933467d80bSEnrico Granata current_summary_ptr->m_description.c_str()));
394b9c1b51eSKate Stone } else if (ScriptSummaryFormat *current_summary_ptr =
395b9c1b51eSKate Stone llvm::dyn_cast<ScriptSummaryFormat>(m_opaque_sp.get())) {
396b9c1b51eSKate Stone new_sp = TypeSummaryImplSP(new ScriptSummaryFormat(
397b9c1b51eSKate Stone GetOptions(), current_summary_ptr->GetFunctionName(),
398061858ceSEnrico Granata current_summary_ptr->GetPythonScript()));
399b9c1b51eSKate Stone } else if (StringSummaryFormat *current_summary_ptr =
400b9c1b51eSKate Stone llvm::dyn_cast<StringSummaryFormat>(m_opaque_sp.get())) {
401b9c1b51eSKate Stone new_sp = TypeSummaryImplSP(new StringSummaryFormat(
402b9c1b51eSKate Stone GetOptions(), current_summary_ptr->GetSummaryString()));
403061858ceSEnrico Granata }
404061858ceSEnrico Granata
405061858ceSEnrico Granata SetSP(new_sp);
406061858ceSEnrico Granata
407da7cb142SEnrico Granata return nullptr != new_sp.get();
408061858ceSEnrico Granata }
409061858ceSEnrico Granata
ChangeSummaryType(bool want_script)410b9c1b51eSKate Stone bool SBTypeSummary::ChangeSummaryType(bool want_script) {
411061858ceSEnrico Granata if (!IsValid())
412061858ceSEnrico Granata return false;
413061858ceSEnrico Granata
414061858ceSEnrico Granata TypeSummaryImplSP new_sp;
415061858ceSEnrico Granata
416b9c1b51eSKate Stone if (want_script ==
417b9c1b51eSKate Stone (m_opaque_sp->GetKind() == TypeSummaryImpl::Kind::eScript)) {
418b9c1b51eSKate Stone if (m_opaque_sp->GetKind() ==
419b9c1b51eSKate Stone lldb_private::TypeSummaryImpl::Kind::eCallback &&
420b9c1b51eSKate Stone !want_script)
4213467d80bSEnrico Granata new_sp = TypeSummaryImplSP(new StringSummaryFormat(GetOptions(), ""));
4223467d80bSEnrico Granata else
4233467d80bSEnrico Granata return CopyOnWrite_Impl();
4243467d80bSEnrico Granata }
4253467d80bSEnrico Granata
426b9c1b51eSKate Stone if (!new_sp) {
427061858ceSEnrico Granata if (want_script)
428061858ceSEnrico Granata new_sp = TypeSummaryImplSP(new ScriptSummaryFormat(GetOptions(), "", ""));
429061858ceSEnrico Granata else
430061858ceSEnrico Granata new_sp = TypeSummaryImplSP(new StringSummaryFormat(GetOptions(), ""));
4313467d80bSEnrico Granata }
432061858ceSEnrico Granata
433061858ceSEnrico Granata SetSP(new_sp);
434061858ceSEnrico Granata
435061858ceSEnrico Granata return true;
436061858ceSEnrico Granata }
437