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/lldb-python.h"
12 #include "lldb/API/SBTypeSummary.h"
14 #include "lldb/API/SBStream.h"
16 #include "lldb/DataFormatters/DataVisualization.h"
19 using namespace lldb_private;
21 #ifndef LLDB_DISABLE_PYTHON
23 SBTypeSummary::SBTypeSummary() :
29 SBTypeSummary::CreateWithSummaryString (const char* data, uint32_t options)
31 if (!data || data[0] == 0)
32 return SBTypeSummary();
34 return SBTypeSummary(TypeSummaryImplSP(new StringSummaryFormat(options, data)));
38 SBTypeSummary::CreateWithFunctionName (const char* data, uint32_t options)
40 if (!data || data[0] == 0)
41 return SBTypeSummary();
43 return SBTypeSummary(TypeSummaryImplSP(new ScriptSummaryFormat(options, data)));
47 SBTypeSummary::CreateWithScriptCode (const char* data, uint32_t options)
49 if (!data || data[0] == 0)
50 return SBTypeSummary();
52 return SBTypeSummary(TypeSummaryImplSP(new ScriptSummaryFormat(options, "", data)));
55 SBTypeSummary::SBTypeSummary (const lldb::SBTypeSummary &rhs) :
56 m_opaque_sp(rhs.m_opaque_sp)
60 SBTypeSummary::~SBTypeSummary ()
65 SBTypeSummary::IsValid() const
67 return m_opaque_sp.get() != NULL;
71 SBTypeSummary::IsFunctionCode()
75 if (m_opaque_sp->IsScripted())
77 ScriptSummaryFormat* script_summary_ptr = (ScriptSummaryFormat*)m_opaque_sp.get();
78 const char* ftext = script_summary_ptr->GetPythonScript();
79 return (ftext && *ftext != 0);
85 SBTypeSummary::IsFunctionName()
89 if (m_opaque_sp->IsScripted())
91 ScriptSummaryFormat* script_summary_ptr = (ScriptSummaryFormat*)m_opaque_sp.get();
92 const char* ftext = script_summary_ptr->GetPythonScript();
93 return (!ftext || *ftext == 0);
99 SBTypeSummary::IsSummaryString()
104 if (m_opaque_sp->GetType() == lldb_private::TypeSummaryImpl::eTypeCallback)
107 return !m_opaque_sp->IsScripted();
111 SBTypeSummary::GetData ()
115 if (m_opaque_sp->GetType() == lldb_private::TypeSummaryImpl::eTypeCallback)
117 if (m_opaque_sp->IsScripted())
119 ScriptSummaryFormat* script_summary_ptr = (ScriptSummaryFormat*)m_opaque_sp.get();
120 const char* fname = script_summary_ptr->GetFunctionName();
121 const char* ftext = script_summary_ptr->GetPythonScript();
128 StringSummaryFormat* string_summary_ptr = (StringSummaryFormat*)m_opaque_sp.get();
129 return string_summary_ptr->GetSummaryString();
134 SBTypeSummary::GetOptions ()
137 return lldb::eTypeOptionNone;
138 return m_opaque_sp->GetOptions();
142 SBTypeSummary::SetOptions (uint32_t value)
144 if (!CopyOnWrite_Impl())
146 m_opaque_sp->SetOptions(value);
150 SBTypeSummary::SetSummaryString (const char* data)
154 if (m_opaque_sp->IsScripted() || (m_opaque_sp->GetType() == lldb_private::TypeSummaryImpl::eTypeCallback))
155 ChangeSummaryType(false);
156 ((StringSummaryFormat*)m_opaque_sp.get())->SetSummaryString(data);
160 SBTypeSummary::SetFunctionName (const char* data)
164 if (!m_opaque_sp->IsScripted())
165 ChangeSummaryType(true);
166 ((ScriptSummaryFormat*)m_opaque_sp.get())->SetFunctionName(data);
170 SBTypeSummary::SetFunctionCode (const char* data)
174 if (!m_opaque_sp->IsScripted())
175 ChangeSummaryType(true);
176 ((ScriptSummaryFormat*)m_opaque_sp.get())->SetPythonScript(data);
180 SBTypeSummary::GetDescription (lldb::SBStream &description,
181 lldb::DescriptionLevel description_level)
183 if (!CopyOnWrite_Impl())
186 description.Printf("%s\n",
187 m_opaque_sp->GetDescription().c_str());
192 lldb::SBTypeSummary &
193 SBTypeSummary::operator = (const lldb::SBTypeSummary &rhs)
197 m_opaque_sp = rhs.m_opaque_sp;
203 SBTypeSummary::operator == (lldb::SBTypeSummary &rhs)
205 if (IsValid() == false)
206 return !rhs.IsValid();
207 return m_opaque_sp == rhs.m_opaque_sp;
211 SBTypeSummary::IsEqualTo (lldb::SBTypeSummary &rhs)
213 if (IsValid() == false)
214 return !rhs.IsValid();
216 if (m_opaque_sp->GetType() != rhs.m_opaque_sp->GetType())
219 if (m_opaque_sp->GetType() == lldb_private::TypeSummaryImpl::eTypeCallback)
221 lldb_private::CXXFunctionSummaryFormat *self_cxx = (lldb_private::CXXFunctionSummaryFormat*)m_opaque_sp.get();
222 lldb_private::CXXFunctionSummaryFormat *other_cxx = (lldb_private::CXXFunctionSummaryFormat*)rhs.m_opaque_sp.get();
223 return (self_cxx->m_impl == other_cxx->m_impl);
226 if (m_opaque_sp->IsScripted() != rhs.m_opaque_sp->IsScripted())
229 if (IsFunctionCode() != rhs.IsFunctionCode())
232 if (IsSummaryString() != rhs.IsSummaryString())
235 if (IsFunctionName() != rhs.IsFunctionName())
238 if ( GetData() == NULL || rhs.GetData() == NULL || strcmp(GetData(), rhs.GetData()) )
241 return GetOptions() == rhs.GetOptions();
246 SBTypeSummary::operator != (lldb::SBTypeSummary &rhs)
248 if (IsValid() == false)
249 return !rhs.IsValid();
250 return m_opaque_sp != rhs.m_opaque_sp;
253 lldb::TypeSummaryImplSP
254 SBTypeSummary::GetSP ()
260 SBTypeSummary::SetSP (const lldb::TypeSummaryImplSP &typesummary_impl_sp)
262 m_opaque_sp = typesummary_impl_sp;
265 SBTypeSummary::SBTypeSummary (const lldb::TypeSummaryImplSP &typesummary_impl_sp) :
266 m_opaque_sp(typesummary_impl_sp)
271 SBTypeSummary::CopyOnWrite_Impl()
276 if (m_opaque_sp.unique())
279 TypeSummaryImplSP new_sp;
281 if (m_opaque_sp->GetType() == lldb_private::TypeSummaryImpl::eTypeCallback)
283 CXXFunctionSummaryFormat* current_summary_ptr = (CXXFunctionSummaryFormat*)m_opaque_sp.get();
284 new_sp = TypeSummaryImplSP(new CXXFunctionSummaryFormat(GetOptions(),
285 current_summary_ptr->m_impl,
286 current_summary_ptr->m_description.c_str()));
288 else if (m_opaque_sp->IsScripted())
290 ScriptSummaryFormat* current_summary_ptr = (ScriptSummaryFormat*)m_opaque_sp.get();
291 new_sp = TypeSummaryImplSP(new ScriptSummaryFormat(GetOptions(),
292 current_summary_ptr->GetFunctionName(),
293 current_summary_ptr->GetPythonScript()));
296 StringSummaryFormat* current_summary_ptr = (StringSummaryFormat*)m_opaque_sp.get();
297 new_sp = TypeSummaryImplSP(new StringSummaryFormat(GetOptions(),
298 current_summary_ptr->GetSummaryString()));
307 SBTypeSummary::ChangeSummaryType (bool want_script)
312 TypeSummaryImplSP new_sp;
314 if (want_script == m_opaque_sp->IsScripted())
316 if (m_opaque_sp->GetType() == lldb_private::TypeSummaryImpl::eTypeCallback && !want_script)
317 new_sp = TypeSummaryImplSP(new StringSummaryFormat(GetOptions(), ""));
319 return CopyOnWrite_Impl();
325 new_sp = TypeSummaryImplSP(new ScriptSummaryFormat(GetOptions(), "", ""));
327 new_sp = TypeSummaryImplSP(new StringSummaryFormat(GetOptions(), ""));
335 #endif // LLDB_DISABLE_PYTHON