]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - contrib/llvm/tools/lldb/source/API/SBTypeSummary.cpp
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / contrib / llvm / tools / lldb / source / API / SBTypeSummary.cpp
1 //===-- 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
10 #include "lldb/lldb-python.h"
11
12 #include "lldb/API/SBTypeSummary.h"
13
14 #include "lldb/API/SBStream.h"
15
16 #include "lldb/DataFormatters/DataVisualization.h"
17
18 using namespace lldb;
19 using namespace lldb_private;
20
21 #ifndef LLDB_DISABLE_PYTHON
22
23 SBTypeSummary::SBTypeSummary() :
24 m_opaque_sp()
25 {
26 }
27
28 SBTypeSummary
29 SBTypeSummary::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
37 SBTypeSummary
38 SBTypeSummary::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
46 SBTypeSummary
47 SBTypeSummary::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
55 SBTypeSummary::SBTypeSummary (const lldb::SBTypeSummary &rhs) :
56 m_opaque_sp(rhs.m_opaque_sp)
57 {
58 }
59
60 SBTypeSummary::~SBTypeSummary ()
61 {
62 }
63
64 bool
65 SBTypeSummary::IsValid() const
66 {
67     return m_opaque_sp.get() != NULL;
68 }
69
70 bool
71 SBTypeSummary::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
84 bool
85 SBTypeSummary::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
98 bool
99 SBTypeSummary::IsSummaryString()
100 {
101     if (!IsValid())
102         return false;
103     
104     if (m_opaque_sp->GetType() == lldb_private::TypeSummaryImpl::eTypeCallback)
105         return false;
106     
107     return !m_opaque_sp->IsScripted();
108 }
109
110 const char*
111 SBTypeSummary::GetData ()
112 {
113     if (!IsValid())
114         return NULL;
115     if (m_opaque_sp->GetType() == lldb_private::TypeSummaryImpl::eTypeCallback)
116         return NULL;
117     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
133 uint32_t
134 SBTypeSummary::GetOptions ()
135 {
136     if (!IsValid())
137         return lldb::eTypeOptionNone;
138     return m_opaque_sp->GetOptions();
139 }
140
141 void
142 SBTypeSummary::SetOptions (uint32_t value)
143 {
144     if (!CopyOnWrite_Impl())
145         return;
146     m_opaque_sp->SetOptions(value);
147 }
148
149 void
150 SBTypeSummary::SetSummaryString (const char* data)
151 {
152     if (!IsValid())
153         return;
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);
157 }
158
159 void
160 SBTypeSummary::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
169 void
170 SBTypeSummary::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
179 bool
180 SBTypeSummary::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
192 lldb::SBTypeSummary &
193 SBTypeSummary::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
202 bool
203 SBTypeSummary::operator == (lldb::SBTypeSummary &rhs)
204 {
205     if (IsValid() == false)
206         return !rhs.IsValid();
207     return m_opaque_sp == rhs.m_opaque_sp;
208 }
209
210 bool
211 SBTypeSummary::IsEqualTo (lldb::SBTypeSummary &rhs)
212 {
213     if (IsValid() == false)
214         return !rhs.IsValid();
215
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     }
225     
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     
238     if ( GetData() == NULL || rhs.GetData() == NULL || strcmp(GetData(), rhs.GetData()) )
239         return false;
240     
241     return GetOptions() == rhs.GetOptions();
242     
243 }
244
245 bool
246 SBTypeSummary::operator != (lldb::SBTypeSummary &rhs)
247 {
248     if (IsValid() == false)
249         return !rhs.IsValid();
250     return m_opaque_sp != rhs.m_opaque_sp;
251 }
252
253 lldb::TypeSummaryImplSP
254 SBTypeSummary::GetSP ()
255 {
256     return m_opaque_sp;
257 }
258
259 void
260 SBTypeSummary::SetSP (const lldb::TypeSummaryImplSP &typesummary_impl_sp)
261 {
262     m_opaque_sp = typesummary_impl_sp;
263 }
264
265 SBTypeSummary::SBTypeSummary (const lldb::TypeSummaryImplSP &typesummary_impl_sp) :
266 m_opaque_sp(typesummary_impl_sp)
267 {
268 }
269
270 bool
271 SBTypeSummary::CopyOnWrite_Impl()
272 {
273     if (!IsValid())
274         return false;
275     
276     if (m_opaque_sp.unique())
277         return true;
278     
279     TypeSummaryImplSP new_sp;
280     
281     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())
289     {
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
306 bool
307 SBTypeSummary::ChangeSummaryType (bool want_script)
308 {
309     if (!IsValid())
310         return false;
311     
312     TypeSummaryImplSP new_sp;
313     
314     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     }
329     
330     SetSP(new_sp);
331     
332     return true;
333 }
334
335 #endif // LLDB_DISABLE_PYTHON