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