blob: 27949758fe1ab086371b9fa4a964e50520057a7b [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;
391 default: log->Printf ("SBValue(%p)::GetValueType () => %i ???", value_sp.get(), result); break;
Greg Clayton49ce6822010-10-31 03:01:06 +0000392 }
393 }
394 return result;
Greg Claytonf3d0b0c2010-10-27 03:32:59 +0000395}
396
Jim Ingham4ae51962010-09-10 23:12:17 +0000397const char *
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000398SBValue::GetObjectDescription ()
399{
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000400 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000401 const char *cstr = NULL;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000402 lldb::ValueObjectSP value_sp(GetSP());
403 if (value_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000404 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000405 ProcessSP process_sp(value_sp->GetProcessSP());
406 Process::StopLocker stop_locker;
407 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Claytonb9dcc512011-06-29 18:28:50 +0000408 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000409 if (log)
410 log->Printf ("SBValue(%p)::GetObjectDescription() => error: process is running", value_sp.get());
411 }
412 else
413 {
414 TargetSP target_sp(value_sp->GetTargetSP());
415 if (target_sp)
416 {
417 Mutex::Locker api_locker (target_sp->GetAPIMutex());
418 cstr = value_sp->GetObjectDescription ();
419 }
Greg Claytonb9dcc512011-06-29 18:28:50 +0000420 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000421 }
Greg Clayton49ce6822010-10-31 03:01:06 +0000422 if (log)
423 {
424 if (cstr)
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000425 log->Printf ("SBValue(%p)::GetObjectDescription() => \"%s\"", value_sp.get(), cstr);
Greg Clayton49ce6822010-10-31 03:01:06 +0000426 else
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000427 log->Printf ("SBValue(%p)::GetObjectDescription() => NULL", value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +0000428 }
429 return cstr;
Jim Ingham4ae51962010-09-10 23:12:17 +0000430}
431
Enrico Granata979e20d2011-07-29 19:53:35 +0000432SBType
433SBValue::GetType()
434{
Jim Ingham5b4905d2012-04-13 18:30:20 +0000435 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000436 SBType sb_type;
437 lldb::ValueObjectSP value_sp(GetSP());
438 TypeImplSP type_sp;
439 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +0000440 {
Jim Ingham5b4905d2012-04-13 18:30:20 +0000441 ProcessSP process_sp(value_sp->GetProcessSP());
442 Process::StopLocker stop_locker;
443 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
444 {
445 if (log)
Greg Clayton12b7ea32012-06-04 20:13:23 +0000446 log->Printf ("SBValue(%p)::GetType() => error: process is running", value_sp.get());
Jim Ingham5b4905d2012-04-13 18:30:20 +0000447 }
448 else
449 {
450 TargetSP target_sp(value_sp->GetTargetSP());
451 if (target_sp)
452 {
453 Mutex::Locker api_locker (target_sp->GetAPIMutex());
454 type_sp.reset (new TypeImpl(ClangASTType (value_sp->GetClangAST(), value_sp->GetClangType())));
455 sb_type.SetSP(type_sp);
456 }
457 }
Enrico Granata979e20d2011-07-29 19:53:35 +0000458 }
Enrico Granata979e20d2011-07-29 19:53:35 +0000459 if (log)
460 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000461 if (type_sp)
462 log->Printf ("SBValue(%p)::GetType => SBType(%p)", value_sp.get(), type_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +0000463 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000464 log->Printf ("SBValue(%p)::GetType => NULL", value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +0000465 }
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000466 return sb_type;
Enrico Granata979e20d2011-07-29 19:53:35 +0000467}
468
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000469bool
470SBValue::GetValueDidChange ()
471{
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000472 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000473 bool result = false;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000474 lldb::ValueObjectSP value_sp(GetSP());
475 if (value_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000476 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000477 ProcessSP process_sp(value_sp->GetProcessSP());
478 Process::StopLocker stop_locker;
479 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Claytonb9dcc512011-06-29 18:28:50 +0000480 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000481 if (log)
482 log->Printf ("SBValue(%p)::GetValueDidChange() => error: process is running", value_sp.get());
483 }
484 else
485 {
486 TargetSP target_sp(value_sp->GetTargetSP());
487 if (target_sp)
488 {
489 Mutex::Locker api_locker (target_sp->GetAPIMutex());
490 result = value_sp->GetValueDidChange ();
491 }
Greg Claytonb9dcc512011-06-29 18:28:50 +0000492 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000493 }
Greg Clayton49ce6822010-10-31 03:01:06 +0000494 if (log)
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000495 log->Printf ("SBValue(%p)::GetValueDidChange() => %i", value_sp.get(), result);
Greg Clayton49ce6822010-10-31 03:01:06 +0000496
497 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000498}
499
Jason Molendac48ca822012-02-21 05:33:55 +0000500#ifndef LLDB_DISABLE_PYTHON
Chris Lattner24943d22010-06-08 16:52:24 +0000501const char *
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000502SBValue::GetSummary ()
503{
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000504 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000505 const char *cstr = NULL;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000506 lldb::ValueObjectSP value_sp(GetSP());
507 if (value_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000508 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000509 ProcessSP process_sp(value_sp->GetProcessSP());
510 Process::StopLocker stop_locker;
511 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Claytonb9dcc512011-06-29 18:28:50 +0000512 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000513 if (log)
514 log->Printf ("SBValue(%p)::GetSummary() => error: process is running", value_sp.get());
515 }
516 else
517 {
518 TargetSP target_sp(value_sp->GetTargetSP());
519 if (target_sp)
520 {
521 Mutex::Locker api_locker (target_sp->GetAPIMutex());
522 cstr = value_sp->GetSummaryAsCString();
523 }
Greg Claytonb9dcc512011-06-29 18:28:50 +0000524 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000525 }
Greg Clayton49ce6822010-10-31 03:01:06 +0000526 if (log)
527 {
528 if (cstr)
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000529 log->Printf ("SBValue(%p)::GetSummary() => \"%s\"", value_sp.get(), cstr);
Greg Clayton49ce6822010-10-31 03:01:06 +0000530 else
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000531 log->Printf ("SBValue(%p)::GetSummary() => NULL", value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +0000532 }
533 return cstr;
Chris Lattner24943d22010-06-08 16:52:24 +0000534}
Jason Molendac48ca822012-02-21 05:33:55 +0000535#endif // LLDB_DISABLE_PYTHON
Chris Lattner24943d22010-06-08 16:52:24 +0000536
537const char *
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000538SBValue::GetLocation ()
539{
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000540 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000541 const char *cstr = NULL;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000542 lldb::ValueObjectSP value_sp(GetSP());
543 if (value_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000544 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000545 ProcessSP process_sp(value_sp->GetProcessSP());
546 Process::StopLocker stop_locker;
547 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Claytonb9dcc512011-06-29 18:28:50 +0000548 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000549 if (log)
550 log->Printf ("SBValue(%p)::GetLocation() => error: process is running", value_sp.get());
551 }
552 else
553 {
554 TargetSP target_sp(value_sp->GetTargetSP());
555 if (target_sp)
556 {
557 Mutex::Locker api_locker (target_sp->GetAPIMutex());
558 cstr = value_sp->GetLocationAsCString();
559 }
Greg Claytonb9dcc512011-06-29 18:28:50 +0000560 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000561 }
Greg Clayton49ce6822010-10-31 03:01:06 +0000562 if (log)
563 {
564 if (cstr)
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000565 log->Printf ("SBValue(%p)::GetLocation() => \"%s\"", value_sp.get(), cstr);
Greg Clayton49ce6822010-10-31 03:01:06 +0000566 else
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000567 log->Printf ("SBValue(%p)::GetLocation() => NULL", value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +0000568 }
569 return cstr;
Chris Lattner24943d22010-06-08 16:52:24 +0000570}
571
Enrico Granata651cbe22012-05-08 21:25:06 +0000572// Deprecated - use the one that takes an lldb::SBError
Chris Lattner24943d22010-06-08 16:52:24 +0000573bool
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000574SBValue::SetValueFromCString (const char *value_str)
575{
Enrico Granata651cbe22012-05-08 21:25:06 +0000576 lldb::SBError dummy;
577 return SetValueFromCString(value_str,dummy);
578}
579
580bool
581SBValue::SetValueFromCString (const char *value_str, lldb::SBError& error)
582{
Chris Lattner24943d22010-06-08 16:52:24 +0000583 bool success = false;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000584 lldb::ValueObjectSP value_sp(GetSP());
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000585 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000586 if (value_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000587 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000588 ProcessSP process_sp(value_sp->GetProcessSP());
589 Process::StopLocker stop_locker;
590 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Claytonb9dcc512011-06-29 18:28:50 +0000591 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000592 if (log)
593 log->Printf ("SBValue(%p)::SetValueFromCString() => error: process is running", value_sp.get());
594 }
595 else
596 {
597 TargetSP target_sp(value_sp->GetTargetSP());
598 if (target_sp)
599 {
600 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Enrico Granata651cbe22012-05-08 21:25:06 +0000601 success = value_sp->SetValueFromCString (value_str,error.ref());
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000602 }
Greg Claytonb9dcc512011-06-29 18:28:50 +0000603 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000604 }
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000605 if (log)
606 log->Printf ("SBValue(%p)::SetValueFromCString(\"%s\") => %i", value_sp.get(), value_str, success);
607
Chris Lattner24943d22010-06-08 16:52:24 +0000608 return success;
609}
610
Enrico Granatad760907c2012-02-17 03:18:30 +0000611lldb::SBTypeFormat
612SBValue::GetTypeFormat ()
613{
614 lldb::SBTypeFormat format;
615 lldb::ValueObjectSP value_sp(GetSP());
616 if (value_sp)
617 {
Jim Ingham5b4905d2012-04-13 18:30:20 +0000618 ProcessSP process_sp(value_sp->GetProcessSP());
619 Process::StopLocker stop_locker;
620 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granatad760907c2012-02-17 03:18:30 +0000621 {
Jim Ingham5b4905d2012-04-13 18:30:20 +0000622 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
623 if (log)
Greg Clayton12b7ea32012-06-04 20:13:23 +0000624 log->Printf ("SBValue(%p)::GetTypeFormat() => error: process is running", value_sp.get());
Jim Ingham5b4905d2012-04-13 18:30:20 +0000625 }
626 else
627 {
628 TargetSP target_sp(value_sp->GetTargetSP());
629 if (target_sp)
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000630 {
Jim Ingham5b4905d2012-04-13 18:30:20 +0000631 Mutex::Locker api_locker (target_sp->GetAPIMutex());
632 if (value_sp->UpdateValueIfNeeded(true))
633 {
634 lldb::TypeFormatImplSP format_sp = value_sp->GetValueFormat();
635 if (format_sp)
636 format.SetSP(format_sp);
637 }
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000638 }
Enrico Granatad760907c2012-02-17 03:18:30 +0000639 }
640 }
641 return format;
642}
643
Jason Molendac48ca822012-02-21 05:33:55 +0000644#ifndef LLDB_DISABLE_PYTHON
Enrico Granatad760907c2012-02-17 03:18:30 +0000645lldb::SBTypeSummary
646SBValue::GetTypeSummary ()
647{
648 lldb::SBTypeSummary summary;
649 lldb::ValueObjectSP value_sp(GetSP());
650 if (value_sp)
651 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000652 ProcessSP process_sp(value_sp->GetProcessSP());
653 Process::StopLocker stop_locker;
654 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granatad760907c2012-02-17 03:18:30 +0000655 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000656 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
657 if (log)
658 log->Printf ("SBValue(%p)::GetTypeSummary() => error: process is running", value_sp.get());
659 }
660 else
661 {
662 TargetSP target_sp(value_sp->GetTargetSP());
663 if (target_sp)
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000664 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000665 Mutex::Locker api_locker (target_sp->GetAPIMutex());
666 if (value_sp->UpdateValueIfNeeded(true))
667 {
668 lldb::TypeSummaryImplSP summary_sp = value_sp->GetSummaryFormat();
669 if (summary_sp)
670 summary.SetSP(summary_sp);
671 }
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000672 }
Enrico Granatad760907c2012-02-17 03:18:30 +0000673 }
674 }
675 return summary;
676}
Jason Molendac48ca822012-02-21 05:33:55 +0000677#endif // LLDB_DISABLE_PYTHON
Enrico Granatad760907c2012-02-17 03:18:30 +0000678
679lldb::SBTypeFilter
680SBValue::GetTypeFilter ()
681{
682 lldb::SBTypeFilter filter;
683 lldb::ValueObjectSP value_sp(GetSP());
684 if (value_sp)
685 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000686 ProcessSP process_sp(value_sp->GetProcessSP());
687 Process::StopLocker stop_locker;
688 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granatad760907c2012-02-17 03:18:30 +0000689 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000690 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
691 if (log)
692 log->Printf ("SBValue(%p)::GetTypeFilter() => error: process is running", value_sp.get());
693 }
694 else
695 {
696 TargetSP target_sp(value_sp->GetTargetSP());
697 if (target_sp)
Enrico Granatad760907c2012-02-17 03:18:30 +0000698 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000699 Mutex::Locker api_locker (target_sp->GetAPIMutex());
700 if (value_sp->UpdateValueIfNeeded(true))
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000701 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000702 lldb::SyntheticChildrenSP synthetic_sp = value_sp->GetSyntheticChildren();
703
704 if (synthetic_sp && !synthetic_sp->IsScripted())
705 {
706 TypeFilterImplSP filter_sp = STD_STATIC_POINTER_CAST(TypeFilterImpl,synthetic_sp);
707 filter.SetSP(filter_sp);
708 }
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000709 }
Enrico Granatad760907c2012-02-17 03:18:30 +0000710 }
711 }
712 }
713 return filter;
714}
715
Jason Molendac48ca822012-02-21 05:33:55 +0000716#ifndef LLDB_DISABLE_PYTHON
Enrico Granatad760907c2012-02-17 03:18:30 +0000717lldb::SBTypeSynthetic
718SBValue::GetTypeSynthetic ()
719{
720 lldb::SBTypeSynthetic synthetic;
721 lldb::ValueObjectSP value_sp(GetSP());
722 if (value_sp)
723 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000724 ProcessSP process_sp(value_sp->GetProcessSP());
725 Process::StopLocker stop_locker;
726 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granatad760907c2012-02-17 03:18:30 +0000727 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000728 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
729 if (log)
730 log->Printf ("SBValue(%p)::GetTypeSynthetic() => error: process is running", value_sp.get());
731 }
732 else
733 {
734 TargetSP target_sp(value_sp->GetTargetSP());
735 if (target_sp)
Enrico Granatad760907c2012-02-17 03:18:30 +0000736 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000737 Mutex::Locker api_locker (target_sp->GetAPIMutex());
738 if (value_sp->UpdateValueIfNeeded(true))
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000739 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000740 lldb::SyntheticChildrenSP children_sp = value_sp->GetSyntheticChildren();
741
742 if (children_sp && children_sp->IsScripted())
743 {
744 TypeSyntheticImplSP synth_sp = STD_STATIC_POINTER_CAST(TypeSyntheticImpl,children_sp);
745 synthetic.SetSP(synth_sp);
746 }
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000747 }
Enrico Granatad760907c2012-02-17 03:18:30 +0000748 }
749 }
750 }
751 return synthetic;
752}
Jason Molendac48ca822012-02-21 05:33:55 +0000753#endif
Enrico Granatad760907c2012-02-17 03:18:30 +0000754
Enrico Granata979e20d2011-07-29 19:53:35 +0000755lldb::SBValue
Greg Claytond68e0892011-09-09 23:04:00 +0000756SBValue::CreateChildAtOffset (const char *name, uint32_t offset, SBType type)
Enrico Granata979e20d2011-07-29 19:53:35 +0000757{
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000758 lldb::SBValue sb_value;
759 lldb::ValueObjectSP value_sp(GetSP());
760 lldb::ValueObjectSP new_value_sp;
761 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +0000762 {
Jim Ingham5b4905d2012-04-13 18:30:20 +0000763 ProcessSP process_sp(value_sp->GetProcessSP());
764 Process::StopLocker stop_locker;
765 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granata979e20d2011-07-29 19:53:35 +0000766 {
Jim Ingham5b4905d2012-04-13 18:30:20 +0000767 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
768 if (log)
Greg Clayton12b7ea32012-06-04 20:13:23 +0000769 log->Printf ("SBValue(%p)::CreateChildAtOffset() => error: process is running", value_sp.get());
Jim Ingham5b4905d2012-04-13 18:30:20 +0000770 }
771 else
772 {
773 TargetSP target_sp(value_sp->GetTargetSP());
774 if (target_sp)
775 {
776 Mutex::Locker api_locker (target_sp->GetAPIMutex());
777 TypeImplSP type_sp (type.GetSP());
778 if (type.IsValid())
779 {
Enrico Granata3d656c72012-10-22 18:18:36 +0000780 sb_value.SetSP(value_sp->GetSyntheticChildAtOffset(offset, type_sp->GetClangASTType(), true),GetPreferDynamicValue(),GetPreferSyntheticValue());
Jim Ingham5b4905d2012-04-13 18:30:20 +0000781 new_value_sp = sb_value.GetSP();
782 if (new_value_sp)
783 new_value_sp->SetName(ConstString(name));
784 }
785 }
Enrico Granata979e20d2011-07-29 19:53:35 +0000786 }
787 }
788 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
789 if (log)
790 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000791 if (new_value_sp)
Jim Ingham47beabb2012-10-16 21:41:58 +0000792 log->Printf ("SBValue(%p)::CreateChildAtOffset => \"%s\"",
793 value_sp.get(),
794 new_value_sp->GetName().AsCString());
Enrico Granata979e20d2011-07-29 19:53:35 +0000795 else
Jim Ingham47beabb2012-10-16 21:41:58 +0000796 log->Printf ("SBValue(%p)::CreateChildAtOffset => NULL",
797 value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +0000798 }
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000799 return sb_value;
Enrico Granata979e20d2011-07-29 19:53:35 +0000800}
801
802lldb::SBValue
Greg Claytond68e0892011-09-09 23:04:00 +0000803SBValue::Cast (SBType type)
Enrico Granata979e20d2011-07-29 19:53:35 +0000804{
Greg Clayton4eb01a72012-01-31 04:25:15 +0000805 lldb::SBValue sb_value;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000806 lldb::ValueObjectSP value_sp(GetSP());
807 TypeImplSP type_sp (type.GetSP());
808 if (value_sp && type_sp)
Enrico Granata3d656c72012-10-22 18:18:36 +0000809 sb_value.SetSP(value_sp->Cast(type_sp->GetClangASTType()),GetPreferDynamicValue(),GetPreferSyntheticValue());
Greg Clayton4eb01a72012-01-31 04:25:15 +0000810 return sb_value;
Enrico Granata979e20d2011-07-29 19:53:35 +0000811}
812
813lldb::SBValue
814SBValue::CreateValueFromExpression (const char *name, const char* expression)
815{
Jim Ingham47beabb2012-10-16 21:41:58 +0000816 SBExpressionOptions options;
Greg Clayton75a443b2012-10-16 22:58:25 +0000817 options.ref().SetKeepInMemory(true);
Jim Ingham47beabb2012-10-16 21:41:58 +0000818 return CreateValueFromExpression (name, expression, options);
819}
820
821lldb::SBValue
822SBValue::CreateValueFromExpression (const char *name, const char *expression, SBExpressionOptions &options)
823{
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000824 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000825 lldb::SBValue sb_value;
826 lldb::ValueObjectSP value_sp(GetSP());
827 lldb::ValueObjectSP new_value_sp;
828 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +0000829 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000830 ExecutionContext exe_ctx (value_sp->GetExecutionContextRef());
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000831 ProcessSP process_sp(exe_ctx.GetProcessSP());
832 Process::StopLocker stop_locker;
833 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Johnny Chen9fd2e382011-12-20 01:52:44 +0000834 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000835 if (log)
836 log->Printf ("SBValue(%p)::CreateValueFromExpression() => error: process is running", value_sp.get());
837 }
838 else
839 {
840 Target* target = exe_ctx.GetTargetPtr();
841 if (target)
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000842 {
Greg Clayton75a443b2012-10-16 22:58:25 +0000843 options.ref().SetKeepInMemory(true);
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000844 target->EvaluateExpression (expression,
845 exe_ctx.GetFramePtr(),
Enrico Granatad27026e2012-09-05 20:41:26 +0000846 new_value_sp,
Jim Ingham47beabb2012-10-16 21:41:58 +0000847 options.ref());
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000848 if (new_value_sp)
849 {
850 new_value_sp->SetName(ConstString(name));
851 sb_value.SetSP(new_value_sp);
852 }
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000853 }
Johnny Chen9fd2e382011-12-20 01:52:44 +0000854 }
Enrico Granata979e20d2011-07-29 19:53:35 +0000855 }
Enrico Granata979e20d2011-07-29 19:53:35 +0000856 if (log)
857 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000858 if (new_value_sp)
Greg Clayton12b7ea32012-06-04 20:13:23 +0000859 log->Printf ("SBValue(%p)::CreateValueFromExpression(name=\"%s\", expression=\"%s\") => SBValue (%p)",
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000860 value_sp.get(),
861 name,
862 expression,
863 new_value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +0000864 else
Greg Clayton12b7ea32012-06-04 20:13:23 +0000865 log->Printf ("SBValue(%p)::CreateValueFromExpression(name=\"%s\", expression=\"%s\") => NULL",
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000866 value_sp.get(),
867 name,
868 expression);
Enrico Granata979e20d2011-07-29 19:53:35 +0000869 }
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000870 return sb_value;
Enrico Granata979e20d2011-07-29 19:53:35 +0000871}
872
873lldb::SBValue
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000874SBValue::CreateValueFromAddress(const char* name, lldb::addr_t address, SBType sb_type)
Enrico Granata979e20d2011-07-29 19:53:35 +0000875{
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000876 lldb::SBValue sb_value;
877 lldb::ValueObjectSP value_sp(GetSP());
878 lldb::ValueObjectSP new_value_sp;
879 lldb::TypeImplSP type_impl_sp (sb_type.GetSP());
880 if (value_sp && type_impl_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +0000881 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000882 ClangASTType pointee_ast_type(type_impl_sp->GetASTContext(), type_impl_sp->GetClangASTType().GetPointerType ());
883 lldb::TypeImplSP pointee_type_impl_sp (new TypeImpl(pointee_ast_type));
884 if (pointee_type_impl_sp)
Enrico Granatac9310302011-08-04 17:07:02 +0000885 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000886
887 lldb::DataBufferSP buffer(new lldb_private::DataBufferHeap(&address,sizeof(lldb::addr_t)));
888
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000889 ExecutionContext exe_ctx (value_sp->GetExecutionContextRef());
890 ValueObjectSP ptr_result_valobj_sp(ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000891 pointee_type_impl_sp->GetASTContext(),
892 pointee_type_impl_sp->GetOpaqueQualType(),
893 ConstString(name),
894 buffer,
895 lldb::endian::InlHostByteOrder(),
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000896 exe_ctx.GetAddressByteSize()));
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000897
898 if (ptr_result_valobj_sp)
899 {
900 ptr_result_valobj_sp->GetValue().SetValueType(Value::eValueTypeLoadAddress);
901 Error err;
902 new_value_sp = ptr_result_valobj_sp->Dereference(err);
903 if (new_value_sp)
904 new_value_sp->SetName(ConstString(name));
905 }
906 sb_value.SetSP(new_value_sp);
Enrico Granatac9310302011-08-04 17:07:02 +0000907 }
Enrico Granata979e20d2011-07-29 19:53:35 +0000908 }
909 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
910 if (log)
911 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000912 if (new_value_sp)
913 log->Printf ("SBValue(%p)::CreateValueFromAddress => \"%s\"", value_sp.get(), new_value_sp->GetName().AsCString());
Johnny Chena713b862011-08-09 22:38:07 +0000914 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000915 log->Printf ("SBValue(%p)::CreateValueFromAddress => NULL", value_sp.get());
Johnny Chena713b862011-08-09 22:38:07 +0000916 }
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000917 return sb_value;
Enrico Granata979e20d2011-07-29 19:53:35 +0000918}
919
Enrico Granata91544802011-09-06 19:20:51 +0000920lldb::SBValue
Greg Claytond68e0892011-09-09 23:04:00 +0000921SBValue::CreateValueFromData (const char* name, SBData data, SBType type)
Enrico Granata91544802011-09-06 19:20:51 +0000922{
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000923 lldb::SBValue sb_value;
924 lldb::ValueObjectSP new_value_sp;
925 lldb::ValueObjectSP value_sp(GetSP());
926 if (value_sp)
Enrico Granata91544802011-09-06 19:20:51 +0000927 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000928 ExecutionContext exe_ctx (value_sp->GetExecutionContextRef());
929
930 new_value_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000931 type.m_opaque_sp->GetASTContext() ,
932 type.m_opaque_sp->GetOpaqueQualType(),
933 ConstString(name),
934 *data.m_opaque_sp,
935 LLDB_INVALID_ADDRESS);
936 new_value_sp->SetAddressTypeOfChildren(eAddressTypeLoad);
937 sb_value.SetSP(new_value_sp);
Enrico Granata91544802011-09-06 19:20:51 +0000938 }
939 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
940 if (log)
941 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000942 if (new_value_sp)
Greg Clayton12b7ea32012-06-04 20:13:23 +0000943 log->Printf ("SBValue(%p)::CreateValueFromData => \"%s\"", value_sp.get(), new_value_sp->GetName().AsCString());
Enrico Granata91544802011-09-06 19:20:51 +0000944 else
Greg Clayton12b7ea32012-06-04 20:13:23 +0000945 log->Printf ("SBValue(%p)::CreateValueFromData => NULL", value_sp.get());
Enrico Granata91544802011-09-06 19:20:51 +0000946 }
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000947 return sb_value;
Enrico Granata91544802011-09-06 19:20:51 +0000948}
949
Chris Lattner24943d22010-06-08 16:52:24 +0000950SBValue
951SBValue::GetChildAtIndex (uint32_t idx)
952{
Greg Clayton8f64c472011-07-15 19:31:49 +0000953 const bool can_create_synthetic = false;
954 lldb::DynamicValueType use_dynamic = eNoDynamicValues;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000955 lldb::ValueObjectSP value_sp(GetSP());
956 if (value_sp)
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000957 {
958 TargetSP target_sp(value_sp->GetTargetSP());
959 if (target_sp)
960 use_dynamic = target_sp->GetPreferDynamicValue();
961 }
Greg Clayton8f64c472011-07-15 19:31:49 +0000962 return GetChildAtIndex (idx, use_dynamic, can_create_synthetic);
Jim Inghame41494a2011-04-16 00:01:13 +0000963}
964
965SBValue
Greg Clayton8f64c472011-07-15 19:31:49 +0000966SBValue::GetChildAtIndex (uint32_t idx, lldb::DynamicValueType use_dynamic, bool can_create_synthetic)
Jim Inghame41494a2011-04-16 00:01:13 +0000967{
Chris Lattner24943d22010-06-08 16:52:24 +0000968 lldb::ValueObjectSP child_sp;
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000969 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Chris Lattner24943d22010-06-08 16:52:24 +0000970
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000971 lldb::ValueObjectSP value_sp(GetSP());
972 if (value_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000973 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000974 ProcessSP process_sp(value_sp->GetProcessSP());
975 Process::StopLocker stop_locker;
976 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Claytonb9dcc512011-06-29 18:28:50 +0000977 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000978 if (log)
979 log->Printf ("SBValue(%p)::GetChildAtIndex() => error: process is running", value_sp.get());
980 }
981 else
982 {
983 TargetSP target_sp(value_sp->GetTargetSP());
984 if (target_sp)
Greg Claytonfab305b2011-05-20 23:51:26 +0000985 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000986 Mutex::Locker api_locker (target_sp->GetAPIMutex());
987 const bool can_create = true;
988 child_sp = value_sp->GetChildAtIndex (idx, can_create);
989 if (can_create_synthetic && !child_sp)
Greg Claytonb9dcc512011-06-29 18:28:50 +0000990 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000991 if (value_sp->IsPointerType())
992 {
993 child_sp = value_sp->GetSyntheticArrayMemberFromPointer(idx, can_create);
994 }
995 else if (value_sp->IsArrayType())
996 {
997 child_sp = value_sp->GetSyntheticArrayMemberFromArray(idx, can_create);
998 }
Greg Clayton8f64c472011-07-15 19:31:49 +0000999 }
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001000
Greg Claytonfab305b2011-05-20 23:51:26 +00001001 }
Jim Inghame41494a2011-04-16 00:01:13 +00001002 }
1003 }
1004
Enrico Granata3d656c72012-10-22 18:18:36 +00001005 SBValue sb_value;
1006 sb_value.SetSP (child_sp, use_dynamic, GetPreferSyntheticValue());
Greg Clayton49ce6822010-10-31 03:01:06 +00001007 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001008 log->Printf ("SBValue(%p)::GetChildAtIndex (%u) => SBValue(%p)", value_sp.get(), idx, value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +00001009
Chris Lattner24943d22010-06-08 16:52:24 +00001010 return sb_value;
1011}
1012
1013uint32_t
1014SBValue::GetIndexOfChildWithName (const char *name)
1015{
Greg Clayton49ce6822010-10-31 03:01:06 +00001016 uint32_t idx = UINT32_MAX;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001017 lldb::ValueObjectSP value_sp(GetSP());
1018 if (value_sp)
Greg Claytonfab305b2011-05-20 23:51:26 +00001019 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001020 TargetSP target_sp(value_sp->GetTargetSP());
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001021 if (target_sp)
Greg Claytonb9dcc512011-06-29 18:28:50 +00001022 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001023 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Claytonfab305b2011-05-20 23:51:26 +00001024
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001025 idx = value_sp->GetIndexOfChildWithName (ConstString(name));
Greg Claytonb9dcc512011-06-29 18:28:50 +00001026 }
Greg Claytonfab305b2011-05-20 23:51:26 +00001027 }
Greg Claytone005f2c2010-11-06 01:53:30 +00001028 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +00001029 if (log)
1030 {
1031 if (idx == UINT32_MAX)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001032 log->Printf ("SBValue(%p)::GetIndexOfChildWithName (name=\"%s\") => NOT FOUND", value_sp.get(), name);
Greg Clayton49ce6822010-10-31 03:01:06 +00001033 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001034 log->Printf ("SBValue(%p)::GetIndexOfChildWithName (name=\"%s\") => %u", value_sp.get(), name, idx);
Greg Clayton49ce6822010-10-31 03:01:06 +00001035 }
1036 return idx;
Chris Lattner24943d22010-06-08 16:52:24 +00001037}
1038
1039SBValue
1040SBValue::GetChildMemberWithName (const char *name)
1041{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001042 lldb::ValueObjectSP value_sp(GetSP());
1043 if (value_sp)
Johnny Chen446ccaa2011-06-29 21:19:39 +00001044 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001045 lldb::DynamicValueType use_dynamic_value = eNoDynamicValues;
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001046 TargetSP target_sp(value_sp->GetTargetSP());
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001047 if (target_sp)
1048 {
1049 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1050 use_dynamic_value = target_sp->GetPreferDynamicValue();
1051 }
Johnny Chen446ccaa2011-06-29 21:19:39 +00001052 return GetChildMemberWithName (name, use_dynamic_value);
1053 }
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001054 return SBValue();
Jim Inghame41494a2011-04-16 00:01:13 +00001055}
1056
1057SBValue
Jim Ingham10de7d12011-05-04 03:43:18 +00001058SBValue::GetChildMemberWithName (const char *name, lldb::DynamicValueType use_dynamic_value)
Jim Inghame41494a2011-04-16 00:01:13 +00001059{
Chris Lattner24943d22010-06-08 16:52:24 +00001060 lldb::ValueObjectSP child_sp;
1061 const ConstString str_name (name);
1062
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001063 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton905acaf2011-05-20 22:07:17 +00001064
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001065 lldb::ValueObjectSP value_sp(GetSP());
1066 if (value_sp)
Chris Lattner24943d22010-06-08 16:52:24 +00001067 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001068 ProcessSP process_sp(value_sp->GetProcessSP());
1069 Process::StopLocker stop_locker;
1070 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Jim Inghame41494a2011-04-16 00:01:13 +00001071 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001072 if (log)
1073 log->Printf ("SBValue(%p)::GetChildMemberWithName() => error: process is running", value_sp.get());
1074 }
1075 else
1076 {
1077 TargetSP target_sp(value_sp->GetTargetSP());
1078 if (target_sp)
Greg Claytonfab305b2011-05-20 23:51:26 +00001079 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001080 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1081 child_sp = value_sp->GetChildMemberWithName (str_name, true);
Greg Claytonfab305b2011-05-20 23:51:26 +00001082 }
Jim Inghame41494a2011-04-16 00:01:13 +00001083 }
1084 }
1085
Enrico Granata3d656c72012-10-22 18:18:36 +00001086 SBValue sb_value;
1087 sb_value.SetSP(child_sp, use_dynamic_value, GetPreferSyntheticValue());
Greg Clayton49ce6822010-10-31 03:01:06 +00001088
Greg Clayton49ce6822010-10-31 03:01:06 +00001089 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001090 log->Printf ("SBValue(%p)::GetChildMemberWithName (name=\"%s\") => SBValue(%p)", value_sp.get(), name, value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +00001091
Chris Lattner24943d22010-06-08 16:52:24 +00001092 return sb_value;
1093}
1094
Enrico Granataf7a9b142011-07-15 02:26:42 +00001095lldb::SBValue
Jim Ingham1b425752011-12-08 19:44:08 +00001096SBValue::GetDynamicValue (lldb::DynamicValueType use_dynamic)
1097{
Enrico Granata3d656c72012-10-22 18:18:36 +00001098 SBValue value_sb;
1099 if (IsValid())
Jim Ingham1b425752011-12-08 19:44:08 +00001100 {
Enrico Granata3d656c72012-10-22 18:18:36 +00001101 ValueImplSP proxy_sp(new ValueImpl(m_opaque_sp->GetRootSP(),use_dynamic,m_opaque_sp->GetUseSynthetic()));
1102 value_sb.SetSP(proxy_sp);
Jim Ingham1b425752011-12-08 19:44:08 +00001103 }
Enrico Granata3d656c72012-10-22 18:18:36 +00001104 return value_sb;
Jim Ingham1b425752011-12-08 19:44:08 +00001105}
1106
1107lldb::SBValue
1108SBValue::GetStaticValue ()
1109{
Enrico Granata3d656c72012-10-22 18:18:36 +00001110 SBValue value_sb;
1111 if (IsValid())
Jim Ingham1b425752011-12-08 19:44:08 +00001112 {
Enrico Granata3d656c72012-10-22 18:18:36 +00001113 ValueImplSP proxy_sp(new ValueImpl(m_opaque_sp->GetRootSP(),eNoDynamicValues,m_opaque_sp->GetUseSynthetic()));
1114 value_sb.SetSP(proxy_sp);
Jim Ingham1b425752011-12-08 19:44:08 +00001115 }
Enrico Granata3d656c72012-10-22 18:18:36 +00001116 return value_sb;
Jim Ingham1b425752011-12-08 19:44:08 +00001117}
1118
Enrico Granatadba1de82012-03-27 02:35:13 +00001119lldb::SBValue
1120SBValue::GetNonSyntheticValue ()
1121{
Enrico Granata3d656c72012-10-22 18:18:36 +00001122 SBValue value_sb;
1123 if (IsValid())
Enrico Granatadba1de82012-03-27 02:35:13 +00001124 {
Enrico Granata3d656c72012-10-22 18:18:36 +00001125 ValueImplSP proxy_sp(new ValueImpl(m_opaque_sp->GetRootSP(),m_opaque_sp->GetUseDynamic(),false));
1126 value_sb.SetSP(proxy_sp);
Enrico Granatadba1de82012-03-27 02:35:13 +00001127 }
Enrico Granata3d656c72012-10-22 18:18:36 +00001128 return value_sb;
1129}
1130
1131lldb::DynamicValueType
1132SBValue::GetPreferDynamicValue ()
1133{
1134 if (!IsValid())
1135 return eNoDynamicValues;
1136 return m_opaque_sp->GetUseDynamic();
1137}
1138
1139void
1140SBValue::SetPreferDynamicValue (lldb::DynamicValueType use_dynamic)
1141{
1142 if (IsValid())
1143 return m_opaque_sp->SetUseDynamic (use_dynamic);
1144}
1145
1146bool
1147SBValue::GetPreferSyntheticValue ()
1148{
1149 if (!IsValid())
1150 return false;
1151 return m_opaque_sp->GetUseSynthetic();
1152}
1153
1154void
1155SBValue::SetPreferSyntheticValue (bool use_synthetic)
1156{
1157 if (IsValid())
1158 return m_opaque_sp->SetUseSynthetic (use_synthetic);
Enrico Granatadba1de82012-03-27 02:35:13 +00001159}
1160
Jim Ingham1b425752011-12-08 19:44:08 +00001161bool
1162SBValue::IsDynamic()
1163{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001164 lldb::ValueObjectSP value_sp(GetSP());
1165 if (value_sp)
Jim Ingham1b425752011-12-08 19:44:08 +00001166 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001167 TargetSP target_sp(value_sp->GetTargetSP());
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001168 if (target_sp)
Jim Ingham1b425752011-12-08 19:44:08 +00001169 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001170 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001171 return value_sp->IsDynamic();
Jim Ingham1b425752011-12-08 19:44:08 +00001172 }
1173 }
1174 return false;
1175}
1176
Enrico Granata3d656c72012-10-22 18:18:36 +00001177bool
1178SBValue::IsSynthetic ()
1179{
1180 lldb::ValueObjectSP value_sp(GetSP());
1181 if (value_sp)
1182 {
1183 TargetSP target_sp(value_sp->GetTargetSP());
1184 if (target_sp)
1185 {
1186 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1187 return value_sp->IsSynthetic();
1188 }
1189 }
1190 return false;
1191}
1192
Jim Ingham1b425752011-12-08 19:44:08 +00001193lldb::SBValue
Enrico Granataf7a9b142011-07-15 02:26:42 +00001194SBValue::GetValueForExpressionPath(const char* expr_path)
1195{
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001196 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granataf7a9b142011-07-15 02:26:42 +00001197 lldb::ValueObjectSP child_sp;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001198 lldb::ValueObjectSP value_sp(GetSP());
1199 if (value_sp)
Enrico Granataf7a9b142011-07-15 02:26:42 +00001200 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001201 ProcessSP process_sp(value_sp->GetProcessSP());
1202 Process::StopLocker stop_locker;
1203 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granataf7a9b142011-07-15 02:26:42 +00001204 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001205 if (log)
1206 log->Printf ("SBValue(%p)::GetValueForExpressionPath() => error: process is running", value_sp.get());
1207 }
1208 else
1209 {
1210 TargetSP target_sp(value_sp->GetTargetSP());
1211 if (target_sp)
1212 {
1213 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1214 // using default values for all the fancy options, just do it if you can
1215 child_sp = value_sp->GetValueForExpressionPath(expr_path);
1216 }
Enrico Granataf7a9b142011-07-15 02:26:42 +00001217 }
1218 }
1219
Enrico Granata3d656c72012-10-22 18:18:36 +00001220 SBValue sb_value;
1221 sb_value.SetSP(child_sp,GetPreferDynamicValue(),GetPreferSyntheticValue());
Enrico Granataf7a9b142011-07-15 02:26:42 +00001222
Enrico Granataf7a9b142011-07-15 02:26:42 +00001223 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001224 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 +00001225
1226 return sb_value;
1227}
Chris Lattner24943d22010-06-08 16:52:24 +00001228
Greg Clayton0fb0bcc2011-08-03 22:57:10 +00001229int64_t
Enrico Granatac92eb402011-08-04 01:41:02 +00001230SBValue::GetValueAsSigned(SBError& error, int64_t fail_value)
1231{
Jim Ingham574c3d62011-08-12 23:34:31 +00001232 error.Clear();
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001233 lldb::ValueObjectSP value_sp(GetSP());
1234 if (value_sp)
Enrico Granatac92eb402011-08-04 01:41:02 +00001235 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001236 ProcessSP process_sp(value_sp->GetProcessSP());
1237 Process::StopLocker stop_locker;
1238 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granatac92eb402011-08-04 01:41:02 +00001239 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001240 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1241 if (log)
1242 log->Printf ("SBValue(%p)::GetValueAsSigned() => error: process is running", value_sp.get());
1243 error.SetErrorString("process is running");
Enrico Granatac92eb402011-08-04 01:41:02 +00001244 }
1245 else
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001246 {
1247 TargetSP target_sp(value_sp->GetTargetSP());
1248 if (target_sp)
1249 {
1250 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1251 Scalar scalar;
1252 if (value_sp->ResolveValue (scalar))
Enrico Granata0fd6c8d2012-10-24 18:14:21 +00001253 return scalar.SLongLong(fail_value);
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001254 else
1255 error.SetErrorString("could not get value");
1256 }
1257 else
1258 error.SetErrorString("could not get target");
1259 }
Enrico Granatac92eb402011-08-04 01:41:02 +00001260 }
1261 error.SetErrorString("invalid SBValue");
1262 return fail_value;
1263}
1264
1265uint64_t
1266SBValue::GetValueAsUnsigned(SBError& error, uint64_t fail_value)
1267{
Jim Ingham574c3d62011-08-12 23:34:31 +00001268 error.Clear();
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001269 lldb::ValueObjectSP value_sp(GetSP());
1270 if (value_sp)
Enrico Granatac92eb402011-08-04 01:41:02 +00001271 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001272 ProcessSP process_sp(value_sp->GetProcessSP());
1273 Process::StopLocker stop_locker;
1274 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granatac92eb402011-08-04 01:41:02 +00001275 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001276 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1277 if (log)
1278 log->Printf ("SBValue(%p)::GetValueAsUnsigned() => error: process is running", value_sp.get());
1279 error.SetErrorString("process is running");
Enrico Granatac92eb402011-08-04 01:41:02 +00001280 }
1281 else
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001282 {
1283 TargetSP target_sp(value_sp->GetTargetSP());
1284 if (target_sp)
1285 {
1286 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1287 Scalar scalar;
1288 if (value_sp->ResolveValue (scalar))
Enrico Granata4a0a1252012-10-24 20:24:39 +00001289 return scalar.ULongLong(fail_value);
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001290 else
1291 error.SetErrorString("could not get value");
1292 }
1293 else
1294 error.SetErrorString("could not get target");
1295 }
Enrico Granatac92eb402011-08-04 01:41:02 +00001296 }
1297 error.SetErrorString("invalid SBValue");
1298 return fail_value;
1299}
1300
1301int64_t
Greg Clayton0fb0bcc2011-08-03 22:57:10 +00001302SBValue::GetValueAsSigned(int64_t fail_value)
1303{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001304 lldb::ValueObjectSP value_sp(GetSP());
1305 if (value_sp)
Greg Clayton0fb0bcc2011-08-03 22:57:10 +00001306 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001307 ProcessSP process_sp(value_sp->GetProcessSP());
1308 Process::StopLocker stop_locker;
1309 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Clayton0fb0bcc2011-08-03 22:57:10 +00001310 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001311 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1312 if (log)
1313 log->Printf ("SBValue(%p)::GetValueAsSigned() => error: process is running", value_sp.get());
1314 }
1315 else
1316 {
1317 TargetSP target_sp(value_sp->GetTargetSP());
1318 if (target_sp)
1319 {
1320 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1321 Scalar scalar;
1322 if (value_sp->ResolveValue (scalar))
Enrico Granata0fd6c8d2012-10-24 18:14:21 +00001323 return scalar.SLongLong(fail_value);
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001324 }
Greg Clayton0fb0bcc2011-08-03 22:57:10 +00001325 }
1326 }
1327 return fail_value;
1328}
1329
1330uint64_t
1331SBValue::GetValueAsUnsigned(uint64_t fail_value)
1332{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001333 lldb::ValueObjectSP value_sp(GetSP());
1334 if (value_sp)
Greg Clayton0fb0bcc2011-08-03 22:57:10 +00001335 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001336 ProcessSP process_sp(value_sp->GetProcessSP());
1337 Process::StopLocker stop_locker;
1338 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Clayton0fb0bcc2011-08-03 22:57:10 +00001339 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001340 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1341 if (log)
1342 log->Printf ("SBValue(%p)::GetValueAsUnsigned() => error: process is running", value_sp.get());
1343 }
1344 else
1345 {
1346 TargetSP target_sp(value_sp->GetTargetSP());
1347 if (target_sp)
1348 {
1349 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1350 Scalar scalar;
1351 if (value_sp->ResolveValue (scalar))
Enrico Granata4a0a1252012-10-24 20:24:39 +00001352 return scalar.ULongLong(fail_value);
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001353 }
Greg Clayton0fb0bcc2011-08-03 22:57:10 +00001354 }
1355 }
1356 return fail_value;
1357}
1358
Greg Clayton54037b12012-10-23 01:50:10 +00001359bool
1360SBValue::MightHaveChildren ()
1361{
1362 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1363 bool has_children = false;
1364 lldb::ValueObjectSP value_sp(GetSP());
1365 if (value_sp)
1366 has_children = value_sp->MightHaveChildren();
1367
1368 if (log)
1369 log->Printf ("SBValue(%p)::HasChildren() => %i", value_sp.get(), has_children);
1370 return has_children;
1371}
1372
Chris Lattner24943d22010-06-08 16:52:24 +00001373uint32_t
1374SBValue::GetNumChildren ()
1375{
1376 uint32_t num_children = 0;
1377
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001378 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001379 lldb::ValueObjectSP value_sp(GetSP());
1380 if (value_sp)
Greg Claytonfab305b2011-05-20 23:51:26 +00001381 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001382 ProcessSP process_sp(value_sp->GetProcessSP());
1383 Process::StopLocker stop_locker;
1384 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Claytonb9dcc512011-06-29 18:28:50 +00001385 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001386 if (log)
1387 log->Printf ("SBValue(%p)::GetNumChildren() => error: process is running", value_sp.get());
1388 }
1389 else
1390 {
1391 TargetSP target_sp(value_sp->GetTargetSP());
1392 if (target_sp)
1393 {
1394 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Claytonfab305b2011-05-20 23:51:26 +00001395
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001396 num_children = value_sp->GetNumChildren();
1397 }
Greg Claytonb9dcc512011-06-29 18:28:50 +00001398 }
Greg Claytonfab305b2011-05-20 23:51:26 +00001399 }
Greg Clayton49ce6822010-10-31 03:01:06 +00001400
Greg Clayton49ce6822010-10-31 03:01:06 +00001401 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001402 log->Printf ("SBValue(%p)::GetNumChildren () => %u", value_sp.get(), num_children);
Chris Lattner24943d22010-06-08 16:52:24 +00001403
1404 return num_children;
1405}
1406
Chris Lattner24943d22010-06-08 16:52:24 +00001407
1408SBValue
1409SBValue::Dereference ()
1410{
Greg Clayton49ce6822010-10-31 03:01:06 +00001411 SBValue sb_value;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001412 lldb::ValueObjectSP value_sp(GetSP());
1413 if (value_sp)
Chris Lattner24943d22010-06-08 16:52:24 +00001414 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001415 TargetSP target_sp(value_sp->GetTargetSP());
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001416 if (target_sp)
Greg Claytonb9dcc512011-06-29 18:28:50 +00001417 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001418 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Claytonfab305b2011-05-20 23:51:26 +00001419
Greg Claytonb9dcc512011-06-29 18:28:50 +00001420 Error error;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001421 sb_value = value_sp->Dereference (error);
Greg Claytonb9dcc512011-06-29 18:28:50 +00001422 }
Chris Lattner24943d22010-06-08 16:52:24 +00001423 }
Greg Claytone005f2c2010-11-06 01:53:30 +00001424 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +00001425 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001426 log->Printf ("SBValue(%p)::Dereference () => SBValue(%p)", value_sp.get(), value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +00001427
1428 return sb_value;
Chris Lattner24943d22010-06-08 16:52:24 +00001429}
1430
1431bool
Greg Clayton49ce6822010-10-31 03:01:06 +00001432SBValue::TypeIsPointerType ()
Chris Lattner24943d22010-06-08 16:52:24 +00001433{
1434 bool is_ptr_type = false;
1435
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001436 lldb::ValueObjectSP value_sp(GetSP());
1437 if (value_sp)
Greg Claytonfab305b2011-05-20 23:51:26 +00001438 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001439 TargetSP target_sp(value_sp->GetTargetSP());
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001440 if (target_sp)
Greg Claytonb9dcc512011-06-29 18:28:50 +00001441 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001442 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Claytonfab305b2011-05-20 23:51:26 +00001443
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001444 is_ptr_type = value_sp->IsPointerType();
Greg Claytonb9dcc512011-06-29 18:28:50 +00001445 }
Greg Claytonfab305b2011-05-20 23:51:26 +00001446 }
Greg Clayton49ce6822010-10-31 03:01:06 +00001447
Greg Claytone005f2c2010-11-06 01:53:30 +00001448 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +00001449 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001450 log->Printf ("SBValue(%p)::TypeIsPointerType () => %i", value_sp.get(), is_ptr_type);
Greg Clayton49ce6822010-10-31 03:01:06 +00001451
Chris Lattner24943d22010-06-08 16:52:24 +00001452
1453 return is_ptr_type;
1454}
1455
Chris Lattner24943d22010-06-08 16:52:24 +00001456void *
1457SBValue::GetOpaqueType()
1458{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001459 lldb::ValueObjectSP value_sp(GetSP());
1460 if (value_sp)
Greg Claytonfab305b2011-05-20 23:51:26 +00001461 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001462 TargetSP target_sp(value_sp->GetTargetSP());
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001463 if (target_sp)
Greg Claytonb9dcc512011-06-29 18:28:50 +00001464 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001465 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Claytonfab305b2011-05-20 23:51:26 +00001466
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001467 return value_sp->GetClangType();
Greg Claytonb9dcc512011-06-29 18:28:50 +00001468 }
Greg Claytonfab305b2011-05-20 23:51:26 +00001469 }
Chris Lattner24943d22010-06-08 16:52:24 +00001470 return NULL;
1471}
1472
Enrico Granata979e20d2011-07-29 19:53:35 +00001473lldb::SBTarget
1474SBValue::GetTarget()
1475{
Greg Clayton334d33a2012-01-30 07:41:31 +00001476 SBTarget sb_target;
1477 TargetSP target_sp;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001478 lldb::ValueObjectSP value_sp(GetSP());
1479 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +00001480 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001481 target_sp = value_sp->GetTargetSP();
Greg Clayton334d33a2012-01-30 07:41:31 +00001482 sb_target.SetSP (target_sp);
Enrico Granata979e20d2011-07-29 19:53:35 +00001483 }
1484 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1485 if (log)
1486 {
Greg Clayton334d33a2012-01-30 07:41:31 +00001487 if (target_sp.get() == NULL)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001488 log->Printf ("SBValue(%p)::GetTarget () => NULL", value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001489 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001490 log->Printf ("SBValue(%p)::GetTarget () => %p", value_sp.get(), target_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001491 }
Greg Clayton334d33a2012-01-30 07:41:31 +00001492 return sb_target;
Enrico Granata979e20d2011-07-29 19:53:35 +00001493}
1494
1495lldb::SBProcess
1496SBValue::GetProcess()
1497{
Greg Clayton334d33a2012-01-30 07:41:31 +00001498 SBProcess sb_process;
1499 ProcessSP process_sp;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001500 lldb::ValueObjectSP value_sp(GetSP());
1501 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +00001502 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001503 process_sp = value_sp->GetProcessSP();
Greg Clayton334d33a2012-01-30 07:41:31 +00001504 if (process_sp)
1505 sb_process.SetSP (process_sp);
Enrico Granata979e20d2011-07-29 19:53:35 +00001506 }
1507 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1508 if (log)
1509 {
Greg Clayton334d33a2012-01-30 07:41:31 +00001510 if (process_sp.get() == NULL)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001511 log->Printf ("SBValue(%p)::GetProcess () => NULL", value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001512 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001513 log->Printf ("SBValue(%p)::GetProcess () => %p", value_sp.get(), process_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001514 }
Greg Clayton334d33a2012-01-30 07:41:31 +00001515 return sb_process;
Enrico Granata979e20d2011-07-29 19:53:35 +00001516}
1517
1518lldb::SBThread
1519SBValue::GetThread()
1520{
Greg Clayton90c52142012-01-30 02:53:15 +00001521 SBThread sb_thread;
1522 ThreadSP thread_sp;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001523 lldb::ValueObjectSP value_sp(GetSP());
1524 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +00001525 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001526 thread_sp = value_sp->GetThreadSP();
1527 sb_thread.SetThread(thread_sp);
Enrico Granata979e20d2011-07-29 19:53:35 +00001528 }
1529 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1530 if (log)
1531 {
Greg Clayton90c52142012-01-30 02:53:15 +00001532 if (thread_sp.get() == NULL)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001533 log->Printf ("SBValue(%p)::GetThread () => NULL", value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001534 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001535 log->Printf ("SBValue(%p)::GetThread () => %p", value_sp.get(), thread_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001536 }
Greg Clayton90c52142012-01-30 02:53:15 +00001537 return sb_thread;
Enrico Granata979e20d2011-07-29 19:53:35 +00001538}
1539
1540lldb::SBFrame
1541SBValue::GetFrame()
1542{
Greg Clayton334d33a2012-01-30 07:41:31 +00001543 SBFrame sb_frame;
1544 StackFrameSP frame_sp;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001545 lldb::ValueObjectSP value_sp(GetSP());
1546 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +00001547 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001548 frame_sp = value_sp->GetFrameSP();
1549 sb_frame.SetFrameSP (frame_sp);
Enrico Granata979e20d2011-07-29 19:53:35 +00001550 }
1551 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1552 if (log)
1553 {
Greg Clayton334d33a2012-01-30 07:41:31 +00001554 if (frame_sp.get() == NULL)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001555 log->Printf ("SBValue(%p)::GetFrame () => NULL", value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001556 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001557 log->Printf ("SBValue(%p)::GetFrame () => %p", value_sp.get(), frame_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001558 }
Greg Clayton334d33a2012-01-30 07:41:31 +00001559 return sb_frame;
Enrico Granata979e20d2011-07-29 19:53:35 +00001560}
1561
1562
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001563lldb::ValueObjectSP
1564SBValue::GetSP () const
Chris Lattner24943d22010-06-08 16:52:24 +00001565{
Enrico Granata3d656c72012-10-22 18:18:36 +00001566 if (!m_opaque_sp || !m_opaque_sp->IsValid())
1567 return ValueObjectSP();
1568 return m_opaque_sp->GetSP();
1569}
1570
1571void
1572SBValue::SetSP (ValueImplSP impl_sp)
1573{
1574 m_opaque_sp = impl_sp;
Chris Lattner24943d22010-06-08 16:52:24 +00001575}
1576
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001577void
1578SBValue::SetSP (const lldb::ValueObjectSP &sp)
Chris Lattner24943d22010-06-08 16:52:24 +00001579{
Enrico Granata3d656c72012-10-22 18:18:36 +00001580 if (sp)
1581 {
1582 lldb::TargetSP target_sp(sp->GetTargetSP());
1583 if (target_sp)
1584 {
1585 lldb::DynamicValueType use_dynamic = target_sp->GetPreferDynamicValue();
1586 bool use_synthetic = target_sp->TargetProperties::GetEnableSyntheticValue();
1587 m_opaque_sp = ValueImplSP(new ValueImpl(sp, use_dynamic, use_synthetic));
1588 }
1589 else
1590 m_opaque_sp = ValueImplSP(new ValueImpl(sp,eNoDynamicValues,true));
1591 }
1592 else
1593 m_opaque_sp = ValueImplSP(new ValueImpl(sp,eNoDynamicValues,false));
Chris Lattner24943d22010-06-08 16:52:24 +00001594}
Caroline Tice98f930f2010-09-20 05:20:02 +00001595
Enrico Granata3d656c72012-10-22 18:18:36 +00001596void
1597SBValue::SetSP (const lldb::ValueObjectSP &sp, lldb::DynamicValueType use_dynamic)
1598{
1599 if (sp)
1600 {
1601 lldb::TargetSP target_sp(sp->GetTargetSP());
1602 if (target_sp)
1603 {
1604 bool use_synthetic = target_sp->TargetProperties::GetEnableSyntheticValue();
1605 SetSP (sp, use_dynamic, use_synthetic);
1606 }
1607 else
1608 SetSP (sp, use_dynamic, true);
1609 }
1610 else
1611 SetSP (sp, use_dynamic, false);
1612}
1613
1614void
1615SBValue::SetSP (const lldb::ValueObjectSP &sp, bool use_synthetic)
1616{
1617 if (sp)
1618 {
1619 lldb::TargetSP target_sp(sp->GetTargetSP());
1620 if (target_sp)
1621 {
1622 lldb::DynamicValueType use_dynamic = target_sp->GetPreferDynamicValue();
1623 SetSP (sp, use_dynamic, use_synthetic);
1624 }
1625 else
1626 SetSP (sp, eNoDynamicValues, use_synthetic);
1627 }
1628 else
1629 SetSP (sp, eNoDynamicValues, use_synthetic);
1630}
1631
1632void
1633SBValue::SetSP (const lldb::ValueObjectSP &sp, lldb::DynamicValueType use_dynamic, bool use_synthetic)
1634{
1635 m_opaque_sp = ValueImplSP(new ValueImpl(sp,use_dynamic,use_synthetic));
1636}
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001637
Caroline Tice98f930f2010-09-20 05:20:02 +00001638bool
Greg Clayton49ce6822010-10-31 03:01:06 +00001639SBValue::GetExpressionPath (SBStream &description)
1640{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001641 lldb::ValueObjectSP value_sp(GetSP());
1642 if (value_sp)
Greg Clayton49ce6822010-10-31 03:01:06 +00001643 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001644 value_sp->GetExpressionPath (description.ref(), false);
Greg Claytonb01000f2011-01-17 03:46:26 +00001645 return true;
1646 }
1647 return false;
1648}
1649
1650bool
1651SBValue::GetExpressionPath (SBStream &description, bool qualify_cxx_base_classes)
1652{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001653 lldb::ValueObjectSP value_sp(GetSP());
1654 if (value_sp)
Greg Claytonb01000f2011-01-17 03:46:26 +00001655 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001656 value_sp->GetExpressionPath (description.ref(), qualify_cxx_base_classes);
Greg Clayton49ce6822010-10-31 03:01:06 +00001657 return true;
1658 }
1659 return false;
1660}
1661
1662bool
Caroline Tice98f930f2010-09-20 05:20:02 +00001663SBValue::GetDescription (SBStream &description)
1664{
Greg Clayton96154be2011-11-13 06:57:31 +00001665 Stream &strm = description.ref();
1666
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001667 lldb::ValueObjectSP value_sp(GetSP());
1668 if (value_sp)
Caroline Tice98f930f2010-09-20 05:20:02 +00001669 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001670 ProcessSP process_sp(value_sp->GetProcessSP());
1671 Process::StopLocker stop_locker;
1672 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
1673 {
1674 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1675 if (log)
1676 log->Printf ("SBValue(%p)::GetDescription() => error: process is running", value_sp.get());
1677 }
1678 else
1679 {
1680 ValueObject::DumpValueObject (strm, value_sp.get());
1681 }
Caroline Tice98f930f2010-09-20 05:20:02 +00001682 }
1683 else
Greg Clayton96154be2011-11-13 06:57:31 +00001684 strm.PutCString ("No value");
Caroline Tice98f930f2010-09-20 05:20:02 +00001685
1686 return true;
1687}
Greg Claytone179a582011-01-05 18:43:15 +00001688
1689lldb::Format
Greg Claytond68e0892011-09-09 23:04:00 +00001690SBValue::GetFormat ()
Greg Claytone179a582011-01-05 18:43:15 +00001691{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001692 lldb::ValueObjectSP value_sp(GetSP());
1693 if (value_sp)
1694 return value_sp->GetFormat();
Greg Claytone179a582011-01-05 18:43:15 +00001695 return eFormatDefault;
1696}
1697
1698void
1699SBValue::SetFormat (lldb::Format format)
1700{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001701 lldb::ValueObjectSP value_sp(GetSP());
1702 if (value_sp)
1703 value_sp->SetFormat(format);
Greg Claytone179a582011-01-05 18:43:15 +00001704}
1705
Enrico Granata979e20d2011-07-29 19:53:35 +00001706lldb::SBValue
1707SBValue::AddressOf()
1708{
1709 SBValue sb_value;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001710 lldb::ValueObjectSP value_sp(GetSP());
1711 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +00001712 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001713 TargetSP target_sp (value_sp->GetTargetSP());
1714 if (target_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +00001715 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001716 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Enrico Granata979e20d2011-07-29 19:53:35 +00001717 Error error;
Enrico Granata3d656c72012-10-22 18:18:36 +00001718 sb_value.SetSP(value_sp->AddressOf (error),GetPreferDynamicValue(), GetPreferSyntheticValue());
Enrico Granata979e20d2011-07-29 19:53:35 +00001719 }
1720 }
1721 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1722 if (log)
Greg Clayton12b7ea32012-06-04 20:13:23 +00001723 log->Printf ("SBValue(%p)::AddressOf () => SBValue(%p)", value_sp.get(), value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001724
1725 return sb_value;
Johnny Chena713b862011-08-09 22:38:07 +00001726}
Enrico Granata91544802011-09-06 19:20:51 +00001727
1728lldb::addr_t
1729SBValue::GetLoadAddress()
1730{
1731 lldb::addr_t value = LLDB_INVALID_ADDRESS;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001732 lldb::ValueObjectSP value_sp(GetSP());
1733 if (value_sp)
Enrico Granata91544802011-09-06 19:20:51 +00001734 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001735 TargetSP target_sp (value_sp->GetTargetSP());
1736 if (target_sp)
Enrico Granata91544802011-09-06 19:20:51 +00001737 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001738 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Enrico Granata91544802011-09-06 19:20:51 +00001739 const bool scalar_is_load_address = true;
1740 AddressType addr_type;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001741 value = value_sp->GetAddressOf(scalar_is_load_address, &addr_type);
Enrico Granata91544802011-09-06 19:20:51 +00001742 if (addr_type == eAddressTypeFile)
1743 {
Greg Clayton3508c382012-02-24 01:59:29 +00001744 ModuleSP module_sp (value_sp->GetModule());
1745 if (!module_sp)
Enrico Granata91544802011-09-06 19:20:51 +00001746 value = LLDB_INVALID_ADDRESS;
1747 else
1748 {
1749 Address addr;
Greg Clayton3508c382012-02-24 01:59:29 +00001750 module_sp->ResolveFileAddress(value, addr);
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001751 value = addr.GetLoadAddress(target_sp.get());
Enrico Granata91544802011-09-06 19:20:51 +00001752 }
1753 }
1754 else if (addr_type == eAddressTypeHost || addr_type == eAddressTypeInvalid)
1755 value = LLDB_INVALID_ADDRESS;
1756 }
1757 }
1758 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1759 if (log)
Daniel Malea5f35a4b2012-11-29 21:49:15 +00001760 log->Printf ("SBValue(%p)::GetLoadAddress () => (%" PRIu64 ")", value_sp.get(), value);
Enrico Granata91544802011-09-06 19:20:51 +00001761
1762 return value;
1763}
1764
1765lldb::SBAddress
1766SBValue::GetAddress()
1767{
1768 Address addr;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001769 lldb::ValueObjectSP value_sp(GetSP());
1770 if (value_sp)
Enrico Granata91544802011-09-06 19:20:51 +00001771 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001772 TargetSP target_sp (value_sp->GetTargetSP());
1773 if (target_sp)
Enrico Granata91544802011-09-06 19:20:51 +00001774 {
1775 lldb::addr_t value = LLDB_INVALID_ADDRESS;
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001776 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Enrico Granata91544802011-09-06 19:20:51 +00001777 const bool scalar_is_load_address = true;
1778 AddressType addr_type;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001779 value = value_sp->GetAddressOf(scalar_is_load_address, &addr_type);
Enrico Granata91544802011-09-06 19:20:51 +00001780 if (addr_type == eAddressTypeFile)
1781 {
Greg Clayton3508c382012-02-24 01:59:29 +00001782 ModuleSP module_sp (value_sp->GetModule());
1783 if (module_sp)
1784 module_sp->ResolveFileAddress(value, addr);
Enrico Granata91544802011-09-06 19:20:51 +00001785 }
1786 else if (addr_type == eAddressTypeLoad)
1787 {
1788 // no need to check the return value on this.. if it can actually do the resolve
1789 // addr will be in the form (section,offset), otherwise it will simply be returned
1790 // as (NULL, value)
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001791 addr.SetLoadAddress(value, target_sp.get());
Enrico Granata91544802011-09-06 19:20:51 +00001792 }
1793 }
1794 }
1795 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1796 if (log)
Daniel Malea5f35a4b2012-11-29 21:49:15 +00001797 log->Printf ("SBValue(%p)::GetAddress () => (%s,%" PRIu64 ")", value_sp.get(),
Jim Ingham47beabb2012-10-16 21:41:58 +00001798 (addr.GetSection() ? addr.GetSection()->GetName().GetCString() : "NULL"),
1799 addr.GetOffset());
Enrico Granata91544802011-09-06 19:20:51 +00001800 return SBAddress(new Address(addr));
1801}
1802
1803lldb::SBData
1804SBValue::GetPointeeData (uint32_t item_idx,
1805 uint32_t item_count)
1806{
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001807 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata91544802011-09-06 19:20:51 +00001808 lldb::SBData sb_data;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001809 lldb::ValueObjectSP value_sp(GetSP());
1810 if (value_sp)
Enrico Granata91544802011-09-06 19:20:51 +00001811 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001812 ProcessSP process_sp(value_sp->GetProcessSP());
1813 Process::StopLocker stop_locker;
1814 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granata91544802011-09-06 19:20:51 +00001815 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001816 if (log)
1817 log->Printf ("SBValue(%p)::GetPointeeData() => error: process is running", value_sp.get());
1818 }
1819 else
1820 {
1821 TargetSP target_sp (value_sp->GetTargetSP());
1822 if (target_sp)
1823 {
1824 DataExtractorSP data_sp(new DataExtractor());
1825 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1826 value_sp->GetPointeeData(*data_sp, item_idx, item_count);
1827 if (data_sp->GetByteSize() > 0)
1828 *sb_data = data_sp;
1829 }
Enrico Granata91544802011-09-06 19:20:51 +00001830 }
1831 }
Enrico Granata91544802011-09-06 19:20:51 +00001832 if (log)
1833 log->Printf ("SBValue(%p)::GetPointeeData (%d, %d) => SBData(%p)",
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001834 value_sp.get(),
Enrico Granata91544802011-09-06 19:20:51 +00001835 item_idx,
1836 item_count,
1837 sb_data.get());
1838
1839 return sb_data;
1840}
1841
1842lldb::SBData
1843SBValue::GetData ()
1844{
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001845 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata91544802011-09-06 19:20:51 +00001846 lldb::SBData sb_data;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001847 lldb::ValueObjectSP value_sp(GetSP());
1848 if (value_sp)
Enrico Granata91544802011-09-06 19:20:51 +00001849 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001850 ProcessSP process_sp(value_sp->GetProcessSP());
1851 Process::StopLocker stop_locker;
1852 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granata91544802011-09-06 19:20:51 +00001853 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001854 if (log)
1855 log->Printf ("SBValue(%p)::GetData() => error: process is running", value_sp.get());
1856 }
1857 else
1858 {
1859 TargetSP target_sp (value_sp->GetTargetSP());
1860 if (target_sp)
1861 {
1862 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1863 DataExtractorSP data_sp(new DataExtractor());
1864 value_sp->GetData(*data_sp);
1865 if (data_sp->GetByteSize() > 0)
1866 *sb_data = data_sp;
1867 }
Enrico Granata91544802011-09-06 19:20:51 +00001868 }
1869 }
Enrico Granata91544802011-09-06 19:20:51 +00001870 if (log)
1871 log->Printf ("SBValue(%p)::GetData () => SBData(%p)",
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001872 value_sp.get(),
Enrico Granata91544802011-09-06 19:20:51 +00001873 sb_data.get());
1874
1875 return sb_data;
1876}
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001877
Enrico Granata49306142012-10-10 22:54:17 +00001878lldb::SBDeclaration
1879SBValue::GetDeclaration ()
1880{
1881 lldb::ValueObjectSP value_sp(GetSP());
1882 SBDeclaration decl_sb;
1883 if (value_sp)
1884 {
1885 Declaration decl;
1886 if (value_sp->GetDeclaration(decl))
1887 decl_sb.SetDeclaration(decl);
1888 }
1889 return decl_sb;
1890}
1891
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001892lldb::SBWatchpoint
Johnny Chen3f883492012-06-04 23:19:54 +00001893SBValue::Watch (bool resolve_location, bool read, bool write, SBError &error)
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001894{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001895 SBWatchpoint sb_watchpoint;
1896
1897 // If the SBValue is not valid, there's no point in even trying to watch it.
1898 lldb::ValueObjectSP value_sp(GetSP());
1899 TargetSP target_sp (GetTarget().GetSP());
1900 if (value_sp && target_sp)
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001901 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001902 // Can't watch this if the process is running
1903 ProcessSP process_sp(value_sp->GetProcessSP());
1904 Process::StopLocker stop_locker;
1905 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
1906 {
1907 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1908 if (log)
1909 log->Printf ("SBValue(%p)::Watch() => error: process is running", value_sp.get());
1910 return sb_watchpoint;
1911 }
1912
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001913 // Read and Write cannot both be false.
1914 if (!read && !write)
1915 return sb_watchpoint;
1916
1917 // If the value is not in scope, don't try and watch and invalid value
1918 if (!IsInScope())
1919 return sb_watchpoint;
1920
1921 addr_t addr = GetLoadAddress();
1922 if (addr == LLDB_INVALID_ADDRESS)
1923 return sb_watchpoint;
1924 size_t byte_size = GetByteSize();
1925 if (byte_size == 0)
1926 return sb_watchpoint;
1927
1928 uint32_t watch_type = 0;
1929 if (read)
1930 watch_type |= LLDB_WATCH_TYPE_READ;
1931 if (write)
1932 watch_type |= LLDB_WATCH_TYPE_WRITE;
1933
Johnny Chen3f883492012-06-04 23:19:54 +00001934 Error rc;
Jim Ingham9e376622012-10-23 07:20:06 +00001935 ClangASTType type (value_sp->GetClangAST(), value_sp->GetClangType());
1936 WatchpointSP watchpoint_sp = target_sp->CreateWatchpoint(addr, byte_size, &type, watch_type, rc);
Johnny Chen3f883492012-06-04 23:19:54 +00001937 error.SetError(rc);
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001938
1939 if (watchpoint_sp)
1940 {
1941 sb_watchpoint.SetSP (watchpoint_sp);
1942 Declaration decl;
1943 if (value_sp->GetDeclaration (decl))
1944 {
1945 if (decl.GetFile())
1946 {
1947 StreamString ss;
1948 // True to show fullpath for declaration file.
1949 decl.DumpStopContext(&ss, true);
1950 watchpoint_sp->SetDeclInfo(ss.GetString());
1951 }
1952 }
1953 }
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001954 }
1955 return sb_watchpoint;
1956}
1957
Johnny Chen8a5ce772012-06-04 23:45:50 +00001958// FIXME: Remove this method impl (as well as the decl in .h) once it is no longer needed.
1959// Backward compatibility fix in the interim.
1960lldb::SBWatchpoint
1961SBValue::Watch (bool resolve_location, bool read, bool write)
1962{
Johnny Chen9c4a3442012-06-05 00:14:15 +00001963 SBError error;
1964 return Watch(resolve_location, read, write, error);
Johnny Chen8a5ce772012-06-04 23:45:50 +00001965}
1966
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001967lldb::SBWatchpoint
Johnny Chen3f883492012-06-04 23:19:54 +00001968SBValue::WatchPointee (bool resolve_location, bool read, bool write, SBError &error)
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001969{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001970 SBWatchpoint sb_watchpoint;
1971 if (IsInScope() && GetType().IsPointerType())
Johnny Chen3f883492012-06-04 23:19:54 +00001972 sb_watchpoint = Dereference().Watch (resolve_location, read, write, error);
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001973 return sb_watchpoint;
1974}