blob: df219a696ca061e7bb79d829530ffa2e11f5ae33 [file] [log] [blame]
Enrico Granata16376ed2012-02-15 02:34:21 +00001//===-- SBTypeSummary.cpp -----------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Daniel Malead891f9b2012-12-05 00:20:57 +000010#include "lldb/lldb-python.h"
11
Enrico Granata16376ed2012-02-15 02:34:21 +000012#include "lldb/API/SBTypeSummary.h"
13
14#include "lldb/API/SBStream.h"
15
16#include "lldb/Core/DataVisualization.h"
17
18using namespace lldb;
19using namespace lldb_private;
20
Jason Molendac48ca822012-02-21 05:33:55 +000021#ifndef LLDB_DISABLE_PYTHON
22
Enrico Granata16376ed2012-02-15 02:34:21 +000023SBTypeSummary::SBTypeSummary() :
24m_opaque_sp()
25{
26}
27
28SBTypeSummary
29SBTypeSummary::CreateWithSummaryString (const char* data, uint32_t options)
30{
31 if (!data || data[0] == 0)
32 return SBTypeSummary();
33
34 return SBTypeSummary(TypeSummaryImplSP(new StringSummaryFormat(options, data)));
35}
36
37SBTypeSummary
38SBTypeSummary::CreateWithFunctionName (const char* data, uint32_t options)
39{
40 if (!data || data[0] == 0)
41 return SBTypeSummary();
42
43 return SBTypeSummary(TypeSummaryImplSP(new ScriptSummaryFormat(options, data)));
44}
45
46SBTypeSummary
47SBTypeSummary::CreateWithScriptCode (const char* data, uint32_t options)
48{
49 if (!data || data[0] == 0)
50 return SBTypeSummary();
51
52 return SBTypeSummary(TypeSummaryImplSP(new ScriptSummaryFormat(options, "", data)));
53}
54
55SBTypeSummary::SBTypeSummary (const lldb::SBTypeSummary &rhs) :
56m_opaque_sp(rhs.m_opaque_sp)
57{
58}
59
60SBTypeSummary::~SBTypeSummary ()
61{
62}
63
64bool
65SBTypeSummary::IsValid() const
66{
67 return m_opaque_sp.get() != NULL;
68}
69
70bool
71SBTypeSummary::IsFunctionCode()
72{
73 if (!IsValid())
74 return false;
75 if (m_opaque_sp->IsScripted())
76 {
77 ScriptSummaryFormat* script_summary_ptr = (ScriptSummaryFormat*)m_opaque_sp.get();
78 const char* ftext = script_summary_ptr->GetPythonScript();
79 return (ftext && *ftext != 0);
80 }
81 return false;
82}
83
84bool
85SBTypeSummary::IsFunctionName()
86{
87 if (!IsValid())
88 return false;
89 if (m_opaque_sp->IsScripted())
90 {
91 ScriptSummaryFormat* script_summary_ptr = (ScriptSummaryFormat*)m_opaque_sp.get();
92 const char* ftext = script_summary_ptr->GetPythonScript();
93 return (!ftext || *ftext == 0);
94 }
95 return false;
96}
97
98bool
99SBTypeSummary::IsSummaryString()
100{
101 if (!IsValid())
102 return false;
103
Enrico Granataae2ae942012-09-04 18:47:54 +0000104 if (m_opaque_sp->GetType() == lldb_private::TypeSummaryImpl::eTypeCallback)
105 return false;
106
Enrico Granata16376ed2012-02-15 02:34:21 +0000107 return !m_opaque_sp->IsScripted();
108}
109
110const char*
111SBTypeSummary::GetData ()
112{
113 if (!IsValid())
114 return NULL;
Enrico Granataae2ae942012-09-04 18:47:54 +0000115 if (m_opaque_sp->GetType() == lldb_private::TypeSummaryImpl::eTypeCallback)
116 return NULL;
Enrico Granata16376ed2012-02-15 02:34:21 +0000117 if (m_opaque_sp->IsScripted())
118 {
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();
122 if (ftext && *ftext)
123 return ftext;
124 return fname;
125 }
126 else
127 {
128 StringSummaryFormat* string_summary_ptr = (StringSummaryFormat*)m_opaque_sp.get();
129 return string_summary_ptr->GetSummaryString();
130 }
131}
132
133uint32_t
134SBTypeSummary::GetOptions ()
135{
136 if (!IsValid())
137 return lldb::eTypeOptionNone;
138 return m_opaque_sp->GetOptions();
139}
140
141void
142SBTypeSummary::SetOptions (uint32_t value)
143{
144 if (!CopyOnWrite_Impl())
145 return;
146 m_opaque_sp->SetOptions(value);
147}
148
149void
150SBTypeSummary::SetSummaryString (const char* data)
151{
152 if (!IsValid())
153 return;
Enrico Granataae2ae942012-09-04 18:47:54 +0000154 if (m_opaque_sp->IsScripted() || (m_opaque_sp->GetType() == lldb_private::TypeSummaryImpl::eTypeCallback))
Enrico Granata16376ed2012-02-15 02:34:21 +0000155 ChangeSummaryType(false);
156 ((StringSummaryFormat*)m_opaque_sp.get())->SetSummaryString(data);
157}
158
159void
160SBTypeSummary::SetFunctionName (const char* data)
161{
162 if (!IsValid())
163 return;
164 if (!m_opaque_sp->IsScripted())
165 ChangeSummaryType(true);
166 ((ScriptSummaryFormat*)m_opaque_sp.get())->SetFunctionName(data);
167}
168
169void
170SBTypeSummary::SetFunctionCode (const char* data)
171{
172 if (!IsValid())
173 return;
174 if (!m_opaque_sp->IsScripted())
175 ChangeSummaryType(true);
176 ((ScriptSummaryFormat*)m_opaque_sp.get())->SetPythonScript(data);
177}
178
179bool
180SBTypeSummary::GetDescription (lldb::SBStream &description,
181 lldb::DescriptionLevel description_level)
182{
183 if (!CopyOnWrite_Impl())
184 return false;
185 else {
186 description.Printf("%s\n",
187 m_opaque_sp->GetDescription().c_str());
188 return true;
189 }
190}
191
192lldb::SBTypeSummary &
193SBTypeSummary::operator = (const lldb::SBTypeSummary &rhs)
194{
195 if (this != &rhs)
196 {
197 m_opaque_sp = rhs.m_opaque_sp;
198 }
199 return *this;
200}
201
202bool
203SBTypeSummary::operator == (lldb::SBTypeSummary &rhs)
204{
205 if (IsValid() == false)
206 return !rhs.IsValid();
207 return m_opaque_sp == rhs.m_opaque_sp;
208}
209
210bool
211SBTypeSummary::IsEqualTo (lldb::SBTypeSummary &rhs)
212{
213 if (IsValid() == false)
214 return !rhs.IsValid();
Enrico Granataae2ae942012-09-04 18:47:54 +0000215
216 if (m_opaque_sp->GetType() != rhs.m_opaque_sp->GetType())
217 return false;
218
219 if (m_opaque_sp->GetType() == lldb_private::TypeSummaryImpl::eTypeCallback)
220 {
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);
224 }
Enrico Granata16376ed2012-02-15 02:34:21 +0000225
226 if (m_opaque_sp->IsScripted() != rhs.m_opaque_sp->IsScripted())
227 return false;
228
229 if (IsFunctionCode() != rhs.IsFunctionCode())
230 return false;
231
232 if (IsSummaryString() != rhs.IsSummaryString())
233 return false;
234
235 if (IsFunctionName() != rhs.IsFunctionName())
236 return false;
237
Jim Ingham6f01c932012-10-12 17:34:26 +0000238 if ( GetData() == NULL || rhs.GetData() == NULL || strcmp(GetData(), rhs.GetData()) )
Enrico Granata16376ed2012-02-15 02:34:21 +0000239 return false;
240
241 return GetOptions() == rhs.GetOptions();
242
243}
244
245bool
246SBTypeSummary::operator != (lldb::SBTypeSummary &rhs)
247{
248 if (IsValid() == false)
249 return !rhs.IsValid();
250 return m_opaque_sp != rhs.m_opaque_sp;
251}
252
253lldb::TypeSummaryImplSP
254SBTypeSummary::GetSP ()
255{
256 return m_opaque_sp;
257}
258
259void
260SBTypeSummary::SetSP (const lldb::TypeSummaryImplSP &typesummary_impl_sp)
261{
262 m_opaque_sp = typesummary_impl_sp;
263}
264
265SBTypeSummary::SBTypeSummary (const lldb::TypeSummaryImplSP &typesummary_impl_sp) :
266m_opaque_sp(typesummary_impl_sp)
267{
268}
269
270bool
271SBTypeSummary::CopyOnWrite_Impl()
272{
273 if (!IsValid())
274 return false;
Enrico Granataae2ae942012-09-04 18:47:54 +0000275
Enrico Granata16376ed2012-02-15 02:34:21 +0000276 if (m_opaque_sp.unique())
277 return true;
278
279 TypeSummaryImplSP new_sp;
280
Enrico Granataae2ae942012-09-04 18:47:54 +0000281 if (m_opaque_sp->GetType() == lldb_private::TypeSummaryImpl::eTypeCallback)
282 {
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()));
287 }
288 else if (m_opaque_sp->IsScripted())
Enrico Granata16376ed2012-02-15 02:34:21 +0000289 {
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()));
294 }
295 else {
296 StringSummaryFormat* current_summary_ptr = (StringSummaryFormat*)m_opaque_sp.get();
297 new_sp = TypeSummaryImplSP(new StringSummaryFormat(GetOptions(),
298 current_summary_ptr->GetSummaryString()));
299 }
300
301 SetSP(new_sp);
302
303 return true;
304}
305
306bool
307SBTypeSummary::ChangeSummaryType (bool want_script)
308{
309 if (!IsValid())
310 return false;
311
Enrico Granata16376ed2012-02-15 02:34:21 +0000312 TypeSummaryImplSP new_sp;
313
Enrico Granataae2ae942012-09-04 18:47:54 +0000314 if (want_script == m_opaque_sp->IsScripted())
315 {
316 if (m_opaque_sp->GetType() == lldb_private::TypeSummaryImpl::eTypeCallback && !want_script)
317 new_sp = TypeSummaryImplSP(new StringSummaryFormat(GetOptions(), ""));
318 else
319 return CopyOnWrite_Impl();
320 }
321
322 if (!new_sp)
323 {
324 if (want_script)
325 new_sp = TypeSummaryImplSP(new ScriptSummaryFormat(GetOptions(), "", ""));
326 else
327 new_sp = TypeSummaryImplSP(new StringSummaryFormat(GetOptions(), ""));
328 }
Enrico Granata16376ed2012-02-15 02:34:21 +0000329
330 SetSP(new_sp);
331
332 return true;
333}
Jason Molendac48ca822012-02-21 05:33:55 +0000334
335#endif // LLDB_DISABLE_PYTHON