blob: 21f9a0eed94e89931c296a2042a261b4c978fe4d [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- SBValue.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 "SBValue.h"
11
12#include "lldb/Core/DataExtractor.h"
13#include "lldb/Core/Module.h"
14#include "lldb/Core/Stream.h"
15#include "lldb/Core/StreamFile.h"
16#include "lldb/Core/Value.h"
17#include "lldb/Core/ValueObject.h"
18#include "lldb/Symbol/Block.h"
19#include "lldb/Symbol/ObjectFile.h"
20#include "lldb/Symbol/Variable.h"
21#include "lldb/Target/ExecutionContext.h"
22#include "lldb/Target/Process.h"
23#include "lldb/Target/StackFrame.h"
24#include "lldb/Target/Thread.h"
25
26#include "SBProcess.h"
27#include "SBTarget.h"
28#include "SBThread.h"
29#include "SBFrame.h"
30#include "SBDebugger.h"
31
32using namespace lldb;
33using namespace lldb_private;
34
35SBValue::SBValue () :
36 m_lldb_object_sp ()
37{
38}
39
40SBValue::SBValue (const lldb::ValueObjectSP &value_sp) :
41 m_lldb_object_sp (value_sp)
42{
43}
44
45SBValue::~SBValue()
46{
47}
48
49bool
50SBValue::IsValid () const
51{
52 return (m_lldb_object_sp.get() != NULL);
53}
54
55void
56SBValue::Print (FILE *out_file, SBFrame *frame, bool print_type, bool print_value)
57{
58 if (out_file == NULL)
59 return;
60
61 if (IsValid())
62 {
63
64 SBThread sb_thread = frame->GetThread();
65 SBProcess sb_process = sb_thread.GetProcess();
66
67 lldb_private::StackFrame *lldb_frame = frame->GetLLDBObjectPtr();
68 lldb_private::Thread *lldb_thread = sb_thread.GetLLDBObjectPtr();
69 lldb_private::Process *lldb_process = sb_process.get();
70
71 lldb_private::ExecutionContext context (lldb_process, lldb_thread, lldb_frame);
72
73 lldb_private::StreamFile out_stream (out_file);
74
75 out_stream.Printf ("%s ", m_lldb_object_sp->GetName().AsCString (NULL));
76 if (! m_lldb_object_sp->IsInScope (lldb_frame))
77 out_stream.Printf ("[out-of-scope] ");
78 if (print_type)
79 {
80 out_stream.Printf ("(%s) ", m_lldb_object_sp->GetTypeName().AsCString ("<unknown-type>"));
81 }
82
83 if (print_value)
84 {
85 ExecutionContextScope *exe_scope = frame->get();
86 const char *val_cstr = m_lldb_object_sp->GetValueAsCString(exe_scope);
87 const char *err_cstr = m_lldb_object_sp->GetError().AsCString();
88
89 if (!err_cstr)
90 {
91 const char *sum_cstr = m_lldb_object_sp->GetSummaryAsCString(exe_scope);
92 const bool is_aggregate =
93 ClangASTContext::IsAggregateType (m_lldb_object_sp->GetOpaqueClangQualType());
94 if (val_cstr)
95 out_stream.Printf ("= %s ", val_cstr);
96
97 if (sum_cstr)
98 out_stream.Printf ("%s ", sum_cstr);
99
100 if (is_aggregate)
101 {
102 out_stream.PutChar ('{');
103 const uint32_t num_children = m_lldb_object_sp->GetNumChildren();
104 if (num_children)
105 {
106 out_stream.IndentMore();
107 for (uint32_t idx = 0; idx < num_children; ++idx)
108 {
109 lldb::ValueObjectSP child_sp (m_lldb_object_sp->GetChildAtIndex (idx, true));
110 if (child_sp.get())
111 {
112 out_stream.EOL();
113 out_stream.Indent();
114 out_stream.Printf ("%s (%s) = %s", child_sp.get()->GetName().AsCString (""),
115 child_sp.get()->GetTypeName().AsCString ("<unknown type>"),
116 child_sp.get()->GetValueAsCString(exe_scope));
117 }
118 }
119 out_stream.IndentLess();
120 }
121 out_stream.EOL();
122 out_stream.Indent ("}");
123 }
124 }
125 }
126 out_stream.EOL ();
127 }
128}
129
130const char *
131SBValue::GetName()
132{
133 if (IsValid())
134 return m_lldb_object_sp->GetName().AsCString();
135 else
136 return NULL;
137}
138
139const char *
140SBValue::GetTypeName ()
141{
142 if (IsValid())
143 return m_lldb_object_sp->GetTypeName().AsCString();
144 else
145 return NULL;
146}
147
148size_t
149SBValue::GetByteSize ()
150{
151 size_t result = 0;
152
153 if (IsValid())
154 result = m_lldb_object_sp->GetByteSize();
155
156 return result;
157}
158
159bool
160SBValue::IsInScope (const SBFrame &frame)
161{
162 bool result = false;
163
164 if (IsValid())
165 result = m_lldb_object_sp->IsInScope (frame.get());
166
167 return result;
168}
169
170const char *
171SBValue::GetValue (const SBFrame &frame)
172{
173 const char *value_string = NULL;
174 if ( m_lldb_object_sp)
175 value_string = m_lldb_object_sp->GetValueAsCString(frame.get());
176 return value_string;
177}
178
179bool
180SBValue::GetValueDidChange ()
181{
182 if (IsValid())
183 return m_lldb_object_sp->GetValueDidChange();
184 return false;
185}
186
187const char *
188SBValue::GetSummary (const SBFrame &frame)
189{
190 const char *value_string = NULL;
191 if ( m_lldb_object_sp)
192 value_string = m_lldb_object_sp->GetSummaryAsCString(frame.get());
193 return value_string;
194}
195
196const char *
197SBValue::GetLocation (const SBFrame &frame)
198{
199 const char *value_string = NULL;
200 if (IsValid())
201 value_string = m_lldb_object_sp->GetLocationAsCString(frame.get());
202 return value_string;
203}
204
205bool
206SBValue::SetValueFromCString (const SBFrame &frame, const char *value_str)
207{
208 bool success = false;
209 if (IsValid())
210 success = m_lldb_object_sp->SetValueFromCString (frame.get(), value_str);
211 return success;
212}
213
214SBValue
215SBValue::GetChildAtIndex (uint32_t idx)
216{
217 lldb::ValueObjectSP child_sp;
218
219 if (IsValid())
220 {
221 child_sp = m_lldb_object_sp->GetChildAtIndex (idx, true);
222 }
223
224 SBValue sb_value (child_sp);
225 return sb_value;
226}
227
228uint32_t
229SBValue::GetIndexOfChildWithName (const char *name)
230{
231 if (IsValid())
232 return m_lldb_object_sp->GetIndexOfChildWithName (ConstString(name));
233 return UINT32_MAX;
234}
235
236SBValue
237SBValue::GetChildMemberWithName (const char *name)
238{
239 lldb::ValueObjectSP child_sp;
240 const ConstString str_name (name);
241
242 if (IsValid())
243 {
244 child_sp = m_lldb_object_sp->GetChildMemberWithName (str_name, true);
245 }
246
247 SBValue sb_value (child_sp);
248 return sb_value;
249}
250
251
252uint32_t
253SBValue::GetNumChildren ()
254{
255 uint32_t num_children = 0;
256
257 if (IsValid())
258 {
259 num_children = m_lldb_object_sp->GetNumChildren();
260 }
261
262 return num_children;
263}
264
265bool
266SBValue::ValueIsStale ()
267{
268 bool result = true;
269
270 if (IsValid())
271 {
272 result = m_lldb_object_sp->GetValueIsValid();
273 }
274
275 return result;
276}
277
278
279SBValue
280SBValue::Dereference ()
281{
282 if (IsValid())
283 {
284 if (m_lldb_object_sp->IsPointerType())
285 {
286 return GetChildAtIndex(0);
287 }
288 }
289 return *this;
290}
291
292bool
293SBValue::TypeIsPtrType ()
294{
295 bool is_ptr_type = false;
296
297 if (IsValid())
298 {
299 is_ptr_type = m_lldb_object_sp->IsPointerType();
300 }
301
302 return is_ptr_type;
303}
304
305
306lldb_private::ExecutionContext
307SBValue::GetCurrentExecutionContext ()
308{
309 lldb_private::Process *process = NULL;
310 lldb_private::Thread *thread = NULL;
311 lldb_private::StackFrame *frame = NULL;
312
313 SBTarget sb_target = SBDebugger::GetCurrentTarget();
314 if (sb_target.IsValid())
315 {
316 SBProcess sb_process = sb_target.GetProcess();
317 if (sb_process.IsValid())
318 {
319 process = sb_process.get();
320 SBThread sb_thread = sb_process.GetCurrentThread();
321 if (sb_thread.IsValid())
322 {
323 thread = sb_thread.GetLLDBObjectPtr();
324 frame = thread->GetStackFrameAtIndex(0).get();
325 lldb_private::ExecutionContext exe_context (process, thread, frame);
326 return exe_context;
327 }
328 else
329 {
330 lldb_private::ExecutionContext exe_context (process, NULL, NULL);
331 return exe_context;
332 }
333 }
334 }
335
336 lldb_private::ExecutionContext exe_context (NULL, NULL, NULL);
337 return exe_context;
338}
339
340
341void *
342SBValue::GetOpaqueType()
343{
344 if (m_lldb_object_sp)
345 return m_lldb_object_sp->GetOpaqueClangQualType();
346 return NULL;
347}
348
349// Mimic shared pointer...
350lldb_private::ValueObject *
351SBValue::get() const
352{
353 return m_lldb_object_sp.get();
354}
355
356lldb_private::ValueObject *
357SBValue::operator->() const
358{
359 return m_lldb_object_sp.get();
360}
361
362lldb::ValueObjectSP &
363SBValue::operator*()
364{
365 return m_lldb_object_sp;
366}
367
368const lldb::ValueObjectSP &
369SBValue::operator*() const
370{
371 return m_lldb_object_sp;
372}