1254721Semaste//===-- SBTypeSummary.cpp -----------------------------------------*- C++ -*-===//
2254721Semaste//
3254721Semaste//                     The LLVM Compiler Infrastructure
4254721Semaste//
5254721Semaste// This file is distributed under the University of Illinois Open Source
6254721Semaste// License. See LICENSE.TXT for details.
7254721Semaste//
8254721Semaste//===----------------------------------------------------------------------===//
9254721Semaste
10254721Semaste#include "lldb/lldb-python.h"
11254721Semaste
12254721Semaste#include "lldb/API/SBTypeSummary.h"
13254721Semaste
14254721Semaste#include "lldb/API/SBStream.h"
15254721Semaste
16254721Semaste#include "lldb/DataFormatters/DataVisualization.h"
17254721Semaste
18254721Semasteusing namespace lldb;
19254721Semasteusing namespace lldb_private;
20254721Semaste
21254721Semaste#ifndef LLDB_DISABLE_PYTHON
22254721Semaste
23254721SemasteSBTypeSummary::SBTypeSummary() :
24254721Semastem_opaque_sp()
25254721Semaste{
26254721Semaste}
27254721Semaste
28254721SemasteSBTypeSummary
29254721SemasteSBTypeSummary::CreateWithSummaryString (const char* data, uint32_t options)
30254721Semaste{
31254721Semaste    if (!data || data[0] == 0)
32254721Semaste        return SBTypeSummary();
33254721Semaste
34254721Semaste    return SBTypeSummary(TypeSummaryImplSP(new StringSummaryFormat(options, data)));
35254721Semaste}
36254721Semaste
37254721SemasteSBTypeSummary
38254721SemasteSBTypeSummary::CreateWithFunctionName (const char* data, uint32_t options)
39254721Semaste{
40254721Semaste    if (!data || data[0] == 0)
41254721Semaste        return SBTypeSummary();
42254721Semaste
43254721Semaste    return SBTypeSummary(TypeSummaryImplSP(new ScriptSummaryFormat(options, data)));
44254721Semaste}
45254721Semaste
46254721SemasteSBTypeSummary
47254721SemasteSBTypeSummary::CreateWithScriptCode (const char* data, uint32_t options)
48254721Semaste{
49254721Semaste    if (!data || data[0] == 0)
50254721Semaste        return SBTypeSummary();
51254721Semaste
52254721Semaste    return SBTypeSummary(TypeSummaryImplSP(new ScriptSummaryFormat(options, "", data)));
53254721Semaste}
54254721Semaste
55254721SemasteSBTypeSummary::SBTypeSummary (const lldb::SBTypeSummary &rhs) :
56254721Semastem_opaque_sp(rhs.m_opaque_sp)
57254721Semaste{
58254721Semaste}
59254721Semaste
60254721SemasteSBTypeSummary::~SBTypeSummary ()
61254721Semaste{
62254721Semaste}
63254721Semaste
64254721Semastebool
65254721SemasteSBTypeSummary::IsValid() const
66254721Semaste{
67254721Semaste    return m_opaque_sp.get() != NULL;
68254721Semaste}
69254721Semaste
70254721Semastebool
71254721SemasteSBTypeSummary::IsFunctionCode()
72254721Semaste{
73254721Semaste    if (!IsValid())
74254721Semaste        return false;
75254721Semaste    if (m_opaque_sp->IsScripted())
76254721Semaste    {
77254721Semaste        ScriptSummaryFormat* script_summary_ptr = (ScriptSummaryFormat*)m_opaque_sp.get();
78254721Semaste        const char* ftext = script_summary_ptr->GetPythonScript();
79254721Semaste        return (ftext && *ftext != 0);
80254721Semaste    }
81254721Semaste    return false;
82254721Semaste}
83254721Semaste
84254721Semastebool
85254721SemasteSBTypeSummary::IsFunctionName()
86254721Semaste{
87254721Semaste    if (!IsValid())
88254721Semaste        return false;
89254721Semaste    if (m_opaque_sp->IsScripted())
90254721Semaste    {
91254721Semaste        ScriptSummaryFormat* script_summary_ptr = (ScriptSummaryFormat*)m_opaque_sp.get();
92254721Semaste        const char* ftext = script_summary_ptr->GetPythonScript();
93254721Semaste        return (!ftext || *ftext == 0);
94254721Semaste    }
95254721Semaste    return false;
96254721Semaste}
97254721Semaste
98254721Semastebool
99254721SemasteSBTypeSummary::IsSummaryString()
100254721Semaste{
101254721Semaste    if (!IsValid())
102254721Semaste        return false;
103254721Semaste
104254721Semaste    if (m_opaque_sp->GetType() == lldb_private::TypeSummaryImpl::eTypeCallback)
105254721Semaste        return false;
106254721Semaste
107254721Semaste    return !m_opaque_sp->IsScripted();
108254721Semaste}
109254721Semaste
110254721Semasteconst char*
111254721SemasteSBTypeSummary::GetData ()
112254721Semaste{
113254721Semaste    if (!IsValid())
114254721Semaste        return NULL;
115254721Semaste    if (m_opaque_sp->GetType() == lldb_private::TypeSummaryImpl::eTypeCallback)
116254721Semaste        return NULL;
117254721Semaste    if (m_opaque_sp->IsScripted())
118254721Semaste    {
119254721Semaste        ScriptSummaryFormat* script_summary_ptr = (ScriptSummaryFormat*)m_opaque_sp.get();
120254721Semaste        const char* fname = script_summary_ptr->GetFunctionName();
121254721Semaste        const char* ftext = script_summary_ptr->GetPythonScript();
122254721Semaste        if (ftext && *ftext)
123254721Semaste            return ftext;
124254721Semaste        return fname;
125254721Semaste    }
126254721Semaste    else
127254721Semaste    {
128254721Semaste        StringSummaryFormat* string_summary_ptr = (StringSummaryFormat*)m_opaque_sp.get();
129254721Semaste        return string_summary_ptr->GetSummaryString();
130254721Semaste    }
131254721Semaste}
132254721Semaste
133254721Semasteuint32_t
134254721SemasteSBTypeSummary::GetOptions ()
135254721Semaste{
136254721Semaste    if (!IsValid())
137254721Semaste        return lldb::eTypeOptionNone;
138254721Semaste    return m_opaque_sp->GetOptions();
139254721Semaste}
140254721Semaste
141254721Semastevoid
142254721SemasteSBTypeSummary::SetOptions (uint32_t value)
143254721Semaste{
144254721Semaste    if (!CopyOnWrite_Impl())
145254721Semaste        return;
146254721Semaste    m_opaque_sp->SetOptions(value);
147254721Semaste}
148254721Semaste
149254721Semastevoid
150254721SemasteSBTypeSummary::SetSummaryString (const char* data)
151254721Semaste{
152254721Semaste    if (!IsValid())
153254721Semaste        return;
154254721Semaste    if (m_opaque_sp->IsScripted() || (m_opaque_sp->GetType() == lldb_private::TypeSummaryImpl::eTypeCallback))
155254721Semaste        ChangeSummaryType(false);
156254721Semaste    ((StringSummaryFormat*)m_opaque_sp.get())->SetSummaryString(data);
157254721Semaste}
158254721Semaste
159254721Semastevoid
160254721SemasteSBTypeSummary::SetFunctionName (const char* data)
161254721Semaste{
162254721Semaste    if (!IsValid())
163254721Semaste        return;
164254721Semaste    if (!m_opaque_sp->IsScripted())
165254721Semaste        ChangeSummaryType(true);
166254721Semaste    ((ScriptSummaryFormat*)m_opaque_sp.get())->SetFunctionName(data);
167254721Semaste}
168254721Semaste
169254721Semastevoid
170254721SemasteSBTypeSummary::SetFunctionCode (const char* data)
171254721Semaste{
172254721Semaste    if (!IsValid())
173254721Semaste        return;
174254721Semaste    if (!m_opaque_sp->IsScripted())
175254721Semaste        ChangeSummaryType(true);
176254721Semaste    ((ScriptSummaryFormat*)m_opaque_sp.get())->SetPythonScript(data);
177254721Semaste}
178254721Semaste
179254721Semastebool
180254721SemasteSBTypeSummary::GetDescription (lldb::SBStream &description,
181254721Semaste                              lldb::DescriptionLevel description_level)
182254721Semaste{
183254721Semaste    if (!CopyOnWrite_Impl())
184254721Semaste        return false;
185254721Semaste    else {
186254721Semaste        description.Printf("%s\n",
187254721Semaste                           m_opaque_sp->GetDescription().c_str());
188254721Semaste        return true;
189254721Semaste    }
190254721Semaste}
191254721Semaste
192254721Semastelldb::SBTypeSummary &
193254721SemasteSBTypeSummary::operator = (const lldb::SBTypeSummary &rhs)
194254721Semaste{
195254721Semaste    if (this != &rhs)
196254721Semaste    {
197254721Semaste        m_opaque_sp = rhs.m_opaque_sp;
198254721Semaste    }
199254721Semaste    return *this;
200254721Semaste}
201254721Semaste
202254721Semastebool
203254721SemasteSBTypeSummary::operator == (lldb::SBTypeSummary &rhs)
204254721Semaste{
205254721Semaste    if (IsValid() == false)
206254721Semaste        return !rhs.IsValid();
207254721Semaste    return m_opaque_sp == rhs.m_opaque_sp;
208254721Semaste}
209254721Semaste
210254721Semastebool
211254721SemasteSBTypeSummary::IsEqualTo (lldb::SBTypeSummary &rhs)
212254721Semaste{
213254721Semaste    if (IsValid() == false)
214254721Semaste        return !rhs.IsValid();
215254721Semaste
216254721Semaste    if (m_opaque_sp->GetType() != rhs.m_opaque_sp->GetType())
217254721Semaste        return false;
218254721Semaste
219254721Semaste    if (m_opaque_sp->GetType() == lldb_private::TypeSummaryImpl::eTypeCallback)
220254721Semaste    {
221254721Semaste        lldb_private::CXXFunctionSummaryFormat *self_cxx = (lldb_private::CXXFunctionSummaryFormat*)m_opaque_sp.get();
222254721Semaste        lldb_private::CXXFunctionSummaryFormat *other_cxx = (lldb_private::CXXFunctionSummaryFormat*)rhs.m_opaque_sp.get();
223254721Semaste        return (self_cxx->m_impl == other_cxx->m_impl);
224254721Semaste    }
225254721Semaste
226254721Semaste    if (m_opaque_sp->IsScripted() != rhs.m_opaque_sp->IsScripted())
227254721Semaste        return false;
228254721Semaste
229254721Semaste    if (IsFunctionCode() != rhs.IsFunctionCode())
230254721Semaste        return false;
231254721Semaste
232254721Semaste    if (IsSummaryString() != rhs.IsSummaryString())
233254721Semaste        return false;
234254721Semaste
235254721Semaste    if (IsFunctionName() != rhs.IsFunctionName())
236254721Semaste        return false;
237254721Semaste
238254721Semaste    if ( GetData() == NULL || rhs.GetData() == NULL || strcmp(GetData(), rhs.GetData()) )
239254721Semaste        return false;
240254721Semaste
241254721Semaste    return GetOptions() == rhs.GetOptions();
242254721Semaste
243254721Semaste}
244254721Semaste
245254721Semastebool
246254721SemasteSBTypeSummary::operator != (lldb::SBTypeSummary &rhs)
247254721Semaste{
248254721Semaste    if (IsValid() == false)
249254721Semaste        return !rhs.IsValid();
250254721Semaste    return m_opaque_sp != rhs.m_opaque_sp;
251254721Semaste}
252254721Semaste
253254721Semastelldb::TypeSummaryImplSP
254254721SemasteSBTypeSummary::GetSP ()
255254721Semaste{
256254721Semaste    return m_opaque_sp;
257254721Semaste}
258254721Semaste
259254721Semastevoid
260254721SemasteSBTypeSummary::SetSP (const lldb::TypeSummaryImplSP &typesummary_impl_sp)
261254721Semaste{
262254721Semaste    m_opaque_sp = typesummary_impl_sp;
263254721Semaste}
264254721Semaste
265254721SemasteSBTypeSummary::SBTypeSummary (const lldb::TypeSummaryImplSP &typesummary_impl_sp) :
266254721Semastem_opaque_sp(typesummary_impl_sp)
267254721Semaste{
268254721Semaste}
269254721Semaste
270254721Semastebool
271254721SemasteSBTypeSummary::CopyOnWrite_Impl()
272254721Semaste{
273254721Semaste    if (!IsValid())
274254721Semaste        return false;
275254721Semaste
276254721Semaste    if (m_opaque_sp.unique())
277254721Semaste        return true;
278254721Semaste
279254721Semaste    TypeSummaryImplSP new_sp;
280254721Semaste
281254721Semaste    if (m_opaque_sp->GetType() == lldb_private::TypeSummaryImpl::eTypeCallback)
282254721Semaste    {
283254721Semaste        CXXFunctionSummaryFormat* current_summary_ptr = (CXXFunctionSummaryFormat*)m_opaque_sp.get();
284254721Semaste        new_sp = TypeSummaryImplSP(new CXXFunctionSummaryFormat(GetOptions(),
285254721Semaste                                                                current_summary_ptr->m_impl,
286254721Semaste                                                                current_summary_ptr->m_description.c_str()));
287254721Semaste    }
288254721Semaste    else if (m_opaque_sp->IsScripted())
289254721Semaste    {
290254721Semaste        ScriptSummaryFormat* current_summary_ptr = (ScriptSummaryFormat*)m_opaque_sp.get();
291254721Semaste        new_sp = TypeSummaryImplSP(new ScriptSummaryFormat(GetOptions(),
292254721Semaste                                                           current_summary_ptr->GetFunctionName(),
293254721Semaste                                                           current_summary_ptr->GetPythonScript()));
294254721Semaste    }
295254721Semaste    else {
296254721Semaste        StringSummaryFormat* current_summary_ptr = (StringSummaryFormat*)m_opaque_sp.get();
297254721Semaste        new_sp = TypeSummaryImplSP(new StringSummaryFormat(GetOptions(),
298254721Semaste                                                           current_summary_ptr->GetSummaryString()));
299254721Semaste    }
300254721Semaste
301254721Semaste    SetSP(new_sp);
302254721Semaste
303254721Semaste    return true;
304254721Semaste}
305254721Semaste
306254721Semastebool
307254721SemasteSBTypeSummary::ChangeSummaryType (bool want_script)
308254721Semaste{
309254721Semaste    if (!IsValid())
310254721Semaste        return false;
311254721Semaste
312254721Semaste    TypeSummaryImplSP new_sp;
313254721Semaste
314254721Semaste    if (want_script == m_opaque_sp->IsScripted())
315254721Semaste    {
316254721Semaste        if (m_opaque_sp->GetType() == lldb_private::TypeSummaryImpl::eTypeCallback && !want_script)
317254721Semaste            new_sp = TypeSummaryImplSP(new StringSummaryFormat(GetOptions(), ""));
318254721Semaste        else
319254721Semaste            return CopyOnWrite_Impl();
320254721Semaste    }
321254721Semaste
322254721Semaste    if (!new_sp)
323254721Semaste    {
324254721Semaste        if (want_script)
325254721Semaste            new_sp = TypeSummaryImplSP(new ScriptSummaryFormat(GetOptions(), "", ""));
326254721Semaste        else
327254721Semaste            new_sp = TypeSummaryImplSP(new StringSummaryFormat(GetOptions(), ""));
328254721Semaste    }
329254721Semaste
330254721Semaste    SetSP(new_sp);
331254721Semaste
332254721Semaste    return true;
333254721Semaste}
334254721Semaste
335254721Semaste#endif // LLDB_DISABLE_PYTHON
336