180814287SRaphael Isemann //===-- SBTypeSynthetic.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/SBTypeSynthetic.h"
10*1755f5b1SJonas Devlieghere #include "lldb/Utility/Instrumentation.h"
11061858ceSEnrico Granata 
12061858ceSEnrico Granata #include "lldb/API/SBStream.h"
13061858ceSEnrico Granata 
145548cb50SEnrico Granata #include "lldb/DataFormatters/DataVisualization.h"
15061858ceSEnrico Granata 
16061858ceSEnrico Granata using namespace lldb;
17061858ceSEnrico Granata using namespace lldb_private;
18061858ceSEnrico Granata 
SBTypeSynthetic()19*1755f5b1SJonas Devlieghere SBTypeSynthetic::SBTypeSynthetic() { LLDB_INSTRUMENT_VA(this); }
20061858ceSEnrico Granata 
CreateWithClassName(const char * data,uint32_t options)21b9c1b51eSKate Stone SBTypeSynthetic SBTypeSynthetic::CreateWithClassName(const char *data,
22b9c1b51eSKate Stone                                                      uint32_t options) {
23*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(data, options);
24baf5664fSJonas Devlieghere 
25061858ceSEnrico Granata   if (!data || data[0] == 0)
26d232abc3SJonas Devlieghere     return SBTypeSynthetic();
27d232abc3SJonas Devlieghere   return SBTypeSynthetic(ScriptedSyntheticChildrenSP(
28d232abc3SJonas Devlieghere       new ScriptedSyntheticChildren(options, data, "")));
29061858ceSEnrico Granata }
30061858ceSEnrico Granata 
CreateWithScriptCode(const char * data,uint32_t options)31b9c1b51eSKate Stone SBTypeSynthetic SBTypeSynthetic::CreateWithScriptCode(const char *data,
32b9c1b51eSKate Stone                                                       uint32_t options) {
33*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(data, options);
34baf5664fSJonas Devlieghere 
35061858ceSEnrico Granata   if (!data || data[0] == 0)
36d232abc3SJonas Devlieghere     return SBTypeSynthetic();
37d232abc3SJonas Devlieghere   return SBTypeSynthetic(ScriptedSyntheticChildrenSP(
38d232abc3SJonas Devlieghere       new ScriptedSyntheticChildren(options, "", data)));
39061858ceSEnrico Granata }
40061858ceSEnrico Granata 
SBTypeSynthetic(const lldb::SBTypeSynthetic & rhs)41b9c1b51eSKate Stone SBTypeSynthetic::SBTypeSynthetic(const lldb::SBTypeSynthetic &rhs)
42baf5664fSJonas Devlieghere     : m_opaque_sp(rhs.m_opaque_sp) {
43*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
44baf5664fSJonas Devlieghere }
45061858ceSEnrico Granata 
46866b7a65SJonas Devlieghere SBTypeSynthetic::~SBTypeSynthetic() = default;
47061858ceSEnrico Granata 
IsValid() const48baf5664fSJonas Devlieghere bool SBTypeSynthetic::IsValid() const {
49*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
507f5237bcSPavel Labath   return this->operator bool();
517f5237bcSPavel Labath }
operator bool() const527f5237bcSPavel Labath SBTypeSynthetic::operator bool() const {
53*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
54baf5664fSJonas Devlieghere 
55248a1305SKonrad Kleine   return m_opaque_sp.get() != nullptr;
56baf5664fSJonas Devlieghere }
57061858ceSEnrico Granata 
IsClassCode()58b9c1b51eSKate Stone bool SBTypeSynthetic::IsClassCode() {
59*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
60baf5664fSJonas Devlieghere 
61061858ceSEnrico Granata   if (!IsValid())
62061858ceSEnrico Granata     return false;
63061858ceSEnrico Granata   const char *code = m_opaque_sp->GetPythonCode();
64061858ceSEnrico Granata   return (code && *code);
65061858ceSEnrico Granata }
66061858ceSEnrico Granata 
IsClassName()67b9c1b51eSKate Stone bool SBTypeSynthetic::IsClassName() {
68*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
69baf5664fSJonas Devlieghere 
70061858ceSEnrico Granata   if (!IsValid())
71061858ceSEnrico Granata     return false;
72061858ceSEnrico Granata   return !IsClassCode();
73061858ceSEnrico Granata }
74061858ceSEnrico Granata 
GetData()75b9c1b51eSKate Stone const char *SBTypeSynthetic::GetData() {
76*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
77baf5664fSJonas Devlieghere 
78061858ceSEnrico Granata   if (!IsValid())
79248a1305SKonrad Kleine     return nullptr;
80061858ceSEnrico Granata   if (IsClassCode())
81061858ceSEnrico Granata     return m_opaque_sp->GetPythonCode();
82061858ceSEnrico Granata   else
83061858ceSEnrico Granata     return m_opaque_sp->GetPythonClassName();
84061858ceSEnrico Granata }
85061858ceSEnrico Granata 
SetClassName(const char * data)86b9c1b51eSKate Stone void SBTypeSynthetic::SetClassName(const char *data) {
87*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, data);
88baf5664fSJonas Devlieghere 
89061858ceSEnrico Granata   if (IsValid() && data && *data)
90061858ceSEnrico Granata     m_opaque_sp->SetPythonClassName(data);
91061858ceSEnrico Granata }
92061858ceSEnrico Granata 
SetClassCode(const char * data)93b9c1b51eSKate Stone void SBTypeSynthetic::SetClassCode(const char *data) {
94*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, data);
95baf5664fSJonas Devlieghere 
96061858ceSEnrico Granata   if (IsValid() && data && *data)
97061858ceSEnrico Granata     m_opaque_sp->SetPythonCode(data);
98061858ceSEnrico Granata }
99061858ceSEnrico Granata 
GetOptions()100b9c1b51eSKate Stone uint32_t SBTypeSynthetic::GetOptions() {
101*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
102baf5664fSJonas Devlieghere 
103061858ceSEnrico Granata   if (!IsValid())
104061858ceSEnrico Granata     return lldb::eTypeOptionNone;
105061858ceSEnrico Granata   return m_opaque_sp->GetOptions();
106061858ceSEnrico Granata }
107061858ceSEnrico Granata 
SetOptions(uint32_t value)108b9c1b51eSKate Stone void SBTypeSynthetic::SetOptions(uint32_t value) {
109*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, value);
110baf5664fSJonas Devlieghere 
111061858ceSEnrico Granata   if (!CopyOnWrite_Impl())
112061858ceSEnrico Granata     return;
113061858ceSEnrico Granata   m_opaque_sp->SetOptions(value);
114061858ceSEnrico Granata }
115061858ceSEnrico Granata 
GetDescription(lldb::SBStream & description,lldb::DescriptionLevel description_level)116b9c1b51eSKate Stone bool SBTypeSynthetic::GetDescription(lldb::SBStream &description,
117b9c1b51eSKate Stone                                      lldb::DescriptionLevel description_level) {
118*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, description, description_level);
119baf5664fSJonas Devlieghere 
120b9c1b51eSKate Stone   if (m_opaque_sp) {
121b9c1b51eSKate Stone     description.Printf("%s\n", m_opaque_sp->GetDescription().c_str());
122061858ceSEnrico Granata     return true;
123061858ceSEnrico Granata   }
124e34ade79SEnrico Granata   return false;
125061858ceSEnrico Granata }
126061858ceSEnrico Granata 
127b9c1b51eSKate Stone lldb::SBTypeSynthetic &SBTypeSynthetic::
operator =(const lldb::SBTypeSynthetic & rhs)128b9c1b51eSKate Stone operator=(const lldb::SBTypeSynthetic &rhs) {
129*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
130baf5664fSJonas Devlieghere 
131b9c1b51eSKate Stone   if (this != &rhs) {
132061858ceSEnrico Granata     m_opaque_sp = rhs.m_opaque_sp;
133061858ceSEnrico Granata   }
134d232abc3SJonas Devlieghere   return *this;
135061858ceSEnrico Granata }
136061858ceSEnrico Granata 
operator ==(lldb::SBTypeSynthetic & rhs)137b9c1b51eSKate Stone bool SBTypeSynthetic::operator==(lldb::SBTypeSynthetic &rhs) {
138*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
139baf5664fSJonas Devlieghere 
140a6682a41SJonas Devlieghere   if (!IsValid())
141061858ceSEnrico Granata     return !rhs.IsValid();
142061858ceSEnrico Granata   return m_opaque_sp == rhs.m_opaque_sp;
143061858ceSEnrico Granata }
144061858ceSEnrico Granata 
IsEqualTo(lldb::SBTypeSynthetic & rhs)145b9c1b51eSKate Stone bool SBTypeSynthetic::IsEqualTo(lldb::SBTypeSynthetic &rhs) {
146*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
147baf5664fSJonas Devlieghere 
148a6682a41SJonas Devlieghere   if (!IsValid())
149061858ceSEnrico Granata     return !rhs.IsValid();
150061858ceSEnrico Granata 
151061858ceSEnrico Granata   if (m_opaque_sp->IsScripted() != rhs.m_opaque_sp->IsScripted())
152061858ceSEnrico Granata     return false;
153061858ceSEnrico Granata 
154061858ceSEnrico Granata   if (IsClassCode() != rhs.IsClassCode())
155061858ceSEnrico Granata     return false;
156061858ceSEnrico Granata 
157061858ceSEnrico Granata   if (strcmp(GetData(), rhs.GetData()))
158061858ceSEnrico Granata     return false;
159061858ceSEnrico Granata 
160061858ceSEnrico Granata   return GetOptions() == rhs.GetOptions();
161061858ceSEnrico Granata }
162061858ceSEnrico Granata 
operator !=(lldb::SBTypeSynthetic & rhs)163b9c1b51eSKate Stone bool SBTypeSynthetic::operator!=(lldb::SBTypeSynthetic &rhs) {
164*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
165baf5664fSJonas Devlieghere 
166a6682a41SJonas Devlieghere   if (!IsValid())
167061858ceSEnrico Granata     return !rhs.IsValid();
168061858ceSEnrico Granata   return m_opaque_sp != rhs.m_opaque_sp;
169061858ceSEnrico Granata }
170061858ceSEnrico Granata 
GetSP()171b9c1b51eSKate Stone lldb::ScriptedSyntheticChildrenSP SBTypeSynthetic::GetSP() {
172061858ceSEnrico Granata   return m_opaque_sp;
173061858ceSEnrico Granata }
174061858ceSEnrico Granata 
SetSP(const lldb::ScriptedSyntheticChildrenSP & TypeSynthetic_impl_sp)175b9c1b51eSKate Stone void SBTypeSynthetic::SetSP(
176b9c1b51eSKate Stone     const lldb::ScriptedSyntheticChildrenSP &TypeSynthetic_impl_sp) {
177061858ceSEnrico Granata   m_opaque_sp = TypeSynthetic_impl_sp;
178061858ceSEnrico Granata }
179061858ceSEnrico Granata 
SBTypeSynthetic(const lldb::ScriptedSyntheticChildrenSP & TypeSynthetic_impl_sp)180b9c1b51eSKate Stone SBTypeSynthetic::SBTypeSynthetic(
181b9c1b51eSKate Stone     const lldb::ScriptedSyntheticChildrenSP &TypeSynthetic_impl_sp)
182b9c1b51eSKate Stone     : m_opaque_sp(TypeSynthetic_impl_sp) {}
183061858ceSEnrico Granata 
CopyOnWrite_Impl()184b9c1b51eSKate Stone bool SBTypeSynthetic::CopyOnWrite_Impl() {
185061858ceSEnrico Granata   if (!IsValid())
186061858ceSEnrico Granata     return false;
187061858ceSEnrico Granata   if (m_opaque_sp.unique())
188061858ceSEnrico Granata     return true;
189061858ceSEnrico Granata 
190b9c1b51eSKate Stone   ScriptedSyntheticChildrenSP new_sp(new ScriptedSyntheticChildren(
191b9c1b51eSKate Stone       m_opaque_sp->GetOptions(), m_opaque_sp->GetPythonClassName(),
192061858ceSEnrico Granata       m_opaque_sp->GetPythonCode()));
193061858ceSEnrico Granata 
194061858ceSEnrico Granata   SetSP(new_sp);
195061858ceSEnrico Granata 
196061858ceSEnrico Granata   return true;
197061858ceSEnrico Granata }
198