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/API/SBTypeSummary.h"
11 
12 #include "lldb/API/SBStream.h"
13 
14 #include "lldb/Core/DataVisualization.h"
15 
16 using namespace lldb;
17 using namespace lldb_private;
18 
19 #ifndef LLDB_DISABLE_PYTHON
20 
21 SBTypeSummary::SBTypeSummary() :
22 m_opaque_sp()
23 {
24 }
25 
26 SBTypeSummary
27 SBTypeSummary::CreateWithSummaryString (const char* data, uint32_t options)
28 {
29     if (!data || data[0] == 0)
30         return SBTypeSummary();
31 
32     return SBTypeSummary(TypeSummaryImplSP(new StringSummaryFormat(options, data)));
33 }
34 
35 SBTypeSummary
36 SBTypeSummary::CreateWithFunctionName (const char* data, uint32_t options)
37 {
38     if (!data || data[0] == 0)
39         return SBTypeSummary();
40 
41     return SBTypeSummary(TypeSummaryImplSP(new ScriptSummaryFormat(options, data)));
42 }
43 
44 SBTypeSummary
45 SBTypeSummary::CreateWithScriptCode (const char* data, uint32_t options)
46 {
47     if (!data || data[0] == 0)
48         return SBTypeSummary();
49 
50     return SBTypeSummary(TypeSummaryImplSP(new ScriptSummaryFormat(options, "", data)));
51 }
52 
53 SBTypeSummary::SBTypeSummary (const lldb::SBTypeSummary &rhs) :
54 m_opaque_sp(rhs.m_opaque_sp)
55 {
56 }
57 
58 SBTypeSummary::~SBTypeSummary ()
59 {
60 }
61 
62 bool
63 SBTypeSummary::IsValid() const
64 {
65     return m_opaque_sp.get() != NULL;
66 }
67 
68 bool
69 SBTypeSummary::IsFunctionCode()
70 {
71     if (!IsValid())
72         return false;
73     if (m_opaque_sp->IsScripted())
74     {
75         ScriptSummaryFormat* script_summary_ptr = (ScriptSummaryFormat*)m_opaque_sp.get();
76         const char* ftext = script_summary_ptr->GetPythonScript();
77         return (ftext && *ftext != 0);
78     }
79     return false;
80 }
81 
82 bool
83 SBTypeSummary::IsFunctionName()
84 {
85     if (!IsValid())
86         return false;
87     if (m_opaque_sp->IsScripted())
88     {
89         ScriptSummaryFormat* script_summary_ptr = (ScriptSummaryFormat*)m_opaque_sp.get();
90         const char* ftext = script_summary_ptr->GetPythonScript();
91         return (!ftext || *ftext == 0);
92     }
93     return false;
94 }
95 
96 bool
97 SBTypeSummary::IsSummaryString()
98 {
99     if (!IsValid())
100         return false;
101 
102     return !m_opaque_sp->IsScripted();
103 }
104 
105 const char*
106 SBTypeSummary::GetData ()
107 {
108     if (!IsValid())
109         return NULL;
110     if (m_opaque_sp->IsScripted())
111     {
112         ScriptSummaryFormat* script_summary_ptr = (ScriptSummaryFormat*)m_opaque_sp.get();
113         const char* fname = script_summary_ptr->GetFunctionName();
114         const char* ftext = script_summary_ptr->GetPythonScript();
115         if (ftext && *ftext)
116             return ftext;
117         return fname;
118     }
119     else
120     {
121         StringSummaryFormat* string_summary_ptr = (StringSummaryFormat*)m_opaque_sp.get();
122         return string_summary_ptr->GetSummaryString();
123     }
124 }
125 
126 uint32_t
127 SBTypeSummary::GetOptions ()
128 {
129     if (!IsValid())
130         return lldb::eTypeOptionNone;
131     return m_opaque_sp->GetOptions();
132 }
133 
134 void
135 SBTypeSummary::SetOptions (uint32_t value)
136 {
137     if (!CopyOnWrite_Impl())
138         return;
139     m_opaque_sp->SetOptions(value);
140 }
141 
142 void
143 SBTypeSummary::SetSummaryString (const char* data)
144 {
145     if (!IsValid())
146         return;
147     if (m_opaque_sp->IsScripted())
148         ChangeSummaryType(false);
149     ((StringSummaryFormat*)m_opaque_sp.get())->SetSummaryString(data);
150 }
151 
152 void
153 SBTypeSummary::SetFunctionName (const char* data)
154 {
155     if (!IsValid())
156         return;
157     if (!m_opaque_sp->IsScripted())
158         ChangeSummaryType(true);
159     ((ScriptSummaryFormat*)m_opaque_sp.get())->SetFunctionName(data);
160 }
161 
162 void
163 SBTypeSummary::SetFunctionCode (const char* data)
164 {
165     if (!IsValid())
166         return;
167     if (!m_opaque_sp->IsScripted())
168         ChangeSummaryType(true);
169     ((ScriptSummaryFormat*)m_opaque_sp.get())->SetPythonScript(data);
170 }
171 
172 bool
173 SBTypeSummary::GetDescription (lldb::SBStream &description,
174                               lldb::DescriptionLevel description_level)
175 {
176     if (!CopyOnWrite_Impl())
177         return false;
178     else {
179         description.Printf("%s\n",
180                            m_opaque_sp->GetDescription().c_str());
181         return true;
182     }
183 }
184 
185 lldb::SBTypeSummary &
186 SBTypeSummary::operator = (const lldb::SBTypeSummary &rhs)
187 {
188     if (this != &rhs)
189     {
190         m_opaque_sp = rhs.m_opaque_sp;
191     }
192     return *this;
193 }
194 
195 bool
196 SBTypeSummary::operator == (lldb::SBTypeSummary &rhs)
197 {
198     if (IsValid() == false)
199         return !rhs.IsValid();
200     return m_opaque_sp == rhs.m_opaque_sp;
201 }
202 
203 bool
204 SBTypeSummary::IsEqualTo (lldb::SBTypeSummary &rhs)
205 {
206     if (IsValid() == false)
207         return !rhs.IsValid();
208 
209     if (m_opaque_sp->IsScripted() != rhs.m_opaque_sp->IsScripted())
210         return false;
211 
212     if (IsFunctionCode() != rhs.IsFunctionCode())
213         return false;
214 
215     if (IsSummaryString() != rhs.IsSummaryString())
216         return false;
217 
218     if (IsFunctionName() != rhs.IsFunctionName())
219         return false;
220 
221     if ( strcmp(GetData(), rhs.GetData()) )
222         return false;
223 
224     return GetOptions() == rhs.GetOptions();
225 
226 }
227 
228 bool
229 SBTypeSummary::operator != (lldb::SBTypeSummary &rhs)
230 {
231     if (IsValid() == false)
232         return !rhs.IsValid();
233     return m_opaque_sp != rhs.m_opaque_sp;
234 }
235 
236 lldb::TypeSummaryImplSP
237 SBTypeSummary::GetSP ()
238 {
239     return m_opaque_sp;
240 }
241 
242 void
243 SBTypeSummary::SetSP (const lldb::TypeSummaryImplSP &typesummary_impl_sp)
244 {
245     m_opaque_sp = typesummary_impl_sp;
246 }
247 
248 SBTypeSummary::SBTypeSummary (const lldb::TypeSummaryImplSP &typesummary_impl_sp) :
249 m_opaque_sp(typesummary_impl_sp)
250 {
251 }
252 
253 bool
254 SBTypeSummary::CopyOnWrite_Impl()
255 {
256     if (!IsValid())
257         return false;
258     if (m_opaque_sp.unique())
259         return true;
260 
261     TypeSummaryImplSP new_sp;
262 
263     if (m_opaque_sp->IsScripted())
264     {
265         ScriptSummaryFormat* current_summary_ptr = (ScriptSummaryFormat*)m_opaque_sp.get();
266         new_sp = TypeSummaryImplSP(new ScriptSummaryFormat(GetOptions(),
267                                                            current_summary_ptr->GetFunctionName(),
268                                                            current_summary_ptr->GetPythonScript()));
269     }
270     else {
271         StringSummaryFormat* current_summary_ptr = (StringSummaryFormat*)m_opaque_sp.get();
272         new_sp = TypeSummaryImplSP(new StringSummaryFormat(GetOptions(),
273                                                            current_summary_ptr->GetSummaryString()));
274     }
275 
276     SetSP(new_sp);
277 
278     return true;
279 }
280 
281 bool
282 SBTypeSummary::ChangeSummaryType (bool want_script)
283 {
284     if (!IsValid())
285         return false;
286 
287     if (want_script == m_opaque_sp->IsScripted())
288         return CopyOnWrite_Impl();
289 
290     TypeSummaryImplSP new_sp;
291 
292     if (want_script)
293         new_sp = TypeSummaryImplSP(new ScriptSummaryFormat(GetOptions(), "", ""));
294     else
295         new_sp = TypeSummaryImplSP(new StringSummaryFormat(GetOptions(), ""));
296 
297     SetSP(new_sp);
298 
299     return true;
300 }
301 
302 #endif // LLDB_DISABLE_PYTHON
303