blob: dffd34c920b3888d45209171382368ca59625cde [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
Daniel Malead891f9b2012-12-05 00:20:57 +000010#include "lldb/lldb-python.h"
11
Eli Friedman7a62c8b2010-06-09 07:44:37 +000012#include "lldb/API/SBValue.h"
Enrico Granatad760907c2012-02-17 03:18:30 +000013
Enrico Granata49306142012-10-10 22:54:17 +000014#include "lldb/API/SBDeclaration.h"
Caroline Tice98f930f2010-09-20 05:20:02 +000015#include "lldb/API/SBStream.h"
Enrico Granatad760907c2012-02-17 03:18:30 +000016#include "lldb/API/SBTypeFilter.h"
17#include "lldb/API/SBTypeFormat.h"
18#include "lldb/API/SBTypeSummary.h"
19#include "lldb/API/SBTypeSynthetic.h"
Chris Lattner24943d22010-06-08 16:52:24 +000020
Johnny Chenecd4feb2011-10-14 00:42:25 +000021#include "lldb/Breakpoint/Watchpoint.h"
Chris Lattner24943d22010-06-08 16:52:24 +000022#include "lldb/Core/DataExtractor.h"
Enrico Granatad760907c2012-02-17 03:18:30 +000023#include "lldb/Core/DataVisualization.h"
Caroline Tice7826c882010-10-26 03:11:13 +000024#include "lldb/Core/Log.h"
Chris Lattner24943d22010-06-08 16:52:24 +000025#include "lldb/Core/Module.h"
Greg Clayton0fb0bcc2011-08-03 22:57:10 +000026#include "lldb/Core/Scalar.h"
Greg Clayton49ce8962012-08-29 21:13:06 +000027#include "lldb/Core/Section.h"
Chris Lattner24943d22010-06-08 16:52:24 +000028#include "lldb/Core/Stream.h"
29#include "lldb/Core/StreamFile.h"
30#include "lldb/Core/Value.h"
31#include "lldb/Core/ValueObject.h"
Enrico Granata979e20d2011-07-29 19:53:35 +000032#include "lldb/Core/ValueObjectConstResult.h"
Chris Lattner24943d22010-06-08 16:52:24 +000033#include "lldb/Symbol/Block.h"
Enrico Granata49306142012-10-10 22:54:17 +000034#include "lldb/Symbol/Declaration.h"
Chris Lattner24943d22010-06-08 16:52:24 +000035#include "lldb/Symbol/ObjectFile.h"
Greg Clayton0a19a1b2012-02-04 02:27:34 +000036#include "lldb/Symbol/Type.h"
Chris Lattner24943d22010-06-08 16:52:24 +000037#include "lldb/Symbol/Variable.h"
Johnny Chenecd4feb2011-10-14 00:42:25 +000038#include "lldb/Symbol/VariableList.h"
Chris Lattner24943d22010-06-08 16:52:24 +000039#include "lldb/Target/ExecutionContext.h"
40#include "lldb/Target/Process.h"
41#include "lldb/Target/StackFrame.h"
Greg Claytonbdcda462010-12-20 20:49:23 +000042#include "lldb/Target/Target.h"
Chris Lattner24943d22010-06-08 16:52:24 +000043#include "lldb/Target/Thread.h"
44
Jim Ingham47beabb2012-10-16 21:41:58 +000045#include "lldb/API/SBDebugger.h"
46#include "lldb/API/SBExpressionOptions.h"
47#include "lldb/API/SBFrame.h"
Eli Friedman7a62c8b2010-06-09 07:44:37 +000048#include "lldb/API/SBProcess.h"
49#include "lldb/API/SBTarget.h"
50#include "lldb/API/SBThread.h"
Chris Lattner24943d22010-06-08 16:52:24 +000051
52using namespace lldb;
53using namespace lldb_private;
54
Enrico Granata3d656c72012-10-22 18:18:36 +000055namespace {
56 class ValueImpl
57 {
58 public:
59 ValueImpl ()
60 {
61 }
62
63 ValueImpl (lldb::ValueObjectSP opaque_sp,
64 lldb::DynamicValueType use_dynamic,
65 bool use_synthetic) :
66 m_opaque_sp(opaque_sp),
67 m_use_dynamic(use_dynamic),
68 m_use_synthetic(use_synthetic)
69 {
70 }
71
72 ValueImpl (const ValueImpl& rhs) :
73 m_opaque_sp(rhs.m_opaque_sp),
74 m_use_dynamic(rhs.m_use_dynamic),
75 m_use_synthetic(rhs.m_use_synthetic)
76 {
77 }
78
79 ValueImpl &
80 operator = (const ValueImpl &rhs)
81 {
82 if (this != &rhs)
83 {
84 m_opaque_sp = rhs.m_opaque_sp;
85 m_use_dynamic = rhs.m_use_dynamic;
86 m_use_synthetic = rhs.m_use_synthetic;
87 }
88 return *this;
89 }
90
91 bool
92 IsValid ()
93 {
94 return m_opaque_sp.get() != NULL;
95 }
96
97 lldb::ValueObjectSP
98 GetRootSP ()
99 {
100 return m_opaque_sp;
101 }
102
103 lldb::ValueObjectSP
104 GetSP ()
105 {
106 if (!m_opaque_sp)
107 return m_opaque_sp;
108 lldb::ValueObjectSP value_sp = m_opaque_sp;
109 if (value_sp->GetDynamicValue(m_use_dynamic))
110 value_sp = value_sp->GetDynamicValue(m_use_dynamic);
111 if (value_sp->GetSyntheticValue(m_use_synthetic))
112 value_sp = value_sp->GetSyntheticValue(m_use_synthetic);
113 return value_sp;
114 }
115
116 void
117 SetUseDynamic (lldb::DynamicValueType use_dynamic)
118 {
119 m_use_dynamic = use_dynamic;
120 }
121
122 void
123 SetUseSynthetic (bool use_synthetic)
124 {
125 m_use_synthetic = use_synthetic;
126 }
127
128 lldb::DynamicValueType
129 GetUseDynamic ()
130 {
131 return m_use_dynamic;
132 }
133
134 bool
135 GetUseSynthetic ()
136 {
137 return m_use_synthetic;
138 }
139
140 private:
141 lldb::ValueObjectSP m_opaque_sp;
142 lldb::DynamicValueType m_use_dynamic;
143 bool m_use_synthetic;
144 };
145}
146
Chris Lattner24943d22010-06-08 16:52:24 +0000147SBValue::SBValue () :
Greg Clayton63094e02010-06-23 01:19:29 +0000148 m_opaque_sp ()
Chris Lattner24943d22010-06-08 16:52:24 +0000149{
150}
151
Enrico Granatadba1de82012-03-27 02:35:13 +0000152SBValue::SBValue (const lldb::ValueObjectSP &value_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000153{
Enrico Granata3d656c72012-10-22 18:18:36 +0000154 SetSP(value_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000155}
156
Enrico Granatadba1de82012-03-27 02:35:13 +0000157SBValue::SBValue(const SBValue &rhs)
Greg Clayton538eb822010-11-05 23:17:00 +0000158{
Enrico Granata3d656c72012-10-22 18:18:36 +0000159 SetSP(rhs.m_opaque_sp);
Greg Clayton538eb822010-11-05 23:17:00 +0000160}
161
Greg Claytond68e0892011-09-09 23:04:00 +0000162SBValue &
Greg Clayton538eb822010-11-05 23:17:00 +0000163SBValue::operator = (const SBValue &rhs)
164{
165 if (this != &rhs)
Enrico Granatadba1de82012-03-27 02:35:13 +0000166 {
Enrico Granata3d656c72012-10-22 18:18:36 +0000167 SetSP(rhs.m_opaque_sp);
Enrico Granatadba1de82012-03-27 02:35:13 +0000168 }
Greg Clayton538eb822010-11-05 23:17:00 +0000169 return *this;
170}
171
Chris Lattner24943d22010-06-08 16:52:24 +0000172SBValue::~SBValue()
173{
174}
175
176bool
Greg Claytond68e0892011-09-09 23:04:00 +0000177SBValue::IsValid ()
Chris Lattner24943d22010-06-08 16:52:24 +0000178{
Greg Clayton49ce6822010-10-31 03:01:06 +0000179 // If this function ever changes to anything that does more than just
180 // check if the opaque shared pointer is non NULL, then we need to update
181 // all "if (m_opaque_sp)" code in this file.
Enrico Granata3d656c72012-10-22 18:18:36 +0000182 return m_opaque_sp.get() != NULL && m_opaque_sp->GetRootSP().get() != NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000183}
184
Jim Inghame0bd5712011-12-19 20:39:44 +0000185void
186SBValue::Clear()
187{
188 m_opaque_sp.reset();
189}
190
Greg Claytonc5f728c2010-10-06 22:10:17 +0000191SBError
192SBValue::GetError()
193{
194 SBError sb_error;
195
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000196 lldb::ValueObjectSP value_sp(GetSP());
197 if (value_sp)
198 sb_error.SetError(value_sp->GetError());
Greg Clayton334d33a2012-01-30 07:41:31 +0000199 else
200 sb_error.SetErrorString("error: invalid value");
Greg Claytonc5f728c2010-10-06 22:10:17 +0000201
202 return sb_error;
203}
204
Johnny Chen968958c2011-07-07 20:46:23 +0000205user_id_t
206SBValue::GetID()
207{
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000208 lldb::ValueObjectSP value_sp(GetSP());
209 if (value_sp)
210 return value_sp->GetID();
Johnny Chen968958c2011-07-07 20:46:23 +0000211 return LLDB_INVALID_UID;
212}
213
Chris Lattner24943d22010-06-08 16:52:24 +0000214const char *
215SBValue::GetName()
216{
Greg Clayton49ce6822010-10-31 03:01:06 +0000217
218 const char *name = NULL;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000219 lldb::ValueObjectSP value_sp(GetSP());
220 if (value_sp)
221 name = value_sp->GetName().GetCString();
Greg Clayton49ce6822010-10-31 03:01:06 +0000222
Greg Claytone005f2c2010-11-06 01:53:30 +0000223 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000224 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000225 {
226 if (name)
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000227 log->Printf ("SBValue(%p)::GetName () => \"%s\"", value_sp.get(), name);
Greg Clayton49ce6822010-10-31 03:01:06 +0000228 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000229 log->Printf ("SBValue(%p)::GetName () => NULL", value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +0000230 }
Caroline Tice7826c882010-10-26 03:11:13 +0000231
Greg Clayton49ce6822010-10-31 03:01:06 +0000232 return name;
Chris Lattner24943d22010-06-08 16:52:24 +0000233}
234
235const char *
236SBValue::GetTypeName ()
237{
Jim Ingham684d4012012-08-21 01:46:35 +0000238 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000239 const char *name = NULL;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000240 lldb::ValueObjectSP value_sp(GetSP());
241 if (value_sp)
Jim Ingham684d4012012-08-21 01:46:35 +0000242 {
243 // For a dynamic type we might have to run code to determine the type we are going to report,
244 // and we might not have updated the type before we get asked this. So make sure to get the API lock.
245
246 ProcessSP process_sp(value_sp->GetProcessSP());
247 Process::StopLocker stop_locker;
248 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
249 {
250 if (log)
251 log->Printf ("SBValue(%p)::GetTypeName() => error: process is running", value_sp.get());
252 }
253 else
254 {
255 TargetSP target_sp(value_sp->GetTargetSP());
256 if (target_sp)
257 {
258 Mutex::Locker api_locker (target_sp->GetAPIMutex());
259 name = value_sp->GetQualifiedTypeName().GetCString();
260 }
261 }
262 }
263
Greg Clayton49ce6822010-10-31 03:01:06 +0000264 if (log)
265 {
266 if (name)
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000267 log->Printf ("SBValue(%p)::GetTypeName () => \"%s\"", value_sp.get(), name);
Greg Clayton49ce6822010-10-31 03:01:06 +0000268 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000269 log->Printf ("SBValue(%p)::GetTypeName () => NULL", value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +0000270 }
271
272 return name;
Chris Lattner24943d22010-06-08 16:52:24 +0000273}
274
275size_t
276SBValue::GetByteSize ()
277{
Jim Ingham684d4012012-08-21 01:46:35 +0000278 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Chris Lattner24943d22010-06-08 16:52:24 +0000279 size_t result = 0;
280
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000281 lldb::ValueObjectSP value_sp(GetSP());
282 if (value_sp)
Jim Ingham684d4012012-08-21 01:46:35 +0000283 {
284 // For a dynamic type we might have to run code to determine the type we are going to report,
285 // and we might not have updated the type before we get asked this. So make sure to get the API lock.
286
287 ProcessSP process_sp(value_sp->GetProcessSP());
288 Process::StopLocker stop_locker;
289 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
290 {
291 if (log)
292 log->Printf ("SBValue(%p)::GetTypeName() => error: process is running", value_sp.get());
293 }
294 else
295 {
296 TargetSP target_sp(value_sp->GetTargetSP());
297 if (target_sp)
298 {
299 Mutex::Locker api_locker (target_sp->GetAPIMutex());
300 result = value_sp->GetByteSize();
301 }
302 }
303 }
Chris Lattner24943d22010-06-08 16:52:24 +0000304
Greg Clayton49ce6822010-10-31 03:01:06 +0000305 if (log)
Daniel Malea5f35a4b2012-11-29 21:49:15 +0000306 log->Printf ("SBValue(%p)::GetByteSize () => %" PRIu64, value_sp.get(), (uint64_t)result);
Greg Clayton49ce6822010-10-31 03:01:06 +0000307
Chris Lattner24943d22010-06-08 16:52:24 +0000308 return result;
309}
310
311bool
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000312SBValue::IsInScope ()
313{
Chris Lattner24943d22010-06-08 16:52:24 +0000314 bool result = false;
315
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000316 lldb::ValueObjectSP value_sp(GetSP());
317 if (value_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000318 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000319 TargetSP target_sp(value_sp->GetTargetSP());
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000320 if (target_sp)
Greg Claytonb9dcc512011-06-29 18:28:50 +0000321 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000322 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000323 result = value_sp->IsInScope ();
Greg Claytonb9dcc512011-06-29 18:28:50 +0000324 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000325 }
Chris Lattner24943d22010-06-08 16:52:24 +0000326
Greg Claytone005f2c2010-11-06 01:53:30 +0000327 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000328 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000329 log->Printf ("SBValue(%p)::IsInScope () => %i", value_sp.get(), result);
Greg Clayton49ce6822010-10-31 03:01:06 +0000330
Chris Lattner24943d22010-06-08 16:52:24 +0000331 return result;
332}
333
334const char *
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000335SBValue::GetValue ()
336{
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000337 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
338
Greg Clayton49ce6822010-10-31 03:01:06 +0000339 const char *cstr = NULL;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000340 lldb::ValueObjectSP value_sp(GetSP());
341 if (value_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000342 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000343 ProcessSP process_sp(value_sp->GetProcessSP());
344 Process::StopLocker stop_locker;
345 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Claytonb9dcc512011-06-29 18:28:50 +0000346 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000347 if (log)
348 log->Printf ("SBValue(%p)::GetValue() => error: process is running", value_sp.get());
349 }
350 else
351 {
352 TargetSP target_sp(value_sp->GetTargetSP());
353 if (target_sp)
354 {
355 Mutex::Locker api_locker (target_sp->GetAPIMutex());
356 cstr = value_sp->GetValueAsCString ();
357 }
Greg Claytonb9dcc512011-06-29 18:28:50 +0000358 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000359 }
Greg Clayton49ce6822010-10-31 03:01:06 +0000360 if (log)
361 {
362 if (cstr)
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000363 log->Printf ("SBValue(%p)::GetValue() => \"%s\"", value_sp.get(), cstr);
Greg Clayton49ce6822010-10-31 03:01:06 +0000364 else
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000365 log->Printf ("SBValue(%p)::GetValue() => NULL", value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +0000366 }
367
368 return cstr;
Chris Lattner24943d22010-06-08 16:52:24 +0000369}
370
Greg Claytonf3d0b0c2010-10-27 03:32:59 +0000371ValueType
372SBValue::GetValueType ()
373{
Greg Clayton49ce6822010-10-31 03:01:06 +0000374 ValueType result = eValueTypeInvalid;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000375 lldb::ValueObjectSP value_sp(GetSP());
376 if (value_sp)
377 result = value_sp->GetValueType();
Greg Claytone005f2c2010-11-06 01:53:30 +0000378 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000379 if (log)
380 {
381 switch (result)
382 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000383 case eValueTypeInvalid: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeInvalid", value_sp.get()); break;
384 case eValueTypeVariableGlobal: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableGlobal", value_sp.get()); break;
385 case eValueTypeVariableStatic: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableStatic", value_sp.get()); break;
386 case eValueTypeVariableArgument:log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableArgument", value_sp.get()); break;
387 case eValueTypeVariableLocal: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableLocal", value_sp.get()); break;
388 case eValueTypeRegister: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeRegister", value_sp.get()); break;
389 case eValueTypeRegisterSet: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeRegisterSet", value_sp.get()); break;
390 case eValueTypeConstResult: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeConstResult", value_sp.get()); break;
Greg Clayton49ce6822010-10-31 03:01:06 +0000391 }
392 }
393 return result;
Greg Claytonf3d0b0c2010-10-27 03:32:59 +0000394}
395
Jim Ingham4ae51962010-09-10 23:12:17 +0000396const char *
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000397SBValue::GetObjectDescription ()
398{
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000399 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000400 const char *cstr = NULL;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000401 lldb::ValueObjectSP value_sp(GetSP());
402 if (value_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000403 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000404 ProcessSP process_sp(value_sp->GetProcessSP());
405 Process::StopLocker stop_locker;
406 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Claytonb9dcc512011-06-29 18:28:50 +0000407 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000408 if (log)
409 log->Printf ("SBValue(%p)::GetObjectDescription() => error: process is running", value_sp.get());
410 }
411 else
412 {
413 TargetSP target_sp(value_sp->GetTargetSP());
414 if (target_sp)
415 {
416 Mutex::Locker api_locker (target_sp->GetAPIMutex());
417 cstr = value_sp->GetObjectDescription ();
418 }
Greg Claytonb9dcc512011-06-29 18:28:50 +0000419 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000420 }
Greg Clayton49ce6822010-10-31 03:01:06 +0000421 if (log)
422 {
423 if (cstr)
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000424 log->Printf ("SBValue(%p)::GetObjectDescription() => \"%s\"", value_sp.get(), cstr);
Greg Clayton49ce6822010-10-31 03:01:06 +0000425 else
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000426 log->Printf ("SBValue(%p)::GetObjectDescription() => NULL", value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +0000427 }
428 return cstr;
Jim Ingham4ae51962010-09-10 23:12:17 +0000429}
430
Enrico Granata979e20d2011-07-29 19:53:35 +0000431SBType
432SBValue::GetType()
433{
Jim Ingham5b4905d2012-04-13 18:30:20 +0000434 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000435 SBType sb_type;
436 lldb::ValueObjectSP value_sp(GetSP());
437 TypeImplSP type_sp;
438 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +0000439 {
Jim Ingham5b4905d2012-04-13 18:30:20 +0000440 ProcessSP process_sp(value_sp->GetProcessSP());
441 Process::StopLocker stop_locker;
442 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
443 {
444 if (log)
Greg Clayton12b7ea32012-06-04 20:13:23 +0000445 log->Printf ("SBValue(%p)::GetType() => error: process is running", value_sp.get());
Jim Ingham5b4905d2012-04-13 18:30:20 +0000446 }
447 else
448 {
449 TargetSP target_sp(value_sp->GetTargetSP());
450 if (target_sp)
451 {
452 Mutex::Locker api_locker (target_sp->GetAPIMutex());
453 type_sp.reset (new TypeImpl(ClangASTType (value_sp->GetClangAST(), value_sp->GetClangType())));
454 sb_type.SetSP(type_sp);
455 }
456 }
Enrico Granata979e20d2011-07-29 19:53:35 +0000457 }
Enrico Granata979e20d2011-07-29 19:53:35 +0000458 if (log)
459 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000460 if (type_sp)
461 log->Printf ("SBValue(%p)::GetType => SBType(%p)", value_sp.get(), type_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +0000462 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000463 log->Printf ("SBValue(%p)::GetType => NULL", value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +0000464 }
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000465 return sb_type;
Enrico Granata979e20d2011-07-29 19:53:35 +0000466}
467
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000468bool
469SBValue::GetValueDidChange ()
470{
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000471 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000472 bool result = false;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000473 lldb::ValueObjectSP value_sp(GetSP());
474 if (value_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000475 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000476 ProcessSP process_sp(value_sp->GetProcessSP());
477 Process::StopLocker stop_locker;
478 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Claytonb9dcc512011-06-29 18:28:50 +0000479 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000480 if (log)
481 log->Printf ("SBValue(%p)::GetValueDidChange() => error: process is running", value_sp.get());
482 }
483 else
484 {
485 TargetSP target_sp(value_sp->GetTargetSP());
486 if (target_sp)
487 {
488 Mutex::Locker api_locker (target_sp->GetAPIMutex());
489 result = value_sp->GetValueDidChange ();
490 }
Greg Claytonb9dcc512011-06-29 18:28:50 +0000491 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000492 }
Greg Clayton49ce6822010-10-31 03:01:06 +0000493 if (log)
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000494 log->Printf ("SBValue(%p)::GetValueDidChange() => %i", value_sp.get(), result);
Greg Clayton49ce6822010-10-31 03:01:06 +0000495
496 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000497}
498
Jason Molendac48ca822012-02-21 05:33:55 +0000499#ifndef LLDB_DISABLE_PYTHON
Chris Lattner24943d22010-06-08 16:52:24 +0000500const char *
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000501SBValue::GetSummary ()
502{
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000503 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000504 const char *cstr = NULL;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000505 lldb::ValueObjectSP value_sp(GetSP());
506 if (value_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000507 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000508 ProcessSP process_sp(value_sp->GetProcessSP());
509 Process::StopLocker stop_locker;
510 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Claytonb9dcc512011-06-29 18:28:50 +0000511 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000512 if (log)
513 log->Printf ("SBValue(%p)::GetSummary() => error: process is running", value_sp.get());
514 }
515 else
516 {
517 TargetSP target_sp(value_sp->GetTargetSP());
518 if (target_sp)
519 {
520 Mutex::Locker api_locker (target_sp->GetAPIMutex());
521 cstr = value_sp->GetSummaryAsCString();
522 }
Greg Claytonb9dcc512011-06-29 18:28:50 +0000523 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000524 }
Greg Clayton49ce6822010-10-31 03:01:06 +0000525 if (log)
526 {
527 if (cstr)
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000528 log->Printf ("SBValue(%p)::GetSummary() => \"%s\"", value_sp.get(), cstr);
Greg Clayton49ce6822010-10-31 03:01:06 +0000529 else
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000530 log->Printf ("SBValue(%p)::GetSummary() => NULL", value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +0000531 }
532 return cstr;
Chris Lattner24943d22010-06-08 16:52:24 +0000533}
Jason Molendac48ca822012-02-21 05:33:55 +0000534#endif // LLDB_DISABLE_PYTHON
Chris Lattner24943d22010-06-08 16:52:24 +0000535
536const char *
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000537SBValue::GetLocation ()
538{
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000539 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000540 const char *cstr = NULL;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000541 lldb::ValueObjectSP value_sp(GetSP());
542 if (value_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000543 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000544 ProcessSP process_sp(value_sp->GetProcessSP());
545 Process::StopLocker stop_locker;
546 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Claytonb9dcc512011-06-29 18:28:50 +0000547 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000548 if (log)
549 log->Printf ("SBValue(%p)::GetLocation() => error: process is running", value_sp.get());
550 }
551 else
552 {
553 TargetSP target_sp(value_sp->GetTargetSP());
554 if (target_sp)
555 {
556 Mutex::Locker api_locker (target_sp->GetAPIMutex());
557 cstr = value_sp->GetLocationAsCString();
558 }
Greg Claytonb9dcc512011-06-29 18:28:50 +0000559 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000560 }
Greg Clayton49ce6822010-10-31 03:01:06 +0000561 if (log)
562 {
563 if (cstr)
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000564 log->Printf ("SBValue(%p)::GetLocation() => \"%s\"", value_sp.get(), cstr);
Greg Clayton49ce6822010-10-31 03:01:06 +0000565 else
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000566 log->Printf ("SBValue(%p)::GetLocation() => NULL", value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +0000567 }
568 return cstr;
Chris Lattner24943d22010-06-08 16:52:24 +0000569}
570
Enrico Granata651cbe22012-05-08 21:25:06 +0000571// Deprecated - use the one that takes an lldb::SBError
Chris Lattner24943d22010-06-08 16:52:24 +0000572bool
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000573SBValue::SetValueFromCString (const char *value_str)
574{
Enrico Granata651cbe22012-05-08 21:25:06 +0000575 lldb::SBError dummy;
576 return SetValueFromCString(value_str,dummy);
577}
578
579bool
580SBValue::SetValueFromCString (const char *value_str, lldb::SBError& error)
581{
Chris Lattner24943d22010-06-08 16:52:24 +0000582 bool success = false;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000583 lldb::ValueObjectSP value_sp(GetSP());
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000584 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000585 if (value_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000586 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000587 ProcessSP process_sp(value_sp->GetProcessSP());
588 Process::StopLocker stop_locker;
589 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Claytonb9dcc512011-06-29 18:28:50 +0000590 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000591 if (log)
592 log->Printf ("SBValue(%p)::SetValueFromCString() => error: process is running", value_sp.get());
593 }
594 else
595 {
596 TargetSP target_sp(value_sp->GetTargetSP());
597 if (target_sp)
598 {
599 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Enrico Granata651cbe22012-05-08 21:25:06 +0000600 success = value_sp->SetValueFromCString (value_str,error.ref());
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000601 }
Greg Claytonb9dcc512011-06-29 18:28:50 +0000602 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000603 }
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000604 if (log)
605 log->Printf ("SBValue(%p)::SetValueFromCString(\"%s\") => %i", value_sp.get(), value_str, success);
606
Chris Lattner24943d22010-06-08 16:52:24 +0000607 return success;
608}
609
Enrico Granatad760907c2012-02-17 03:18:30 +0000610lldb::SBTypeFormat
611SBValue::GetTypeFormat ()
612{
613 lldb::SBTypeFormat format;
614 lldb::ValueObjectSP value_sp(GetSP());
615 if (value_sp)
616 {
Jim Ingham5b4905d2012-04-13 18:30:20 +0000617 ProcessSP process_sp(value_sp->GetProcessSP());
618 Process::StopLocker stop_locker;
619 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granatad760907c2012-02-17 03:18:30 +0000620 {
Jim Ingham5b4905d2012-04-13 18:30:20 +0000621 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
622 if (log)
Greg Clayton12b7ea32012-06-04 20:13:23 +0000623 log->Printf ("SBValue(%p)::GetTypeFormat() => error: process is running", value_sp.get());
Jim Ingham5b4905d2012-04-13 18:30:20 +0000624 }
625 else
626 {
627 TargetSP target_sp(value_sp->GetTargetSP());
628 if (target_sp)
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000629 {
Jim Ingham5b4905d2012-04-13 18:30:20 +0000630 Mutex::Locker api_locker (target_sp->GetAPIMutex());
631 if (value_sp->UpdateValueIfNeeded(true))
632 {
633 lldb::TypeFormatImplSP format_sp = value_sp->GetValueFormat();
634 if (format_sp)
635 format.SetSP(format_sp);
636 }
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000637 }
Enrico Granatad760907c2012-02-17 03:18:30 +0000638 }
639 }
640 return format;
641}
642
Jason Molendac48ca822012-02-21 05:33:55 +0000643#ifndef LLDB_DISABLE_PYTHON
Enrico Granatad760907c2012-02-17 03:18:30 +0000644lldb::SBTypeSummary
645SBValue::GetTypeSummary ()
646{
647 lldb::SBTypeSummary summary;
648 lldb::ValueObjectSP value_sp(GetSP());
649 if (value_sp)
650 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000651 ProcessSP process_sp(value_sp->GetProcessSP());
652 Process::StopLocker stop_locker;
653 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granatad760907c2012-02-17 03:18:30 +0000654 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000655 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
656 if (log)
657 log->Printf ("SBValue(%p)::GetTypeSummary() => error: process is running", value_sp.get());
658 }
659 else
660 {
661 TargetSP target_sp(value_sp->GetTargetSP());
662 if (target_sp)
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000663 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000664 Mutex::Locker api_locker (target_sp->GetAPIMutex());
665 if (value_sp->UpdateValueIfNeeded(true))
666 {
667 lldb::TypeSummaryImplSP summary_sp = value_sp->GetSummaryFormat();
668 if (summary_sp)
669 summary.SetSP(summary_sp);
670 }
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000671 }
Enrico Granatad760907c2012-02-17 03:18:30 +0000672 }
673 }
674 return summary;
675}
Jason Molendac48ca822012-02-21 05:33:55 +0000676#endif // LLDB_DISABLE_PYTHON
Enrico Granatad760907c2012-02-17 03:18:30 +0000677
678lldb::SBTypeFilter
679SBValue::GetTypeFilter ()
680{
681 lldb::SBTypeFilter filter;
682 lldb::ValueObjectSP value_sp(GetSP());
683 if (value_sp)
684 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000685 ProcessSP process_sp(value_sp->GetProcessSP());
686 Process::StopLocker stop_locker;
687 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granatad760907c2012-02-17 03:18:30 +0000688 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000689 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
690 if (log)
691 log->Printf ("SBValue(%p)::GetTypeFilter() => error: process is running", value_sp.get());
692 }
693 else
694 {
695 TargetSP target_sp(value_sp->GetTargetSP());
696 if (target_sp)
Enrico Granatad760907c2012-02-17 03:18:30 +0000697 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000698 Mutex::Locker api_locker (target_sp->GetAPIMutex());
699 if (value_sp->UpdateValueIfNeeded(true))
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000700 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000701 lldb::SyntheticChildrenSP synthetic_sp = value_sp->GetSyntheticChildren();
702
703 if (synthetic_sp && !synthetic_sp->IsScripted())
704 {
705 TypeFilterImplSP filter_sp = STD_STATIC_POINTER_CAST(TypeFilterImpl,synthetic_sp);
706 filter.SetSP(filter_sp);
707 }
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000708 }
Enrico Granatad760907c2012-02-17 03:18:30 +0000709 }
710 }
711 }
712 return filter;
713}
714
Jason Molendac48ca822012-02-21 05:33:55 +0000715#ifndef LLDB_DISABLE_PYTHON
Enrico Granatad760907c2012-02-17 03:18:30 +0000716lldb::SBTypeSynthetic
717SBValue::GetTypeSynthetic ()
718{
719 lldb::SBTypeSynthetic synthetic;
720 lldb::ValueObjectSP value_sp(GetSP());
721 if (value_sp)
722 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000723 ProcessSP process_sp(value_sp->GetProcessSP());
724 Process::StopLocker stop_locker;
725 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granatad760907c2012-02-17 03:18:30 +0000726 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000727 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
728 if (log)
729 log->Printf ("SBValue(%p)::GetTypeSynthetic() => error: process is running", value_sp.get());
730 }
731 else
732 {
733 TargetSP target_sp(value_sp->GetTargetSP());
734 if (target_sp)
Enrico Granatad760907c2012-02-17 03:18:30 +0000735 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000736 Mutex::Locker api_locker (target_sp->GetAPIMutex());
737 if (value_sp->UpdateValueIfNeeded(true))
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000738 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000739 lldb::SyntheticChildrenSP children_sp = value_sp->GetSyntheticChildren();
740
741 if (children_sp && children_sp->IsScripted())
742 {
743 TypeSyntheticImplSP synth_sp = STD_STATIC_POINTER_CAST(TypeSyntheticImpl,children_sp);
744 synthetic.SetSP(synth_sp);
745 }
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000746 }
Enrico Granatad760907c2012-02-17 03:18:30 +0000747 }
748 }
749 }
750 return synthetic;
751}
Jason Molendac48ca822012-02-21 05:33:55 +0000752#endif
Enrico Granatad760907c2012-02-17 03:18:30 +0000753
Enrico Granata979e20d2011-07-29 19:53:35 +0000754lldb::SBValue
Greg Claytond68e0892011-09-09 23:04:00 +0000755SBValue::CreateChildAtOffset (const char *name, uint32_t offset, SBType type)
Enrico Granata979e20d2011-07-29 19:53:35 +0000756{
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000757 lldb::SBValue sb_value;
758 lldb::ValueObjectSP value_sp(GetSP());
759 lldb::ValueObjectSP new_value_sp;
760 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +0000761 {
Jim Ingham5b4905d2012-04-13 18:30:20 +0000762 ProcessSP process_sp(value_sp->GetProcessSP());
763 Process::StopLocker stop_locker;
764 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granata979e20d2011-07-29 19:53:35 +0000765 {
Jim Ingham5b4905d2012-04-13 18:30:20 +0000766 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
767 if (log)
Greg Clayton12b7ea32012-06-04 20:13:23 +0000768 log->Printf ("SBValue(%p)::CreateChildAtOffset() => error: process is running", value_sp.get());
Jim Ingham5b4905d2012-04-13 18:30:20 +0000769 }
770 else
771 {
772 TargetSP target_sp(value_sp->GetTargetSP());
773 if (target_sp)
774 {
775 Mutex::Locker api_locker (target_sp->GetAPIMutex());
776 TypeImplSP type_sp (type.GetSP());
777 if (type.IsValid())
778 {
Enrico Granata3d656c72012-10-22 18:18:36 +0000779 sb_value.SetSP(value_sp->GetSyntheticChildAtOffset(offset, type_sp->GetClangASTType(), true),GetPreferDynamicValue(),GetPreferSyntheticValue());
Jim Ingham5b4905d2012-04-13 18:30:20 +0000780 new_value_sp = sb_value.GetSP();
781 if (new_value_sp)
782 new_value_sp->SetName(ConstString(name));
783 }
784 }
Enrico Granata979e20d2011-07-29 19:53:35 +0000785 }
786 }
787 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
788 if (log)
789 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000790 if (new_value_sp)
Jim Ingham47beabb2012-10-16 21:41:58 +0000791 log->Printf ("SBValue(%p)::CreateChildAtOffset => \"%s\"",
792 value_sp.get(),
793 new_value_sp->GetName().AsCString());
Enrico Granata979e20d2011-07-29 19:53:35 +0000794 else
Jim Ingham47beabb2012-10-16 21:41:58 +0000795 log->Printf ("SBValue(%p)::CreateChildAtOffset => NULL",
796 value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +0000797 }
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000798 return sb_value;
Enrico Granata979e20d2011-07-29 19:53:35 +0000799}
800
801lldb::SBValue
Greg Claytond68e0892011-09-09 23:04:00 +0000802SBValue::Cast (SBType type)
Enrico Granata979e20d2011-07-29 19:53:35 +0000803{
Greg Clayton4eb01a72012-01-31 04:25:15 +0000804 lldb::SBValue sb_value;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000805 lldb::ValueObjectSP value_sp(GetSP());
806 TypeImplSP type_sp (type.GetSP());
807 if (value_sp && type_sp)
Enrico Granata3d656c72012-10-22 18:18:36 +0000808 sb_value.SetSP(value_sp->Cast(type_sp->GetClangASTType()),GetPreferDynamicValue(),GetPreferSyntheticValue());
Greg Clayton4eb01a72012-01-31 04:25:15 +0000809 return sb_value;
Enrico Granata979e20d2011-07-29 19:53:35 +0000810}
811
812lldb::SBValue
813SBValue::CreateValueFromExpression (const char *name, const char* expression)
814{
Jim Ingham47beabb2012-10-16 21:41:58 +0000815 SBExpressionOptions options;
Greg Clayton75a443b2012-10-16 22:58:25 +0000816 options.ref().SetKeepInMemory(true);
Jim Ingham47beabb2012-10-16 21:41:58 +0000817 return CreateValueFromExpression (name, expression, options);
818}
819
820lldb::SBValue
821SBValue::CreateValueFromExpression (const char *name, const char *expression, SBExpressionOptions &options)
822{
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000823 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000824 lldb::SBValue sb_value;
825 lldb::ValueObjectSP value_sp(GetSP());
826 lldb::ValueObjectSP new_value_sp;
827 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +0000828 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000829 ExecutionContext exe_ctx (value_sp->GetExecutionContextRef());
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000830 ProcessSP process_sp(exe_ctx.GetProcessSP());
831 Process::StopLocker stop_locker;
832 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Johnny Chen9fd2e382011-12-20 01:52:44 +0000833 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000834 if (log)
835 log->Printf ("SBValue(%p)::CreateValueFromExpression() => error: process is running", value_sp.get());
836 }
837 else
838 {
839 Target* target = exe_ctx.GetTargetPtr();
840 if (target)
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000841 {
Greg Clayton75a443b2012-10-16 22:58:25 +0000842 options.ref().SetKeepInMemory(true);
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000843 target->EvaluateExpression (expression,
844 exe_ctx.GetFramePtr(),
Enrico Granatad27026e2012-09-05 20:41:26 +0000845 new_value_sp,
Jim Ingham47beabb2012-10-16 21:41:58 +0000846 options.ref());
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000847 if (new_value_sp)
848 {
849 new_value_sp->SetName(ConstString(name));
850 sb_value.SetSP(new_value_sp);
851 }
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000852 }
Johnny Chen9fd2e382011-12-20 01:52:44 +0000853 }
Enrico Granata979e20d2011-07-29 19:53:35 +0000854 }
Enrico Granata979e20d2011-07-29 19:53:35 +0000855 if (log)
856 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000857 if (new_value_sp)
Greg Clayton12b7ea32012-06-04 20:13:23 +0000858 log->Printf ("SBValue(%p)::CreateValueFromExpression(name=\"%s\", expression=\"%s\") => SBValue (%p)",
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000859 value_sp.get(),
860 name,
861 expression,
862 new_value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +0000863 else
Greg Clayton12b7ea32012-06-04 20:13:23 +0000864 log->Printf ("SBValue(%p)::CreateValueFromExpression(name=\"%s\", expression=\"%s\") => NULL",
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000865 value_sp.get(),
866 name,
867 expression);
Enrico Granata979e20d2011-07-29 19:53:35 +0000868 }
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000869 return sb_value;
Enrico Granata979e20d2011-07-29 19:53:35 +0000870}
871
872lldb::SBValue
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000873SBValue::CreateValueFromAddress(const char* name, lldb::addr_t address, SBType sb_type)
Enrico Granata979e20d2011-07-29 19:53:35 +0000874{
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000875 lldb::SBValue sb_value;
876 lldb::ValueObjectSP value_sp(GetSP());
877 lldb::ValueObjectSP new_value_sp;
878 lldb::TypeImplSP type_impl_sp (sb_type.GetSP());
879 if (value_sp && type_impl_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +0000880 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000881 ClangASTType pointee_ast_type(type_impl_sp->GetASTContext(), type_impl_sp->GetClangASTType().GetPointerType ());
882 lldb::TypeImplSP pointee_type_impl_sp (new TypeImpl(pointee_ast_type));
883 if (pointee_type_impl_sp)
Enrico Granatac9310302011-08-04 17:07:02 +0000884 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000885
886 lldb::DataBufferSP buffer(new lldb_private::DataBufferHeap(&address,sizeof(lldb::addr_t)));
887
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000888 ExecutionContext exe_ctx (value_sp->GetExecutionContextRef());
889 ValueObjectSP ptr_result_valobj_sp(ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000890 pointee_type_impl_sp->GetASTContext(),
891 pointee_type_impl_sp->GetOpaqueQualType(),
892 ConstString(name),
893 buffer,
894 lldb::endian::InlHostByteOrder(),
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000895 exe_ctx.GetAddressByteSize()));
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000896
897 if (ptr_result_valobj_sp)
898 {
899 ptr_result_valobj_sp->GetValue().SetValueType(Value::eValueTypeLoadAddress);
900 Error err;
901 new_value_sp = ptr_result_valobj_sp->Dereference(err);
902 if (new_value_sp)
903 new_value_sp->SetName(ConstString(name));
904 }
905 sb_value.SetSP(new_value_sp);
Enrico Granatac9310302011-08-04 17:07:02 +0000906 }
Enrico Granata979e20d2011-07-29 19:53:35 +0000907 }
908 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
909 if (log)
910 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000911 if (new_value_sp)
912 log->Printf ("SBValue(%p)::CreateValueFromAddress => \"%s\"", value_sp.get(), new_value_sp->GetName().AsCString());
Johnny Chena713b862011-08-09 22:38:07 +0000913 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000914 log->Printf ("SBValue(%p)::CreateValueFromAddress => NULL", value_sp.get());
Johnny Chena713b862011-08-09 22:38:07 +0000915 }
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000916 return sb_value;
Enrico Granata979e20d2011-07-29 19:53:35 +0000917}
918
Enrico Granata91544802011-09-06 19:20:51 +0000919lldb::SBValue
Greg Claytond68e0892011-09-09 23:04:00 +0000920SBValue::CreateValueFromData (const char* name, SBData data, SBType type)
Enrico Granata91544802011-09-06 19:20:51 +0000921{
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000922 lldb::SBValue sb_value;
923 lldb::ValueObjectSP new_value_sp;
924 lldb::ValueObjectSP value_sp(GetSP());
925 if (value_sp)
Enrico Granata91544802011-09-06 19:20:51 +0000926 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000927 ExecutionContext exe_ctx (value_sp->GetExecutionContextRef());
928
929 new_value_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000930 type.m_opaque_sp->GetASTContext() ,
931 type.m_opaque_sp->GetOpaqueQualType(),
932 ConstString(name),
933 *data.m_opaque_sp,
934 LLDB_INVALID_ADDRESS);
935 new_value_sp->SetAddressTypeOfChildren(eAddressTypeLoad);
936 sb_value.SetSP(new_value_sp);
Enrico Granata91544802011-09-06 19:20:51 +0000937 }
938 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
939 if (log)
940 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000941 if (new_value_sp)
Greg Clayton12b7ea32012-06-04 20:13:23 +0000942 log->Printf ("SBValue(%p)::CreateValueFromData => \"%s\"", value_sp.get(), new_value_sp->GetName().AsCString());
Enrico Granata91544802011-09-06 19:20:51 +0000943 else
Greg Clayton12b7ea32012-06-04 20:13:23 +0000944 log->Printf ("SBValue(%p)::CreateValueFromData => NULL", value_sp.get());
Enrico Granata91544802011-09-06 19:20:51 +0000945 }
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000946 return sb_value;
Enrico Granata91544802011-09-06 19:20:51 +0000947}
948
Chris Lattner24943d22010-06-08 16:52:24 +0000949SBValue
950SBValue::GetChildAtIndex (uint32_t idx)
951{
Greg Clayton8f64c472011-07-15 19:31:49 +0000952 const bool can_create_synthetic = false;
953 lldb::DynamicValueType use_dynamic = eNoDynamicValues;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000954 lldb::ValueObjectSP value_sp(GetSP());
955 if (value_sp)
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000956 {
957 TargetSP target_sp(value_sp->GetTargetSP());
958 if (target_sp)
959 use_dynamic = target_sp->GetPreferDynamicValue();
960 }
Greg Clayton8f64c472011-07-15 19:31:49 +0000961 return GetChildAtIndex (idx, use_dynamic, can_create_synthetic);
Jim Inghame41494a2011-04-16 00:01:13 +0000962}
963
964SBValue
Greg Clayton8f64c472011-07-15 19:31:49 +0000965SBValue::GetChildAtIndex (uint32_t idx, lldb::DynamicValueType use_dynamic, bool can_create_synthetic)
Jim Inghame41494a2011-04-16 00:01:13 +0000966{
Chris Lattner24943d22010-06-08 16:52:24 +0000967 lldb::ValueObjectSP child_sp;
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000968 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Chris Lattner24943d22010-06-08 16:52:24 +0000969
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000970 lldb::ValueObjectSP value_sp(GetSP());
971 if (value_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000972 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000973 ProcessSP process_sp(value_sp->GetProcessSP());
974 Process::StopLocker stop_locker;
975 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Claytonb9dcc512011-06-29 18:28:50 +0000976 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000977 if (log)
978 log->Printf ("SBValue(%p)::GetChildAtIndex() => error: process is running", value_sp.get());
979 }
980 else
981 {
982 TargetSP target_sp(value_sp->GetTargetSP());
983 if (target_sp)
Greg Claytonfab305b2011-05-20 23:51:26 +0000984 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000985 Mutex::Locker api_locker (target_sp->GetAPIMutex());
986 const bool can_create = true;
987 child_sp = value_sp->GetChildAtIndex (idx, can_create);
988 if (can_create_synthetic && !child_sp)
Greg Claytonb9dcc512011-06-29 18:28:50 +0000989 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000990 if (value_sp->IsPointerType())
991 {
992 child_sp = value_sp->GetSyntheticArrayMemberFromPointer(idx, can_create);
993 }
994 else if (value_sp->IsArrayType())
995 {
996 child_sp = value_sp->GetSyntheticArrayMemberFromArray(idx, can_create);
997 }
Greg Clayton8f64c472011-07-15 19:31:49 +0000998 }
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000999
Greg Claytonfab305b2011-05-20 23:51:26 +00001000 }
Jim Inghame41494a2011-04-16 00:01:13 +00001001 }
1002 }
1003
Enrico Granata3d656c72012-10-22 18:18:36 +00001004 SBValue sb_value;
1005 sb_value.SetSP (child_sp, use_dynamic, GetPreferSyntheticValue());
Greg Clayton49ce6822010-10-31 03:01:06 +00001006 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001007 log->Printf ("SBValue(%p)::GetChildAtIndex (%u) => SBValue(%p)", value_sp.get(), idx, value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +00001008
Chris Lattner24943d22010-06-08 16:52:24 +00001009 return sb_value;
1010}
1011
1012uint32_t
1013SBValue::GetIndexOfChildWithName (const char *name)
1014{
Greg Clayton49ce6822010-10-31 03:01:06 +00001015 uint32_t idx = UINT32_MAX;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001016 lldb::ValueObjectSP value_sp(GetSP());
1017 if (value_sp)
Greg Claytonfab305b2011-05-20 23:51:26 +00001018 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001019 TargetSP target_sp(value_sp->GetTargetSP());
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001020 if (target_sp)
Greg Claytonb9dcc512011-06-29 18:28:50 +00001021 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001022 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Claytonfab305b2011-05-20 23:51:26 +00001023
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001024 idx = value_sp->GetIndexOfChildWithName (ConstString(name));
Greg Claytonb9dcc512011-06-29 18:28:50 +00001025 }
Greg Claytonfab305b2011-05-20 23:51:26 +00001026 }
Greg Claytone005f2c2010-11-06 01:53:30 +00001027 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +00001028 if (log)
1029 {
1030 if (idx == UINT32_MAX)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001031 log->Printf ("SBValue(%p)::GetIndexOfChildWithName (name=\"%s\") => NOT FOUND", value_sp.get(), name);
Greg Clayton49ce6822010-10-31 03:01:06 +00001032 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001033 log->Printf ("SBValue(%p)::GetIndexOfChildWithName (name=\"%s\") => %u", value_sp.get(), name, idx);
Greg Clayton49ce6822010-10-31 03:01:06 +00001034 }
1035 return idx;
Chris Lattner24943d22010-06-08 16:52:24 +00001036}
1037
1038SBValue
1039SBValue::GetChildMemberWithName (const char *name)
1040{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001041 lldb::ValueObjectSP value_sp(GetSP());
1042 if (value_sp)
Johnny Chen446ccaa2011-06-29 21:19:39 +00001043 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001044 lldb::DynamicValueType use_dynamic_value = eNoDynamicValues;
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001045 TargetSP target_sp(value_sp->GetTargetSP());
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001046 if (target_sp)
1047 {
1048 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1049 use_dynamic_value = target_sp->GetPreferDynamicValue();
1050 }
Johnny Chen446ccaa2011-06-29 21:19:39 +00001051 return GetChildMemberWithName (name, use_dynamic_value);
1052 }
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001053 return SBValue();
Jim Inghame41494a2011-04-16 00:01:13 +00001054}
1055
1056SBValue
Jim Ingham10de7d12011-05-04 03:43:18 +00001057SBValue::GetChildMemberWithName (const char *name, lldb::DynamicValueType use_dynamic_value)
Jim Inghame41494a2011-04-16 00:01:13 +00001058{
Chris Lattner24943d22010-06-08 16:52:24 +00001059 lldb::ValueObjectSP child_sp;
1060 const ConstString str_name (name);
1061
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001062 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton905acaf2011-05-20 22:07:17 +00001063
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001064 lldb::ValueObjectSP value_sp(GetSP());
1065 if (value_sp)
Chris Lattner24943d22010-06-08 16:52:24 +00001066 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001067 ProcessSP process_sp(value_sp->GetProcessSP());
1068 Process::StopLocker stop_locker;
1069 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Jim Inghame41494a2011-04-16 00:01:13 +00001070 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001071 if (log)
1072 log->Printf ("SBValue(%p)::GetChildMemberWithName() => error: process is running", value_sp.get());
1073 }
1074 else
1075 {
1076 TargetSP target_sp(value_sp->GetTargetSP());
1077 if (target_sp)
Greg Claytonfab305b2011-05-20 23:51:26 +00001078 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001079 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1080 child_sp = value_sp->GetChildMemberWithName (str_name, true);
Greg Claytonfab305b2011-05-20 23:51:26 +00001081 }
Jim Inghame41494a2011-04-16 00:01:13 +00001082 }
1083 }
1084
Enrico Granata3d656c72012-10-22 18:18:36 +00001085 SBValue sb_value;
1086 sb_value.SetSP(child_sp, use_dynamic_value, GetPreferSyntheticValue());
Greg Clayton49ce6822010-10-31 03:01:06 +00001087
Greg Clayton49ce6822010-10-31 03:01:06 +00001088 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001089 log->Printf ("SBValue(%p)::GetChildMemberWithName (name=\"%s\") => SBValue(%p)", value_sp.get(), name, value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +00001090
Chris Lattner24943d22010-06-08 16:52:24 +00001091 return sb_value;
1092}
1093
Enrico Granataf7a9b142011-07-15 02:26:42 +00001094lldb::SBValue
Jim Ingham1b425752011-12-08 19:44:08 +00001095SBValue::GetDynamicValue (lldb::DynamicValueType use_dynamic)
1096{
Enrico Granata3d656c72012-10-22 18:18:36 +00001097 SBValue value_sb;
1098 if (IsValid())
Jim Ingham1b425752011-12-08 19:44:08 +00001099 {
Enrico Granata3d656c72012-10-22 18:18:36 +00001100 ValueImplSP proxy_sp(new ValueImpl(m_opaque_sp->GetRootSP(),use_dynamic,m_opaque_sp->GetUseSynthetic()));
1101 value_sb.SetSP(proxy_sp);
Jim Ingham1b425752011-12-08 19:44:08 +00001102 }
Enrico Granata3d656c72012-10-22 18:18:36 +00001103 return value_sb;
Jim Ingham1b425752011-12-08 19:44:08 +00001104}
1105
1106lldb::SBValue
1107SBValue::GetStaticValue ()
1108{
Enrico Granata3d656c72012-10-22 18:18:36 +00001109 SBValue value_sb;
1110 if (IsValid())
Jim Ingham1b425752011-12-08 19:44:08 +00001111 {
Enrico Granata3d656c72012-10-22 18:18:36 +00001112 ValueImplSP proxy_sp(new ValueImpl(m_opaque_sp->GetRootSP(),eNoDynamicValues,m_opaque_sp->GetUseSynthetic()));
1113 value_sb.SetSP(proxy_sp);
Jim Ingham1b425752011-12-08 19:44:08 +00001114 }
Enrico Granata3d656c72012-10-22 18:18:36 +00001115 return value_sb;
Jim Ingham1b425752011-12-08 19:44:08 +00001116}
1117
Enrico Granatadba1de82012-03-27 02:35:13 +00001118lldb::SBValue
1119SBValue::GetNonSyntheticValue ()
1120{
Enrico Granata3d656c72012-10-22 18:18:36 +00001121 SBValue value_sb;
1122 if (IsValid())
Enrico Granatadba1de82012-03-27 02:35:13 +00001123 {
Enrico Granata3d656c72012-10-22 18:18:36 +00001124 ValueImplSP proxy_sp(new ValueImpl(m_opaque_sp->GetRootSP(),m_opaque_sp->GetUseDynamic(),false));
1125 value_sb.SetSP(proxy_sp);
Enrico Granatadba1de82012-03-27 02:35:13 +00001126 }
Enrico Granata3d656c72012-10-22 18:18:36 +00001127 return value_sb;
1128}
1129
1130lldb::DynamicValueType
1131SBValue::GetPreferDynamicValue ()
1132{
1133 if (!IsValid())
1134 return eNoDynamicValues;
1135 return m_opaque_sp->GetUseDynamic();
1136}
1137
1138void
1139SBValue::SetPreferDynamicValue (lldb::DynamicValueType use_dynamic)
1140{
1141 if (IsValid())
1142 return m_opaque_sp->SetUseDynamic (use_dynamic);
1143}
1144
1145bool
1146SBValue::GetPreferSyntheticValue ()
1147{
1148 if (!IsValid())
1149 return false;
1150 return m_opaque_sp->GetUseSynthetic();
1151}
1152
1153void
1154SBValue::SetPreferSyntheticValue (bool use_synthetic)
1155{
1156 if (IsValid())
1157 return m_opaque_sp->SetUseSynthetic (use_synthetic);
Enrico Granatadba1de82012-03-27 02:35:13 +00001158}
1159
Jim Ingham1b425752011-12-08 19:44:08 +00001160bool
1161SBValue::IsDynamic()
1162{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001163 lldb::ValueObjectSP value_sp(GetSP());
1164 if (value_sp)
Jim Ingham1b425752011-12-08 19:44:08 +00001165 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001166 TargetSP target_sp(value_sp->GetTargetSP());
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001167 if (target_sp)
Jim Ingham1b425752011-12-08 19:44:08 +00001168 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001169 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001170 return value_sp->IsDynamic();
Jim Ingham1b425752011-12-08 19:44:08 +00001171 }
1172 }
1173 return false;
1174}
1175
Enrico Granata3d656c72012-10-22 18:18:36 +00001176bool
1177SBValue::IsSynthetic ()
1178{
1179 lldb::ValueObjectSP value_sp(GetSP());
1180 if (value_sp)
1181 {
1182 TargetSP target_sp(value_sp->GetTargetSP());
1183 if (target_sp)
1184 {
1185 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1186 return value_sp->IsSynthetic();
1187 }
1188 }
1189 return false;
1190}
1191
Jim Ingham1b425752011-12-08 19:44:08 +00001192lldb::SBValue
Enrico Granataf7a9b142011-07-15 02:26:42 +00001193SBValue::GetValueForExpressionPath(const char* expr_path)
1194{
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001195 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granataf7a9b142011-07-15 02:26:42 +00001196 lldb::ValueObjectSP child_sp;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001197 lldb::ValueObjectSP value_sp(GetSP());
1198 if (value_sp)
Enrico Granataf7a9b142011-07-15 02:26:42 +00001199 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001200 ProcessSP process_sp(value_sp->GetProcessSP());
1201 Process::StopLocker stop_locker;
1202 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granataf7a9b142011-07-15 02:26:42 +00001203 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001204 if (log)
1205 log->Printf ("SBValue(%p)::GetValueForExpressionPath() => error: process is running", value_sp.get());
1206 }
1207 else
1208 {
1209 TargetSP target_sp(value_sp->GetTargetSP());
1210 if (target_sp)
1211 {
1212 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1213 // using default values for all the fancy options, just do it if you can
1214 child_sp = value_sp->GetValueForExpressionPath(expr_path);
1215 }
Enrico Granataf7a9b142011-07-15 02:26:42 +00001216 }
1217 }
1218
Enrico Granata3d656c72012-10-22 18:18:36 +00001219 SBValue sb_value;
1220 sb_value.SetSP(child_sp,GetPreferDynamicValue(),GetPreferSyntheticValue());
Enrico Granataf7a9b142011-07-15 02:26:42 +00001221
Enrico Granataf7a9b142011-07-15 02:26:42 +00001222 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001223 log->Printf ("SBValue(%p)::GetValueForExpressionPath (expr_path=\"%s\") => SBValue(%p)", value_sp.get(), expr_path, value_sp.get());
Enrico Granataf7a9b142011-07-15 02:26:42 +00001224
1225 return sb_value;
1226}
Chris Lattner24943d22010-06-08 16:52:24 +00001227
Greg Clayton0fb0bcc2011-08-03 22:57:10 +00001228int64_t
Enrico Granatac92eb402011-08-04 01:41:02 +00001229SBValue::GetValueAsSigned(SBError& error, int64_t fail_value)
1230{
Jim Ingham574c3d62011-08-12 23:34:31 +00001231 error.Clear();
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001232 lldb::ValueObjectSP value_sp(GetSP());
1233 if (value_sp)
Enrico Granatac92eb402011-08-04 01:41:02 +00001234 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001235 ProcessSP process_sp(value_sp->GetProcessSP());
1236 Process::StopLocker stop_locker;
1237 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granatac92eb402011-08-04 01:41:02 +00001238 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001239 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1240 if (log)
1241 log->Printf ("SBValue(%p)::GetValueAsSigned() => error: process is running", value_sp.get());
1242 error.SetErrorString("process is running");
Enrico Granatac92eb402011-08-04 01:41:02 +00001243 }
1244 else
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001245 {
1246 TargetSP target_sp(value_sp->GetTargetSP());
1247 if (target_sp)
1248 {
1249 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1250 Scalar scalar;
1251 if (value_sp->ResolveValue (scalar))
Enrico Granata0fd6c8d2012-10-24 18:14:21 +00001252 return scalar.SLongLong(fail_value);
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001253 else
1254 error.SetErrorString("could not get value");
1255 }
1256 else
1257 error.SetErrorString("could not get target");
1258 }
Enrico Granatac92eb402011-08-04 01:41:02 +00001259 }
1260 error.SetErrorString("invalid SBValue");
1261 return fail_value;
1262}
1263
1264uint64_t
1265SBValue::GetValueAsUnsigned(SBError& error, uint64_t fail_value)
1266{
Jim Ingham574c3d62011-08-12 23:34:31 +00001267 error.Clear();
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001268 lldb::ValueObjectSP value_sp(GetSP());
1269 if (value_sp)
Enrico Granatac92eb402011-08-04 01:41:02 +00001270 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001271 ProcessSP process_sp(value_sp->GetProcessSP());
1272 Process::StopLocker stop_locker;
1273 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granatac92eb402011-08-04 01:41:02 +00001274 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001275 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1276 if (log)
1277 log->Printf ("SBValue(%p)::GetValueAsUnsigned() => error: process is running", value_sp.get());
1278 error.SetErrorString("process is running");
Enrico Granatac92eb402011-08-04 01:41:02 +00001279 }
1280 else
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001281 {
1282 TargetSP target_sp(value_sp->GetTargetSP());
1283 if (target_sp)
1284 {
1285 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1286 Scalar scalar;
1287 if (value_sp->ResolveValue (scalar))
Enrico Granata4a0a1252012-10-24 20:24:39 +00001288 return scalar.ULongLong(fail_value);
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001289 else
1290 error.SetErrorString("could not get value");
1291 }
1292 else
1293 error.SetErrorString("could not get target");
1294 }
Enrico Granatac92eb402011-08-04 01:41:02 +00001295 }
1296 error.SetErrorString("invalid SBValue");
1297 return fail_value;
1298}
1299
1300int64_t
Greg Clayton0fb0bcc2011-08-03 22:57:10 +00001301SBValue::GetValueAsSigned(int64_t fail_value)
1302{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001303 lldb::ValueObjectSP value_sp(GetSP());
1304 if (value_sp)
Greg Clayton0fb0bcc2011-08-03 22:57:10 +00001305 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001306 ProcessSP process_sp(value_sp->GetProcessSP());
1307 Process::StopLocker stop_locker;
1308 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Clayton0fb0bcc2011-08-03 22:57:10 +00001309 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001310 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1311 if (log)
1312 log->Printf ("SBValue(%p)::GetValueAsSigned() => error: process is running", value_sp.get());
1313 }
1314 else
1315 {
1316 TargetSP target_sp(value_sp->GetTargetSP());
1317 if (target_sp)
1318 {
1319 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1320 Scalar scalar;
1321 if (value_sp->ResolveValue (scalar))
Enrico Granata0fd6c8d2012-10-24 18:14:21 +00001322 return scalar.SLongLong(fail_value);
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001323 }
Greg Clayton0fb0bcc2011-08-03 22:57:10 +00001324 }
1325 }
1326 return fail_value;
1327}
1328
1329uint64_t
1330SBValue::GetValueAsUnsigned(uint64_t fail_value)
1331{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001332 lldb::ValueObjectSP value_sp(GetSP());
1333 if (value_sp)
Greg Clayton0fb0bcc2011-08-03 22:57:10 +00001334 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001335 ProcessSP process_sp(value_sp->GetProcessSP());
1336 Process::StopLocker stop_locker;
1337 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Clayton0fb0bcc2011-08-03 22:57:10 +00001338 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001339 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1340 if (log)
1341 log->Printf ("SBValue(%p)::GetValueAsUnsigned() => error: process is running", value_sp.get());
1342 }
1343 else
1344 {
1345 TargetSP target_sp(value_sp->GetTargetSP());
1346 if (target_sp)
1347 {
1348 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1349 Scalar scalar;
1350 if (value_sp->ResolveValue (scalar))
Enrico Granata4a0a1252012-10-24 20:24:39 +00001351 return scalar.ULongLong(fail_value);
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001352 }
Greg Clayton0fb0bcc2011-08-03 22:57:10 +00001353 }
1354 }
1355 return fail_value;
1356}
1357
Greg Clayton54037b12012-10-23 01:50:10 +00001358bool
1359SBValue::MightHaveChildren ()
1360{
1361 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1362 bool has_children = false;
1363 lldb::ValueObjectSP value_sp(GetSP());
1364 if (value_sp)
1365 has_children = value_sp->MightHaveChildren();
1366
1367 if (log)
1368 log->Printf ("SBValue(%p)::HasChildren() => %i", value_sp.get(), has_children);
1369 return has_children;
1370}
1371
Chris Lattner24943d22010-06-08 16:52:24 +00001372uint32_t
1373SBValue::GetNumChildren ()
1374{
1375 uint32_t num_children = 0;
1376
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001377 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001378 lldb::ValueObjectSP value_sp(GetSP());
1379 if (value_sp)
Greg Claytonfab305b2011-05-20 23:51:26 +00001380 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001381 ProcessSP process_sp(value_sp->GetProcessSP());
1382 Process::StopLocker stop_locker;
1383 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Claytonb9dcc512011-06-29 18:28:50 +00001384 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001385 if (log)
1386 log->Printf ("SBValue(%p)::GetNumChildren() => error: process is running", value_sp.get());
1387 }
1388 else
1389 {
1390 TargetSP target_sp(value_sp->GetTargetSP());
1391 if (target_sp)
1392 {
1393 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Claytonfab305b2011-05-20 23:51:26 +00001394
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001395 num_children = value_sp->GetNumChildren();
1396 }
Greg Claytonb9dcc512011-06-29 18:28:50 +00001397 }
Greg Claytonfab305b2011-05-20 23:51:26 +00001398 }
Greg Clayton49ce6822010-10-31 03:01:06 +00001399
Greg Clayton49ce6822010-10-31 03:01:06 +00001400 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001401 log->Printf ("SBValue(%p)::GetNumChildren () => %u", value_sp.get(), num_children);
Chris Lattner24943d22010-06-08 16:52:24 +00001402
1403 return num_children;
1404}
1405
Chris Lattner24943d22010-06-08 16:52:24 +00001406
1407SBValue
1408SBValue::Dereference ()
1409{
Greg Clayton49ce6822010-10-31 03:01:06 +00001410 SBValue sb_value;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001411 lldb::ValueObjectSP value_sp(GetSP());
1412 if (value_sp)
Chris Lattner24943d22010-06-08 16:52:24 +00001413 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001414 TargetSP target_sp(value_sp->GetTargetSP());
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001415 if (target_sp)
Greg Claytonb9dcc512011-06-29 18:28:50 +00001416 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001417 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Claytonfab305b2011-05-20 23:51:26 +00001418
Greg Claytonb9dcc512011-06-29 18:28:50 +00001419 Error error;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001420 sb_value = value_sp->Dereference (error);
Greg Claytonb9dcc512011-06-29 18:28:50 +00001421 }
Chris Lattner24943d22010-06-08 16:52:24 +00001422 }
Greg Claytone005f2c2010-11-06 01:53:30 +00001423 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +00001424 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001425 log->Printf ("SBValue(%p)::Dereference () => SBValue(%p)", value_sp.get(), value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +00001426
1427 return sb_value;
Chris Lattner24943d22010-06-08 16:52:24 +00001428}
1429
1430bool
Greg Clayton49ce6822010-10-31 03:01:06 +00001431SBValue::TypeIsPointerType ()
Chris Lattner24943d22010-06-08 16:52:24 +00001432{
1433 bool is_ptr_type = false;
1434
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001435 lldb::ValueObjectSP value_sp(GetSP());
1436 if (value_sp)
Greg Claytonfab305b2011-05-20 23:51:26 +00001437 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001438 TargetSP target_sp(value_sp->GetTargetSP());
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001439 if (target_sp)
Greg Claytonb9dcc512011-06-29 18:28:50 +00001440 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001441 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Claytonfab305b2011-05-20 23:51:26 +00001442
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001443 is_ptr_type = value_sp->IsPointerType();
Greg Claytonb9dcc512011-06-29 18:28:50 +00001444 }
Greg Claytonfab305b2011-05-20 23:51:26 +00001445 }
Greg Clayton49ce6822010-10-31 03:01:06 +00001446
Greg Claytone005f2c2010-11-06 01:53:30 +00001447 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +00001448 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001449 log->Printf ("SBValue(%p)::TypeIsPointerType () => %i", value_sp.get(), is_ptr_type);
Greg Clayton49ce6822010-10-31 03:01:06 +00001450
Chris Lattner24943d22010-06-08 16:52:24 +00001451
1452 return is_ptr_type;
1453}
1454
Chris Lattner24943d22010-06-08 16:52:24 +00001455void *
1456SBValue::GetOpaqueType()
1457{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001458 lldb::ValueObjectSP value_sp(GetSP());
1459 if (value_sp)
Greg Claytonfab305b2011-05-20 23:51:26 +00001460 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001461 TargetSP target_sp(value_sp->GetTargetSP());
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001462 if (target_sp)
Greg Claytonb9dcc512011-06-29 18:28:50 +00001463 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001464 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Claytonfab305b2011-05-20 23:51:26 +00001465
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001466 return value_sp->GetClangType();
Greg Claytonb9dcc512011-06-29 18:28:50 +00001467 }
Greg Claytonfab305b2011-05-20 23:51:26 +00001468 }
Chris Lattner24943d22010-06-08 16:52:24 +00001469 return NULL;
1470}
1471
Enrico Granata979e20d2011-07-29 19:53:35 +00001472lldb::SBTarget
1473SBValue::GetTarget()
1474{
Greg Clayton334d33a2012-01-30 07:41:31 +00001475 SBTarget sb_target;
1476 TargetSP target_sp;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001477 lldb::ValueObjectSP value_sp(GetSP());
1478 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +00001479 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001480 target_sp = value_sp->GetTargetSP();
Greg Clayton334d33a2012-01-30 07:41:31 +00001481 sb_target.SetSP (target_sp);
Enrico Granata979e20d2011-07-29 19:53:35 +00001482 }
1483 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1484 if (log)
1485 {
Greg Clayton334d33a2012-01-30 07:41:31 +00001486 if (target_sp.get() == NULL)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001487 log->Printf ("SBValue(%p)::GetTarget () => NULL", value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001488 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001489 log->Printf ("SBValue(%p)::GetTarget () => %p", value_sp.get(), target_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001490 }
Greg Clayton334d33a2012-01-30 07:41:31 +00001491 return sb_target;
Enrico Granata979e20d2011-07-29 19:53:35 +00001492}
1493
1494lldb::SBProcess
1495SBValue::GetProcess()
1496{
Greg Clayton334d33a2012-01-30 07:41:31 +00001497 SBProcess sb_process;
1498 ProcessSP process_sp;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001499 lldb::ValueObjectSP value_sp(GetSP());
1500 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +00001501 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001502 process_sp = value_sp->GetProcessSP();
Greg Clayton334d33a2012-01-30 07:41:31 +00001503 if (process_sp)
1504 sb_process.SetSP (process_sp);
Enrico Granata979e20d2011-07-29 19:53:35 +00001505 }
1506 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1507 if (log)
1508 {
Greg Clayton334d33a2012-01-30 07:41:31 +00001509 if (process_sp.get() == NULL)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001510 log->Printf ("SBValue(%p)::GetProcess () => NULL", value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001511 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001512 log->Printf ("SBValue(%p)::GetProcess () => %p", value_sp.get(), process_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001513 }
Greg Clayton334d33a2012-01-30 07:41:31 +00001514 return sb_process;
Enrico Granata979e20d2011-07-29 19:53:35 +00001515}
1516
1517lldb::SBThread
1518SBValue::GetThread()
1519{
Greg Clayton90c52142012-01-30 02:53:15 +00001520 SBThread sb_thread;
1521 ThreadSP thread_sp;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001522 lldb::ValueObjectSP value_sp(GetSP());
1523 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +00001524 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001525 thread_sp = value_sp->GetThreadSP();
1526 sb_thread.SetThread(thread_sp);
Enrico Granata979e20d2011-07-29 19:53:35 +00001527 }
1528 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1529 if (log)
1530 {
Greg Clayton90c52142012-01-30 02:53:15 +00001531 if (thread_sp.get() == NULL)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001532 log->Printf ("SBValue(%p)::GetThread () => NULL", value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001533 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001534 log->Printf ("SBValue(%p)::GetThread () => %p", value_sp.get(), thread_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001535 }
Greg Clayton90c52142012-01-30 02:53:15 +00001536 return sb_thread;
Enrico Granata979e20d2011-07-29 19:53:35 +00001537}
1538
1539lldb::SBFrame
1540SBValue::GetFrame()
1541{
Greg Clayton334d33a2012-01-30 07:41:31 +00001542 SBFrame sb_frame;
1543 StackFrameSP frame_sp;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001544 lldb::ValueObjectSP value_sp(GetSP());
1545 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +00001546 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001547 frame_sp = value_sp->GetFrameSP();
1548 sb_frame.SetFrameSP (frame_sp);
Enrico Granata979e20d2011-07-29 19:53:35 +00001549 }
1550 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1551 if (log)
1552 {
Greg Clayton334d33a2012-01-30 07:41:31 +00001553 if (frame_sp.get() == NULL)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001554 log->Printf ("SBValue(%p)::GetFrame () => NULL", value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001555 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001556 log->Printf ("SBValue(%p)::GetFrame () => %p", value_sp.get(), frame_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001557 }
Greg Clayton334d33a2012-01-30 07:41:31 +00001558 return sb_frame;
Enrico Granata979e20d2011-07-29 19:53:35 +00001559}
1560
1561
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001562lldb::ValueObjectSP
1563SBValue::GetSP () const
Chris Lattner24943d22010-06-08 16:52:24 +00001564{
Enrico Granata3d656c72012-10-22 18:18:36 +00001565 if (!m_opaque_sp || !m_opaque_sp->IsValid())
1566 return ValueObjectSP();
1567 return m_opaque_sp->GetSP();
1568}
1569
1570void
1571SBValue::SetSP (ValueImplSP impl_sp)
1572{
1573 m_opaque_sp = impl_sp;
Chris Lattner24943d22010-06-08 16:52:24 +00001574}
1575
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001576void
1577SBValue::SetSP (const lldb::ValueObjectSP &sp)
Chris Lattner24943d22010-06-08 16:52:24 +00001578{
Enrico Granata3d656c72012-10-22 18:18:36 +00001579 if (sp)
1580 {
1581 lldb::TargetSP target_sp(sp->GetTargetSP());
1582 if (target_sp)
1583 {
1584 lldb::DynamicValueType use_dynamic = target_sp->GetPreferDynamicValue();
1585 bool use_synthetic = target_sp->TargetProperties::GetEnableSyntheticValue();
1586 m_opaque_sp = ValueImplSP(new ValueImpl(sp, use_dynamic, use_synthetic));
1587 }
1588 else
1589 m_opaque_sp = ValueImplSP(new ValueImpl(sp,eNoDynamicValues,true));
1590 }
1591 else
1592 m_opaque_sp = ValueImplSP(new ValueImpl(sp,eNoDynamicValues,false));
Chris Lattner24943d22010-06-08 16:52:24 +00001593}
Caroline Tice98f930f2010-09-20 05:20:02 +00001594
Enrico Granata3d656c72012-10-22 18:18:36 +00001595void
1596SBValue::SetSP (const lldb::ValueObjectSP &sp, lldb::DynamicValueType use_dynamic)
1597{
1598 if (sp)
1599 {
1600 lldb::TargetSP target_sp(sp->GetTargetSP());
1601 if (target_sp)
1602 {
1603 bool use_synthetic = target_sp->TargetProperties::GetEnableSyntheticValue();
1604 SetSP (sp, use_dynamic, use_synthetic);
1605 }
1606 else
1607 SetSP (sp, use_dynamic, true);
1608 }
1609 else
1610 SetSP (sp, use_dynamic, false);
1611}
1612
1613void
1614SBValue::SetSP (const lldb::ValueObjectSP &sp, bool use_synthetic)
1615{
1616 if (sp)
1617 {
1618 lldb::TargetSP target_sp(sp->GetTargetSP());
1619 if (target_sp)
1620 {
1621 lldb::DynamicValueType use_dynamic = target_sp->GetPreferDynamicValue();
1622 SetSP (sp, use_dynamic, use_synthetic);
1623 }
1624 else
1625 SetSP (sp, eNoDynamicValues, use_synthetic);
1626 }
1627 else
1628 SetSP (sp, eNoDynamicValues, use_synthetic);
1629}
1630
1631void
1632SBValue::SetSP (const lldb::ValueObjectSP &sp, lldb::DynamicValueType use_dynamic, bool use_synthetic)
1633{
1634 m_opaque_sp = ValueImplSP(new ValueImpl(sp,use_dynamic,use_synthetic));
1635}
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001636
Caroline Tice98f930f2010-09-20 05:20:02 +00001637bool
Greg Clayton49ce6822010-10-31 03:01:06 +00001638SBValue::GetExpressionPath (SBStream &description)
1639{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001640 lldb::ValueObjectSP value_sp(GetSP());
1641 if (value_sp)
Greg Clayton49ce6822010-10-31 03:01:06 +00001642 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001643 value_sp->GetExpressionPath (description.ref(), false);
Greg Claytonb01000f2011-01-17 03:46:26 +00001644 return true;
1645 }
1646 return false;
1647}
1648
1649bool
1650SBValue::GetExpressionPath (SBStream &description, bool qualify_cxx_base_classes)
1651{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001652 lldb::ValueObjectSP value_sp(GetSP());
1653 if (value_sp)
Greg Claytonb01000f2011-01-17 03:46:26 +00001654 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001655 value_sp->GetExpressionPath (description.ref(), qualify_cxx_base_classes);
Greg Clayton49ce6822010-10-31 03:01:06 +00001656 return true;
1657 }
1658 return false;
1659}
1660
1661bool
Caroline Tice98f930f2010-09-20 05:20:02 +00001662SBValue::GetDescription (SBStream &description)
1663{
Greg Clayton96154be2011-11-13 06:57:31 +00001664 Stream &strm = description.ref();
1665
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001666 lldb::ValueObjectSP value_sp(GetSP());
1667 if (value_sp)
Caroline Tice98f930f2010-09-20 05:20:02 +00001668 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001669 ProcessSP process_sp(value_sp->GetProcessSP());
1670 Process::StopLocker stop_locker;
1671 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
1672 {
1673 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1674 if (log)
1675 log->Printf ("SBValue(%p)::GetDescription() => error: process is running", value_sp.get());
1676 }
1677 else
1678 {
1679 ValueObject::DumpValueObject (strm, value_sp.get());
1680 }
Caroline Tice98f930f2010-09-20 05:20:02 +00001681 }
1682 else
Greg Clayton96154be2011-11-13 06:57:31 +00001683 strm.PutCString ("No value");
Caroline Tice98f930f2010-09-20 05:20:02 +00001684
1685 return true;
1686}
Greg Claytone179a582011-01-05 18:43:15 +00001687
1688lldb::Format
Greg Claytond68e0892011-09-09 23:04:00 +00001689SBValue::GetFormat ()
Greg Claytone179a582011-01-05 18:43:15 +00001690{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001691 lldb::ValueObjectSP value_sp(GetSP());
1692 if (value_sp)
1693 return value_sp->GetFormat();
Greg Claytone179a582011-01-05 18:43:15 +00001694 return eFormatDefault;
1695}
1696
1697void
1698SBValue::SetFormat (lldb::Format format)
1699{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001700 lldb::ValueObjectSP value_sp(GetSP());
1701 if (value_sp)
1702 value_sp->SetFormat(format);
Greg Claytone179a582011-01-05 18:43:15 +00001703}
1704
Enrico Granata979e20d2011-07-29 19:53:35 +00001705lldb::SBValue
1706SBValue::AddressOf()
1707{
1708 SBValue sb_value;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001709 lldb::ValueObjectSP value_sp(GetSP());
1710 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +00001711 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001712 TargetSP target_sp (value_sp->GetTargetSP());
1713 if (target_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +00001714 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001715 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Enrico Granata979e20d2011-07-29 19:53:35 +00001716 Error error;
Enrico Granata3d656c72012-10-22 18:18:36 +00001717 sb_value.SetSP(value_sp->AddressOf (error),GetPreferDynamicValue(), GetPreferSyntheticValue());
Enrico Granata979e20d2011-07-29 19:53:35 +00001718 }
1719 }
1720 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1721 if (log)
Greg Clayton12b7ea32012-06-04 20:13:23 +00001722 log->Printf ("SBValue(%p)::AddressOf () => SBValue(%p)", value_sp.get(), value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001723
1724 return sb_value;
Johnny Chena713b862011-08-09 22:38:07 +00001725}
Enrico Granata91544802011-09-06 19:20:51 +00001726
1727lldb::addr_t
1728SBValue::GetLoadAddress()
1729{
1730 lldb::addr_t value = LLDB_INVALID_ADDRESS;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001731 lldb::ValueObjectSP value_sp(GetSP());
1732 if (value_sp)
Enrico Granata91544802011-09-06 19:20:51 +00001733 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001734 TargetSP target_sp (value_sp->GetTargetSP());
1735 if (target_sp)
Enrico Granata91544802011-09-06 19:20:51 +00001736 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001737 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Enrico Granata91544802011-09-06 19:20:51 +00001738 const bool scalar_is_load_address = true;
1739 AddressType addr_type;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001740 value = value_sp->GetAddressOf(scalar_is_load_address, &addr_type);
Enrico Granata91544802011-09-06 19:20:51 +00001741 if (addr_type == eAddressTypeFile)
1742 {
Greg Clayton3508c382012-02-24 01:59:29 +00001743 ModuleSP module_sp (value_sp->GetModule());
1744 if (!module_sp)
Enrico Granata91544802011-09-06 19:20:51 +00001745 value = LLDB_INVALID_ADDRESS;
1746 else
1747 {
1748 Address addr;
Greg Clayton3508c382012-02-24 01:59:29 +00001749 module_sp->ResolveFileAddress(value, addr);
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001750 value = addr.GetLoadAddress(target_sp.get());
Enrico Granata91544802011-09-06 19:20:51 +00001751 }
1752 }
1753 else if (addr_type == eAddressTypeHost || addr_type == eAddressTypeInvalid)
1754 value = LLDB_INVALID_ADDRESS;
1755 }
1756 }
1757 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1758 if (log)
Daniel Malea5f35a4b2012-11-29 21:49:15 +00001759 log->Printf ("SBValue(%p)::GetLoadAddress () => (%" PRIu64 ")", value_sp.get(), value);
Enrico Granata91544802011-09-06 19:20:51 +00001760
1761 return value;
1762}
1763
1764lldb::SBAddress
1765SBValue::GetAddress()
1766{
1767 Address addr;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001768 lldb::ValueObjectSP value_sp(GetSP());
1769 if (value_sp)
Enrico Granata91544802011-09-06 19:20:51 +00001770 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001771 TargetSP target_sp (value_sp->GetTargetSP());
1772 if (target_sp)
Enrico Granata91544802011-09-06 19:20:51 +00001773 {
1774 lldb::addr_t value = LLDB_INVALID_ADDRESS;
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001775 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Enrico Granata91544802011-09-06 19:20:51 +00001776 const bool scalar_is_load_address = true;
1777 AddressType addr_type;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001778 value = value_sp->GetAddressOf(scalar_is_load_address, &addr_type);
Enrico Granata91544802011-09-06 19:20:51 +00001779 if (addr_type == eAddressTypeFile)
1780 {
Greg Clayton3508c382012-02-24 01:59:29 +00001781 ModuleSP module_sp (value_sp->GetModule());
1782 if (module_sp)
1783 module_sp->ResolveFileAddress(value, addr);
Enrico Granata91544802011-09-06 19:20:51 +00001784 }
1785 else if (addr_type == eAddressTypeLoad)
1786 {
1787 // no need to check the return value on this.. if it can actually do the resolve
1788 // addr will be in the form (section,offset), otherwise it will simply be returned
1789 // as (NULL, value)
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001790 addr.SetLoadAddress(value, target_sp.get());
Enrico Granata91544802011-09-06 19:20:51 +00001791 }
1792 }
1793 }
1794 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1795 if (log)
Daniel Malea5f35a4b2012-11-29 21:49:15 +00001796 log->Printf ("SBValue(%p)::GetAddress () => (%s,%" PRIu64 ")", value_sp.get(),
Jim Ingham47beabb2012-10-16 21:41:58 +00001797 (addr.GetSection() ? addr.GetSection()->GetName().GetCString() : "NULL"),
1798 addr.GetOffset());
Enrico Granata91544802011-09-06 19:20:51 +00001799 return SBAddress(new Address(addr));
1800}
1801
1802lldb::SBData
1803SBValue::GetPointeeData (uint32_t item_idx,
1804 uint32_t item_count)
1805{
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001806 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata91544802011-09-06 19:20:51 +00001807 lldb::SBData sb_data;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001808 lldb::ValueObjectSP value_sp(GetSP());
1809 if (value_sp)
Enrico Granata91544802011-09-06 19:20:51 +00001810 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001811 ProcessSP process_sp(value_sp->GetProcessSP());
1812 Process::StopLocker stop_locker;
1813 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granata91544802011-09-06 19:20:51 +00001814 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001815 if (log)
1816 log->Printf ("SBValue(%p)::GetPointeeData() => error: process is running", value_sp.get());
1817 }
1818 else
1819 {
1820 TargetSP target_sp (value_sp->GetTargetSP());
1821 if (target_sp)
1822 {
1823 DataExtractorSP data_sp(new DataExtractor());
1824 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1825 value_sp->GetPointeeData(*data_sp, item_idx, item_count);
1826 if (data_sp->GetByteSize() > 0)
1827 *sb_data = data_sp;
1828 }
Enrico Granata91544802011-09-06 19:20:51 +00001829 }
1830 }
Enrico Granata91544802011-09-06 19:20:51 +00001831 if (log)
1832 log->Printf ("SBValue(%p)::GetPointeeData (%d, %d) => SBData(%p)",
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001833 value_sp.get(),
Enrico Granata91544802011-09-06 19:20:51 +00001834 item_idx,
1835 item_count,
1836 sb_data.get());
1837
1838 return sb_data;
1839}
1840
1841lldb::SBData
1842SBValue::GetData ()
1843{
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001844 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata91544802011-09-06 19:20:51 +00001845 lldb::SBData sb_data;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001846 lldb::ValueObjectSP value_sp(GetSP());
1847 if (value_sp)
Enrico Granata91544802011-09-06 19:20:51 +00001848 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001849 ProcessSP process_sp(value_sp->GetProcessSP());
1850 Process::StopLocker stop_locker;
1851 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granata91544802011-09-06 19:20:51 +00001852 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001853 if (log)
1854 log->Printf ("SBValue(%p)::GetData() => error: process is running", value_sp.get());
1855 }
1856 else
1857 {
1858 TargetSP target_sp (value_sp->GetTargetSP());
1859 if (target_sp)
1860 {
1861 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1862 DataExtractorSP data_sp(new DataExtractor());
1863 value_sp->GetData(*data_sp);
1864 if (data_sp->GetByteSize() > 0)
1865 *sb_data = data_sp;
1866 }
Enrico Granata91544802011-09-06 19:20:51 +00001867 }
1868 }
Enrico Granata91544802011-09-06 19:20:51 +00001869 if (log)
1870 log->Printf ("SBValue(%p)::GetData () => SBData(%p)",
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001871 value_sp.get(),
Enrico Granata91544802011-09-06 19:20:51 +00001872 sb_data.get());
1873
1874 return sb_data;
1875}
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001876
Enrico Granata49306142012-10-10 22:54:17 +00001877lldb::SBDeclaration
1878SBValue::GetDeclaration ()
1879{
1880 lldb::ValueObjectSP value_sp(GetSP());
1881 SBDeclaration decl_sb;
1882 if (value_sp)
1883 {
1884 Declaration decl;
1885 if (value_sp->GetDeclaration(decl))
1886 decl_sb.SetDeclaration(decl);
1887 }
1888 return decl_sb;
1889}
1890
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001891lldb::SBWatchpoint
Johnny Chen3f883492012-06-04 23:19:54 +00001892SBValue::Watch (bool resolve_location, bool read, bool write, SBError &error)
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001893{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001894 SBWatchpoint sb_watchpoint;
1895
1896 // If the SBValue is not valid, there's no point in even trying to watch it.
1897 lldb::ValueObjectSP value_sp(GetSP());
1898 TargetSP target_sp (GetTarget().GetSP());
1899 if (value_sp && target_sp)
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001900 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001901 // Can't watch this if the process is running
1902 ProcessSP process_sp(value_sp->GetProcessSP());
1903 Process::StopLocker stop_locker;
1904 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
1905 {
1906 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1907 if (log)
1908 log->Printf ("SBValue(%p)::Watch() => error: process is running", value_sp.get());
1909 return sb_watchpoint;
1910 }
1911
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001912 // Read and Write cannot both be false.
1913 if (!read && !write)
1914 return sb_watchpoint;
1915
1916 // If the value is not in scope, don't try and watch and invalid value
1917 if (!IsInScope())
1918 return sb_watchpoint;
1919
1920 addr_t addr = GetLoadAddress();
1921 if (addr == LLDB_INVALID_ADDRESS)
1922 return sb_watchpoint;
1923 size_t byte_size = GetByteSize();
1924 if (byte_size == 0)
1925 return sb_watchpoint;
1926
1927 uint32_t watch_type = 0;
1928 if (read)
1929 watch_type |= LLDB_WATCH_TYPE_READ;
1930 if (write)
1931 watch_type |= LLDB_WATCH_TYPE_WRITE;
1932
Johnny Chen3f883492012-06-04 23:19:54 +00001933 Error rc;
Jim Ingham9e376622012-10-23 07:20:06 +00001934 ClangASTType type (value_sp->GetClangAST(), value_sp->GetClangType());
1935 WatchpointSP watchpoint_sp = target_sp->CreateWatchpoint(addr, byte_size, &type, watch_type, rc);
Johnny Chen3f883492012-06-04 23:19:54 +00001936 error.SetError(rc);
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001937
1938 if (watchpoint_sp)
1939 {
1940 sb_watchpoint.SetSP (watchpoint_sp);
1941 Declaration decl;
1942 if (value_sp->GetDeclaration (decl))
1943 {
1944 if (decl.GetFile())
1945 {
1946 StreamString ss;
1947 // True to show fullpath for declaration file.
1948 decl.DumpStopContext(&ss, true);
1949 watchpoint_sp->SetDeclInfo(ss.GetString());
1950 }
1951 }
1952 }
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001953 }
1954 return sb_watchpoint;
1955}
1956
Johnny Chen8a5ce772012-06-04 23:45:50 +00001957// FIXME: Remove this method impl (as well as the decl in .h) once it is no longer needed.
1958// Backward compatibility fix in the interim.
1959lldb::SBWatchpoint
1960SBValue::Watch (bool resolve_location, bool read, bool write)
1961{
Johnny Chen9c4a3442012-06-05 00:14:15 +00001962 SBError error;
1963 return Watch(resolve_location, read, write, error);
Johnny Chen8a5ce772012-06-04 23:45:50 +00001964}
1965
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001966lldb::SBWatchpoint
Johnny Chen3f883492012-06-04 23:19:54 +00001967SBValue::WatchPointee (bool resolve_location, bool read, bool write, SBError &error)
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001968{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001969 SBWatchpoint sb_watchpoint;
1970 if (IsInScope() && GetType().IsPointerType())
Johnny Chen3f883492012-06-04 23:19:54 +00001971 sb_watchpoint = Dereference().Watch (resolve_location, read, write, error);
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001972 return sb_watchpoint;
1973}