blob: d467d791f22c1b653c8b9151470a9de7ce91c54a [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"
Caroline Tice7826c882010-10-26 03:11:13 +000023#include "lldb/Core/Log.h"
Chris Lattner24943d22010-06-08 16:52:24 +000024#include "lldb/Core/Module.h"
Greg Clayton0fb0bcc2011-08-03 22:57:10 +000025#include "lldb/Core/Scalar.h"
Greg Clayton49ce8962012-08-29 21:13:06 +000026#include "lldb/Core/Section.h"
Chris Lattner24943d22010-06-08 16:52:24 +000027#include "lldb/Core/Stream.h"
28#include "lldb/Core/StreamFile.h"
29#include "lldb/Core/Value.h"
30#include "lldb/Core/ValueObject.h"
Enrico Granata979e20d2011-07-29 19:53:35 +000031#include "lldb/Core/ValueObjectConstResult.h"
Enrico Granataf509c5e2013-01-28 23:47:25 +000032#include "lldb/DataFormatters/DataVisualization.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 Granatabf26ea62013-04-22 22:57:56 +000055class ValueImpl
56{
57public:
58 ValueImpl ()
Enrico Granata3d656c72012-10-22 18:18:36 +000059 {
Enrico Granatabf26ea62013-04-22 22:57:56 +000060 }
61
62 ValueImpl (lldb::ValueObjectSP opaque_sp,
63 lldb::DynamicValueType use_dynamic,
64 bool use_synthetic) :
65 m_opaque_sp(opaque_sp),
66 m_use_dynamic(use_dynamic),
67 m_use_synthetic(use_synthetic)
68 {
69 }
70
71 ValueImpl (const ValueImpl& rhs) :
72 m_opaque_sp(rhs.m_opaque_sp),
73 m_use_dynamic(rhs.m_use_dynamic),
74 m_use_synthetic(rhs.m_use_synthetic)
75 {
76 }
77
78 ValueImpl &
79 operator = (const ValueImpl &rhs)
80 {
81 if (this != &rhs)
Enrico Granata3d656c72012-10-22 18:18:36 +000082 {
Enrico Granatabf26ea62013-04-22 22:57:56 +000083 m_opaque_sp = rhs.m_opaque_sp;
84 m_use_dynamic = rhs.m_use_dynamic;
85 m_use_synthetic = rhs.m_use_synthetic;
Enrico Granata3d656c72012-10-22 18:18:36 +000086 }
Enrico Granatabf26ea62013-04-22 22:57:56 +000087 return *this;
88 }
89
90 bool
91 IsValid ()
92 {
93 return m_opaque_sp.get() != NULL;
94 }
95
96 lldb::ValueObjectSP
97 GetRootSP ()
98 {
99 return m_opaque_sp;
100 }
101
102 lldb::ValueObjectSP
103 GetSP ()
104 {
105 if (!m_opaque_sp)
Enrico Granata3d656c72012-10-22 18:18:36 +0000106 return m_opaque_sp;
Enrico Granatabf26ea62013-04-22 22:57:56 +0000107 lldb::ValueObjectSP value_sp = m_opaque_sp;
Enrico Granata3d656c72012-10-22 18:18:36 +0000108
Enrico Granatabf26ea62013-04-22 22:57:56 +0000109 Mutex::Locker api_lock;
110 Target *target = value_sp->GetTargetSP().get();
111 if (target)
112 api_lock.Lock(target->GetAPIMutex());
Enrico Granata3d656c72012-10-22 18:18:36 +0000113
Enrico Granatabf26ea62013-04-22 22:57:56 +0000114 if (value_sp->GetDynamicValue(m_use_dynamic))
115 value_sp = value_sp->GetDynamicValue(m_use_dynamic);
116 if (value_sp->GetSyntheticValue(m_use_synthetic))
117 value_sp = value_sp->GetSyntheticValue(m_use_synthetic);
118 return value_sp;
119 }
120
121 void
122 SetUseDynamic (lldb::DynamicValueType use_dynamic)
123 {
124 m_use_dynamic = use_dynamic;
125 }
126
127 void
128 SetUseSynthetic (bool use_synthetic)
129 {
130 m_use_synthetic = use_synthetic;
131 }
132
133 lldb::DynamicValueType
134 GetUseDynamic ()
135 {
136 return m_use_dynamic;
137 }
138
139 bool
140 GetUseSynthetic ()
141 {
142 return m_use_synthetic;
143 }
144
145private:
146 lldb::ValueObjectSP m_opaque_sp;
147 lldb::DynamicValueType m_use_dynamic;
148 bool m_use_synthetic;
149};
Enrico Granata3d656c72012-10-22 18:18:36 +0000150
Chris Lattner24943d22010-06-08 16:52:24 +0000151SBValue::SBValue () :
Greg Clayton63094e02010-06-23 01:19:29 +0000152 m_opaque_sp ()
Chris Lattner24943d22010-06-08 16:52:24 +0000153{
154}
155
Enrico Granatadba1de82012-03-27 02:35:13 +0000156SBValue::SBValue (const lldb::ValueObjectSP &value_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000157{
Enrico Granata3d656c72012-10-22 18:18:36 +0000158 SetSP(value_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000159}
160
Enrico Granatadba1de82012-03-27 02:35:13 +0000161SBValue::SBValue(const SBValue &rhs)
Greg Clayton538eb822010-11-05 23:17:00 +0000162{
Enrico Granata3d656c72012-10-22 18:18:36 +0000163 SetSP(rhs.m_opaque_sp);
Greg Clayton538eb822010-11-05 23:17:00 +0000164}
165
Greg Claytond68e0892011-09-09 23:04:00 +0000166SBValue &
Greg Clayton538eb822010-11-05 23:17:00 +0000167SBValue::operator = (const SBValue &rhs)
168{
169 if (this != &rhs)
Enrico Granatadba1de82012-03-27 02:35:13 +0000170 {
Enrico Granata3d656c72012-10-22 18:18:36 +0000171 SetSP(rhs.m_opaque_sp);
Enrico Granatadba1de82012-03-27 02:35:13 +0000172 }
Greg Clayton538eb822010-11-05 23:17:00 +0000173 return *this;
174}
175
Chris Lattner24943d22010-06-08 16:52:24 +0000176SBValue::~SBValue()
177{
178}
179
180bool
Greg Claytond68e0892011-09-09 23:04:00 +0000181SBValue::IsValid ()
Chris Lattner24943d22010-06-08 16:52:24 +0000182{
Greg Clayton49ce6822010-10-31 03:01:06 +0000183 // If this function ever changes to anything that does more than just
184 // check if the opaque shared pointer is non NULL, then we need to update
185 // all "if (m_opaque_sp)" code in this file.
Enrico Granata3d656c72012-10-22 18:18:36 +0000186 return m_opaque_sp.get() != NULL && m_opaque_sp->GetRootSP().get() != NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000187}
188
Jim Inghame0bd5712011-12-19 20:39:44 +0000189void
190SBValue::Clear()
191{
192 m_opaque_sp.reset();
193}
194
Greg Claytonc5f728c2010-10-06 22:10:17 +0000195SBError
196SBValue::GetError()
197{
198 SBError sb_error;
199
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000200 lldb::ValueObjectSP value_sp(GetSP());
201 if (value_sp)
202 sb_error.SetError(value_sp->GetError());
Greg Clayton334d33a2012-01-30 07:41:31 +0000203 else
204 sb_error.SetErrorString("error: invalid value");
Greg Claytonc5f728c2010-10-06 22:10:17 +0000205
206 return sb_error;
207}
208
Johnny Chen968958c2011-07-07 20:46:23 +0000209user_id_t
210SBValue::GetID()
211{
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000212 lldb::ValueObjectSP value_sp(GetSP());
213 if (value_sp)
214 return value_sp->GetID();
Johnny Chen968958c2011-07-07 20:46:23 +0000215 return LLDB_INVALID_UID;
216}
217
Chris Lattner24943d22010-06-08 16:52:24 +0000218const char *
219SBValue::GetName()
220{
Greg Clayton49ce6822010-10-31 03:01:06 +0000221
222 const char *name = NULL;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000223 lldb::ValueObjectSP value_sp(GetSP());
224 if (value_sp)
225 name = value_sp->GetName().GetCString();
Greg Clayton49ce6822010-10-31 03:01:06 +0000226
Greg Clayton952e9dc2013-03-27 23:08:40 +0000227 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000228 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000229 {
230 if (name)
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000231 log->Printf ("SBValue(%p)::GetName () => \"%s\"", value_sp.get(), name);
Greg Clayton49ce6822010-10-31 03:01:06 +0000232 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000233 log->Printf ("SBValue(%p)::GetName () => NULL", value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +0000234 }
Caroline Tice7826c882010-10-26 03:11:13 +0000235
Greg Clayton49ce6822010-10-31 03:01:06 +0000236 return name;
Chris Lattner24943d22010-06-08 16:52:24 +0000237}
238
239const char *
240SBValue::GetTypeName ()
241{
Greg Clayton952e9dc2013-03-27 23:08:40 +0000242 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000243 const char *name = NULL;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000244 lldb::ValueObjectSP value_sp(GetSP());
245 if (value_sp)
Jim Ingham684d4012012-08-21 01:46:35 +0000246 {
247 // For a dynamic type we might have to run code to determine the type we are going to report,
248 // and we might not have updated the type before we get asked this. So make sure to get the API lock.
249
250 ProcessSP process_sp(value_sp->GetProcessSP());
251 Process::StopLocker stop_locker;
252 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
253 {
254 if (log)
255 log->Printf ("SBValue(%p)::GetTypeName() => error: process is running", value_sp.get());
256 }
257 else
258 {
259 TargetSP target_sp(value_sp->GetTargetSP());
260 if (target_sp)
261 {
262 Mutex::Locker api_locker (target_sp->GetAPIMutex());
263 name = value_sp->GetQualifiedTypeName().GetCString();
264 }
265 }
266 }
267
Greg Clayton49ce6822010-10-31 03:01:06 +0000268 if (log)
269 {
270 if (name)
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000271 log->Printf ("SBValue(%p)::GetTypeName () => \"%s\"", value_sp.get(), name);
Greg Clayton49ce6822010-10-31 03:01:06 +0000272 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000273 log->Printf ("SBValue(%p)::GetTypeName () => NULL", value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +0000274 }
275
276 return name;
Chris Lattner24943d22010-06-08 16:52:24 +0000277}
278
279size_t
280SBValue::GetByteSize ()
281{
Greg Clayton952e9dc2013-03-27 23:08:40 +0000282 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Chris Lattner24943d22010-06-08 16:52:24 +0000283 size_t result = 0;
284
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000285 lldb::ValueObjectSP value_sp(GetSP());
286 if (value_sp)
Jim Ingham684d4012012-08-21 01:46:35 +0000287 {
288 // For a dynamic type we might have to run code to determine the type we are going to report,
289 // and we might not have updated the type before we get asked this. So make sure to get the API lock.
290
291 ProcessSP process_sp(value_sp->GetProcessSP());
292 Process::StopLocker stop_locker;
293 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
294 {
295 if (log)
296 log->Printf ("SBValue(%p)::GetTypeName() => error: process is running", value_sp.get());
297 }
298 else
299 {
300 TargetSP target_sp(value_sp->GetTargetSP());
301 if (target_sp)
302 {
303 Mutex::Locker api_locker (target_sp->GetAPIMutex());
304 result = value_sp->GetByteSize();
305 }
306 }
307 }
Chris Lattner24943d22010-06-08 16:52:24 +0000308
Greg Clayton49ce6822010-10-31 03:01:06 +0000309 if (log)
Daniel Malea5f35a4b2012-11-29 21:49:15 +0000310 log->Printf ("SBValue(%p)::GetByteSize () => %" PRIu64, value_sp.get(), (uint64_t)result);
Greg Clayton49ce6822010-10-31 03:01:06 +0000311
Chris Lattner24943d22010-06-08 16:52:24 +0000312 return result;
313}
314
315bool
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000316SBValue::IsInScope ()
317{
Chris Lattner24943d22010-06-08 16:52:24 +0000318 bool result = false;
319
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000320 lldb::ValueObjectSP value_sp(GetSP());
321 if (value_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000322 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000323 TargetSP target_sp(value_sp->GetTargetSP());
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000324 if (target_sp)
Greg Claytonb9dcc512011-06-29 18:28:50 +0000325 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000326 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000327 result = value_sp->IsInScope ();
Greg Claytonb9dcc512011-06-29 18:28:50 +0000328 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000329 }
Chris Lattner24943d22010-06-08 16:52:24 +0000330
Greg Clayton952e9dc2013-03-27 23:08:40 +0000331 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000332 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000333 log->Printf ("SBValue(%p)::IsInScope () => %i", value_sp.get(), result);
Greg Clayton49ce6822010-10-31 03:01:06 +0000334
Chris Lattner24943d22010-06-08 16:52:24 +0000335 return result;
336}
337
338const char *
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000339SBValue::GetValue ()
340{
Greg Clayton952e9dc2013-03-27 23:08:40 +0000341 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000342
Greg Clayton49ce6822010-10-31 03:01:06 +0000343 const char *cstr = NULL;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000344 lldb::ValueObjectSP value_sp(GetSP());
345 if (value_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000346 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000347 ProcessSP process_sp(value_sp->GetProcessSP());
348 Process::StopLocker stop_locker;
349 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Claytonb9dcc512011-06-29 18:28:50 +0000350 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000351 if (log)
352 log->Printf ("SBValue(%p)::GetValue() => error: process is running", value_sp.get());
353 }
354 else
355 {
356 TargetSP target_sp(value_sp->GetTargetSP());
357 if (target_sp)
358 {
359 Mutex::Locker api_locker (target_sp->GetAPIMutex());
360 cstr = value_sp->GetValueAsCString ();
361 }
Greg Claytonb9dcc512011-06-29 18:28:50 +0000362 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000363 }
Greg Clayton49ce6822010-10-31 03:01:06 +0000364 if (log)
365 {
366 if (cstr)
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000367 log->Printf ("SBValue(%p)::GetValue() => \"%s\"", value_sp.get(), cstr);
Greg Clayton49ce6822010-10-31 03:01:06 +0000368 else
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000369 log->Printf ("SBValue(%p)::GetValue() => NULL", value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +0000370 }
371
372 return cstr;
Chris Lattner24943d22010-06-08 16:52:24 +0000373}
374
Greg Claytonf3d0b0c2010-10-27 03:32:59 +0000375ValueType
376SBValue::GetValueType ()
377{
Greg Clayton49ce6822010-10-31 03:01:06 +0000378 ValueType result = eValueTypeInvalid;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000379 lldb::ValueObjectSP value_sp(GetSP());
380 if (value_sp)
381 result = value_sp->GetValueType();
Greg Clayton952e9dc2013-03-27 23:08:40 +0000382 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000383 if (log)
384 {
385 switch (result)
386 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000387 case eValueTypeInvalid: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeInvalid", value_sp.get()); break;
388 case eValueTypeVariableGlobal: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableGlobal", value_sp.get()); break;
389 case eValueTypeVariableStatic: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableStatic", value_sp.get()); break;
390 case eValueTypeVariableArgument:log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableArgument", value_sp.get()); break;
391 case eValueTypeVariableLocal: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableLocal", value_sp.get()); break;
392 case eValueTypeRegister: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeRegister", value_sp.get()); break;
393 case eValueTypeRegisterSet: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeRegisterSet", value_sp.get()); break;
394 case eValueTypeConstResult: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeConstResult", value_sp.get()); break;
Greg Clayton49ce6822010-10-31 03:01:06 +0000395 }
396 }
397 return result;
Greg Claytonf3d0b0c2010-10-27 03:32:59 +0000398}
399
Jim Ingham4ae51962010-09-10 23:12:17 +0000400const char *
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000401SBValue::GetObjectDescription ()
402{
Greg Clayton952e9dc2013-03-27 23:08:40 +0000403 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000404 const char *cstr = NULL;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000405 lldb::ValueObjectSP value_sp(GetSP());
406 if (value_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000407 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000408 ProcessSP process_sp(value_sp->GetProcessSP());
409 Process::StopLocker stop_locker;
410 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Claytonb9dcc512011-06-29 18:28:50 +0000411 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000412 if (log)
413 log->Printf ("SBValue(%p)::GetObjectDescription() => error: process is running", value_sp.get());
414 }
415 else
416 {
417 TargetSP target_sp(value_sp->GetTargetSP());
418 if (target_sp)
419 {
420 Mutex::Locker api_locker (target_sp->GetAPIMutex());
421 cstr = value_sp->GetObjectDescription ();
422 }
Greg Claytonb9dcc512011-06-29 18:28:50 +0000423 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000424 }
Greg Clayton49ce6822010-10-31 03:01:06 +0000425 if (log)
426 {
427 if (cstr)
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000428 log->Printf ("SBValue(%p)::GetObjectDescription() => \"%s\"", value_sp.get(), cstr);
Greg Clayton49ce6822010-10-31 03:01:06 +0000429 else
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000430 log->Printf ("SBValue(%p)::GetObjectDescription() => NULL", value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +0000431 }
432 return cstr;
Jim Ingham4ae51962010-09-10 23:12:17 +0000433}
434
Enrico Granata979e20d2011-07-29 19:53:35 +0000435SBType
436SBValue::GetType()
437{
Greg Clayton952e9dc2013-03-27 23:08:40 +0000438 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000439 SBType sb_type;
440 lldb::ValueObjectSP value_sp(GetSP());
441 TypeImplSP type_sp;
442 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +0000443 {
Jim Ingham5b4905d2012-04-13 18:30:20 +0000444 ProcessSP process_sp(value_sp->GetProcessSP());
445 Process::StopLocker stop_locker;
446 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
447 {
448 if (log)
Greg Clayton12b7ea32012-06-04 20:13:23 +0000449 log->Printf ("SBValue(%p)::GetType() => error: process is running", value_sp.get());
Jim Ingham5b4905d2012-04-13 18:30:20 +0000450 }
451 else
452 {
453 TargetSP target_sp(value_sp->GetTargetSP());
454 if (target_sp)
455 {
456 Mutex::Locker api_locker (target_sp->GetAPIMutex());
457 type_sp.reset (new TypeImpl(ClangASTType (value_sp->GetClangAST(), value_sp->GetClangType())));
458 sb_type.SetSP(type_sp);
459 }
460 }
Enrico Granata979e20d2011-07-29 19:53:35 +0000461 }
Enrico Granata979e20d2011-07-29 19:53:35 +0000462 if (log)
463 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000464 if (type_sp)
465 log->Printf ("SBValue(%p)::GetType => SBType(%p)", value_sp.get(), type_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +0000466 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000467 log->Printf ("SBValue(%p)::GetType => NULL", value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +0000468 }
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000469 return sb_type;
Enrico Granata979e20d2011-07-29 19:53:35 +0000470}
471
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000472bool
473SBValue::GetValueDidChange ()
474{
Greg Clayton952e9dc2013-03-27 23:08:40 +0000475 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000476 bool result = false;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000477 lldb::ValueObjectSP value_sp(GetSP());
478 if (value_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000479 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000480 ProcessSP process_sp(value_sp->GetProcessSP());
481 Process::StopLocker stop_locker;
482 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Claytonb9dcc512011-06-29 18:28:50 +0000483 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000484 if (log)
485 log->Printf ("SBValue(%p)::GetValueDidChange() => error: process is running", value_sp.get());
486 }
487 else
488 {
489 TargetSP target_sp(value_sp->GetTargetSP());
490 if (target_sp)
491 {
492 Mutex::Locker api_locker (target_sp->GetAPIMutex());
493 result = value_sp->GetValueDidChange ();
494 }
Greg Claytonb9dcc512011-06-29 18:28:50 +0000495 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000496 }
Greg Clayton49ce6822010-10-31 03:01:06 +0000497 if (log)
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000498 log->Printf ("SBValue(%p)::GetValueDidChange() => %i", value_sp.get(), result);
Greg Clayton49ce6822010-10-31 03:01:06 +0000499
500 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000501}
502
Jason Molendac48ca822012-02-21 05:33:55 +0000503#ifndef LLDB_DISABLE_PYTHON
Chris Lattner24943d22010-06-08 16:52:24 +0000504const char *
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000505SBValue::GetSummary ()
506{
Greg Clayton952e9dc2013-03-27 23:08:40 +0000507 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000508 const char *cstr = NULL;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000509 lldb::ValueObjectSP value_sp(GetSP());
510 if (value_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000511 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000512 ProcessSP process_sp(value_sp->GetProcessSP());
513 Process::StopLocker stop_locker;
514 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Claytonb9dcc512011-06-29 18:28:50 +0000515 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000516 if (log)
517 log->Printf ("SBValue(%p)::GetSummary() => error: process is running", value_sp.get());
518 }
519 else
520 {
521 TargetSP target_sp(value_sp->GetTargetSP());
522 if (target_sp)
523 {
524 Mutex::Locker api_locker (target_sp->GetAPIMutex());
525 cstr = value_sp->GetSummaryAsCString();
526 }
Greg Claytonb9dcc512011-06-29 18:28:50 +0000527 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000528 }
Greg Clayton49ce6822010-10-31 03:01:06 +0000529 if (log)
530 {
531 if (cstr)
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000532 log->Printf ("SBValue(%p)::GetSummary() => \"%s\"", value_sp.get(), cstr);
Greg Clayton49ce6822010-10-31 03:01:06 +0000533 else
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000534 log->Printf ("SBValue(%p)::GetSummary() => NULL", value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +0000535 }
536 return cstr;
Chris Lattner24943d22010-06-08 16:52:24 +0000537}
Jason Molendac48ca822012-02-21 05:33:55 +0000538#endif // LLDB_DISABLE_PYTHON
Chris Lattner24943d22010-06-08 16:52:24 +0000539
540const char *
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000541SBValue::GetLocation ()
542{
Greg Clayton952e9dc2013-03-27 23:08:40 +0000543 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000544 const char *cstr = NULL;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000545 lldb::ValueObjectSP value_sp(GetSP());
546 if (value_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000547 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000548 ProcessSP process_sp(value_sp->GetProcessSP());
549 Process::StopLocker stop_locker;
550 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Claytonb9dcc512011-06-29 18:28:50 +0000551 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000552 if (log)
553 log->Printf ("SBValue(%p)::GetLocation() => error: process is running", value_sp.get());
554 }
555 else
556 {
557 TargetSP target_sp(value_sp->GetTargetSP());
558 if (target_sp)
559 {
560 Mutex::Locker api_locker (target_sp->GetAPIMutex());
561 cstr = value_sp->GetLocationAsCString();
562 }
Greg Claytonb9dcc512011-06-29 18:28:50 +0000563 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000564 }
Greg Clayton49ce6822010-10-31 03:01:06 +0000565 if (log)
566 {
567 if (cstr)
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000568 log->Printf ("SBValue(%p)::GetLocation() => \"%s\"", value_sp.get(), cstr);
Greg Clayton49ce6822010-10-31 03:01:06 +0000569 else
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000570 log->Printf ("SBValue(%p)::GetLocation() => NULL", value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +0000571 }
572 return cstr;
Chris Lattner24943d22010-06-08 16:52:24 +0000573}
574
Enrico Granata651cbe22012-05-08 21:25:06 +0000575// Deprecated - use the one that takes an lldb::SBError
Chris Lattner24943d22010-06-08 16:52:24 +0000576bool
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000577SBValue::SetValueFromCString (const char *value_str)
578{
Enrico Granata651cbe22012-05-08 21:25:06 +0000579 lldb::SBError dummy;
580 return SetValueFromCString(value_str,dummy);
581}
582
583bool
584SBValue::SetValueFromCString (const char *value_str, lldb::SBError& error)
585{
Chris Lattner24943d22010-06-08 16:52:24 +0000586 bool success = false;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000587 lldb::ValueObjectSP value_sp(GetSP());
Greg Clayton952e9dc2013-03-27 23:08:40 +0000588 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000589 if (value_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000590 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000591 ProcessSP process_sp(value_sp->GetProcessSP());
592 Process::StopLocker stop_locker;
593 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Claytonb9dcc512011-06-29 18:28:50 +0000594 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000595 if (log)
596 log->Printf ("SBValue(%p)::SetValueFromCString() => error: process is running", value_sp.get());
597 }
598 else
599 {
600 TargetSP target_sp(value_sp->GetTargetSP());
601 if (target_sp)
602 {
603 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Enrico Granata651cbe22012-05-08 21:25:06 +0000604 success = value_sp->SetValueFromCString (value_str,error.ref());
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000605 }
Greg Claytonb9dcc512011-06-29 18:28:50 +0000606 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000607 }
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000608 if (log)
609 log->Printf ("SBValue(%p)::SetValueFromCString(\"%s\") => %i", value_sp.get(), value_str, success);
610
Chris Lattner24943d22010-06-08 16:52:24 +0000611 return success;
612}
613
Enrico Granatad760907c2012-02-17 03:18:30 +0000614lldb::SBTypeFormat
615SBValue::GetTypeFormat ()
616{
617 lldb::SBTypeFormat format;
618 lldb::ValueObjectSP value_sp(GetSP());
619 if (value_sp)
620 {
Jim Ingham5b4905d2012-04-13 18:30:20 +0000621 ProcessSP process_sp(value_sp->GetProcessSP());
622 Process::StopLocker stop_locker;
623 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granatad760907c2012-02-17 03:18:30 +0000624 {
Greg Clayton952e9dc2013-03-27 23:08:40 +0000625 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Jim Ingham5b4905d2012-04-13 18:30:20 +0000626 if (log)
Greg Clayton12b7ea32012-06-04 20:13:23 +0000627 log->Printf ("SBValue(%p)::GetTypeFormat() => error: process is running", value_sp.get());
Jim Ingham5b4905d2012-04-13 18:30:20 +0000628 }
629 else
630 {
631 TargetSP target_sp(value_sp->GetTargetSP());
632 if (target_sp)
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000633 {
Jim Ingham5b4905d2012-04-13 18:30:20 +0000634 Mutex::Locker api_locker (target_sp->GetAPIMutex());
635 if (value_sp->UpdateValueIfNeeded(true))
636 {
637 lldb::TypeFormatImplSP format_sp = value_sp->GetValueFormat();
638 if (format_sp)
639 format.SetSP(format_sp);
640 }
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000641 }
Enrico Granatad760907c2012-02-17 03:18:30 +0000642 }
643 }
644 return format;
645}
646
Jason Molendac48ca822012-02-21 05:33:55 +0000647#ifndef LLDB_DISABLE_PYTHON
Enrico Granatad760907c2012-02-17 03:18:30 +0000648lldb::SBTypeSummary
649SBValue::GetTypeSummary ()
650{
651 lldb::SBTypeSummary summary;
652 lldb::ValueObjectSP value_sp(GetSP());
653 if (value_sp)
654 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000655 ProcessSP process_sp(value_sp->GetProcessSP());
656 Process::StopLocker stop_locker;
657 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granatad760907c2012-02-17 03:18:30 +0000658 {
Greg Clayton952e9dc2013-03-27 23:08:40 +0000659 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000660 if (log)
661 log->Printf ("SBValue(%p)::GetTypeSummary() => error: process is running", value_sp.get());
662 }
663 else
664 {
665 TargetSP target_sp(value_sp->GetTargetSP());
666 if (target_sp)
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000667 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000668 Mutex::Locker api_locker (target_sp->GetAPIMutex());
669 if (value_sp->UpdateValueIfNeeded(true))
670 {
671 lldb::TypeSummaryImplSP summary_sp = value_sp->GetSummaryFormat();
672 if (summary_sp)
673 summary.SetSP(summary_sp);
674 }
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000675 }
Enrico Granatad760907c2012-02-17 03:18:30 +0000676 }
677 }
678 return summary;
679}
Jason Molendac48ca822012-02-21 05:33:55 +0000680#endif // LLDB_DISABLE_PYTHON
Enrico Granatad760907c2012-02-17 03:18:30 +0000681
682lldb::SBTypeFilter
683SBValue::GetTypeFilter ()
684{
685 lldb::SBTypeFilter filter;
686 lldb::ValueObjectSP value_sp(GetSP());
687 if (value_sp)
688 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000689 ProcessSP process_sp(value_sp->GetProcessSP());
690 Process::StopLocker stop_locker;
691 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granatad760907c2012-02-17 03:18:30 +0000692 {
Greg Clayton952e9dc2013-03-27 23:08:40 +0000693 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000694 if (log)
695 log->Printf ("SBValue(%p)::GetTypeFilter() => error: process is running", value_sp.get());
696 }
697 else
698 {
699 TargetSP target_sp(value_sp->GetTargetSP());
700 if (target_sp)
Enrico Granatad760907c2012-02-17 03:18:30 +0000701 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000702 Mutex::Locker api_locker (target_sp->GetAPIMutex());
703 if (value_sp->UpdateValueIfNeeded(true))
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000704 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000705 lldb::SyntheticChildrenSP synthetic_sp = value_sp->GetSyntheticChildren();
706
707 if (synthetic_sp && !synthetic_sp->IsScripted())
708 {
Greg Clayton102b2c22013-04-18 22:45:39 +0000709 TypeFilterImplSP filter_sp = std::static_pointer_cast<TypeFilterImpl>(synthetic_sp);
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000710 filter.SetSP(filter_sp);
711 }
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000712 }
Enrico Granatad760907c2012-02-17 03:18:30 +0000713 }
714 }
715 }
716 return filter;
717}
718
Jason Molendac48ca822012-02-21 05:33:55 +0000719#ifndef LLDB_DISABLE_PYTHON
Enrico Granatad760907c2012-02-17 03:18:30 +0000720lldb::SBTypeSynthetic
721SBValue::GetTypeSynthetic ()
722{
723 lldb::SBTypeSynthetic synthetic;
724 lldb::ValueObjectSP value_sp(GetSP());
725 if (value_sp)
726 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000727 ProcessSP process_sp(value_sp->GetProcessSP());
728 Process::StopLocker stop_locker;
729 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granatad760907c2012-02-17 03:18:30 +0000730 {
Greg Clayton952e9dc2013-03-27 23:08:40 +0000731 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000732 if (log)
733 log->Printf ("SBValue(%p)::GetTypeSynthetic() => error: process is running", value_sp.get());
734 }
735 else
736 {
737 TargetSP target_sp(value_sp->GetTargetSP());
738 if (target_sp)
Enrico Granatad760907c2012-02-17 03:18:30 +0000739 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000740 Mutex::Locker api_locker (target_sp->GetAPIMutex());
741 if (value_sp->UpdateValueIfNeeded(true))
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000742 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000743 lldb::SyntheticChildrenSP children_sp = value_sp->GetSyntheticChildren();
744
745 if (children_sp && children_sp->IsScripted())
746 {
Greg Clayton102b2c22013-04-18 22:45:39 +0000747 ScriptedSyntheticChildrenSP synth_sp = std::static_pointer_cast<ScriptedSyntheticChildren>(children_sp);
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000748 synthetic.SetSP(synth_sp);
749 }
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000750 }
Enrico Granatad760907c2012-02-17 03:18:30 +0000751 }
752 }
753 }
754 return synthetic;
755}
Jason Molendac48ca822012-02-21 05:33:55 +0000756#endif
Enrico Granatad760907c2012-02-17 03:18:30 +0000757
Enrico Granata979e20d2011-07-29 19:53:35 +0000758lldb::SBValue
Greg Claytond68e0892011-09-09 23:04:00 +0000759SBValue::CreateChildAtOffset (const char *name, uint32_t offset, SBType type)
Enrico Granata979e20d2011-07-29 19:53:35 +0000760{
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000761 lldb::SBValue sb_value;
762 lldb::ValueObjectSP value_sp(GetSP());
763 lldb::ValueObjectSP new_value_sp;
764 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +0000765 {
Jim Ingham5b4905d2012-04-13 18:30:20 +0000766 ProcessSP process_sp(value_sp->GetProcessSP());
767 Process::StopLocker stop_locker;
768 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granata979e20d2011-07-29 19:53:35 +0000769 {
Greg Clayton952e9dc2013-03-27 23:08:40 +0000770 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Jim Ingham5b4905d2012-04-13 18:30:20 +0000771 if (log)
Greg Clayton12b7ea32012-06-04 20:13:23 +0000772 log->Printf ("SBValue(%p)::CreateChildAtOffset() => error: process is running", value_sp.get());
Jim Ingham5b4905d2012-04-13 18:30:20 +0000773 }
774 else
775 {
776 TargetSP target_sp(value_sp->GetTargetSP());
777 if (target_sp)
778 {
779 Mutex::Locker api_locker (target_sp->GetAPIMutex());
780 TypeImplSP type_sp (type.GetSP());
781 if (type.IsValid())
782 {
Enrico Granata3d656c72012-10-22 18:18:36 +0000783 sb_value.SetSP(value_sp->GetSyntheticChildAtOffset(offset, type_sp->GetClangASTType(), true),GetPreferDynamicValue(),GetPreferSyntheticValue());
Jim Ingham5b4905d2012-04-13 18:30:20 +0000784 new_value_sp = sb_value.GetSP();
785 if (new_value_sp)
786 new_value_sp->SetName(ConstString(name));
787 }
788 }
Enrico Granata979e20d2011-07-29 19:53:35 +0000789 }
790 }
Greg Clayton952e9dc2013-03-27 23:08:40 +0000791 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata979e20d2011-07-29 19:53:35 +0000792 if (log)
793 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000794 if (new_value_sp)
Jim Ingham47beabb2012-10-16 21:41:58 +0000795 log->Printf ("SBValue(%p)::CreateChildAtOffset => \"%s\"",
796 value_sp.get(),
797 new_value_sp->GetName().AsCString());
Enrico Granata979e20d2011-07-29 19:53:35 +0000798 else
Jim Ingham47beabb2012-10-16 21:41:58 +0000799 log->Printf ("SBValue(%p)::CreateChildAtOffset => NULL",
800 value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +0000801 }
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000802 return sb_value;
Enrico Granata979e20d2011-07-29 19:53:35 +0000803}
804
805lldb::SBValue
Greg Claytond68e0892011-09-09 23:04:00 +0000806SBValue::Cast (SBType type)
Enrico Granata979e20d2011-07-29 19:53:35 +0000807{
Greg Clayton4eb01a72012-01-31 04:25:15 +0000808 lldb::SBValue sb_value;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000809 lldb::ValueObjectSP value_sp(GetSP());
810 TypeImplSP type_sp (type.GetSP());
811 if (value_sp && type_sp)
Enrico Granata3d656c72012-10-22 18:18:36 +0000812 sb_value.SetSP(value_sp->Cast(type_sp->GetClangASTType()),GetPreferDynamicValue(),GetPreferSyntheticValue());
Greg Clayton4eb01a72012-01-31 04:25:15 +0000813 return sb_value;
Enrico Granata979e20d2011-07-29 19:53:35 +0000814}
815
816lldb::SBValue
817SBValue::CreateValueFromExpression (const char *name, const char* expression)
818{
Jim Ingham47beabb2012-10-16 21:41:58 +0000819 SBExpressionOptions options;
Greg Clayton75a443b2012-10-16 22:58:25 +0000820 options.ref().SetKeepInMemory(true);
Jim Ingham47beabb2012-10-16 21:41:58 +0000821 return CreateValueFromExpression (name, expression, options);
822}
823
824lldb::SBValue
825SBValue::CreateValueFromExpression (const char *name, const char *expression, SBExpressionOptions &options)
826{
Greg Clayton952e9dc2013-03-27 23:08:40 +0000827 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000828 lldb::SBValue sb_value;
829 lldb::ValueObjectSP value_sp(GetSP());
830 lldb::ValueObjectSP new_value_sp;
831 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +0000832 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000833 ExecutionContext exe_ctx (value_sp->GetExecutionContextRef());
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000834 ProcessSP process_sp(exe_ctx.GetProcessSP());
835 Process::StopLocker stop_locker;
836 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Johnny Chen9fd2e382011-12-20 01:52:44 +0000837 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000838 if (log)
839 log->Printf ("SBValue(%p)::CreateValueFromExpression() => error: process is running", value_sp.get());
840 }
841 else
842 {
843 Target* target = exe_ctx.GetTargetPtr();
844 if (target)
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000845 {
Greg Clayton75a443b2012-10-16 22:58:25 +0000846 options.ref().SetKeepInMemory(true);
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000847 target->EvaluateExpression (expression,
848 exe_ctx.GetFramePtr(),
Enrico Granatad27026e2012-09-05 20:41:26 +0000849 new_value_sp,
Jim Ingham47beabb2012-10-16 21:41:58 +0000850 options.ref());
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000851 if (new_value_sp)
852 {
853 new_value_sp->SetName(ConstString(name));
854 sb_value.SetSP(new_value_sp);
855 }
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000856 }
Johnny Chen9fd2e382011-12-20 01:52:44 +0000857 }
Enrico Granata979e20d2011-07-29 19:53:35 +0000858 }
Enrico Granata979e20d2011-07-29 19:53:35 +0000859 if (log)
860 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000861 if (new_value_sp)
Greg Clayton12b7ea32012-06-04 20:13:23 +0000862 log->Printf ("SBValue(%p)::CreateValueFromExpression(name=\"%s\", expression=\"%s\") => SBValue (%p)",
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000863 value_sp.get(),
864 name,
865 expression,
866 new_value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +0000867 else
Greg Clayton12b7ea32012-06-04 20:13:23 +0000868 log->Printf ("SBValue(%p)::CreateValueFromExpression(name=\"%s\", expression=\"%s\") => NULL",
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000869 value_sp.get(),
870 name,
871 expression);
Enrico Granata979e20d2011-07-29 19:53:35 +0000872 }
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000873 return sb_value;
Enrico Granata979e20d2011-07-29 19:53:35 +0000874}
875
876lldb::SBValue
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000877SBValue::CreateValueFromAddress(const char* name, lldb::addr_t address, SBType sb_type)
Enrico Granata979e20d2011-07-29 19:53:35 +0000878{
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000879 lldb::SBValue sb_value;
880 lldb::ValueObjectSP value_sp(GetSP());
881 lldb::ValueObjectSP new_value_sp;
882 lldb::TypeImplSP type_impl_sp (sb_type.GetSP());
883 if (value_sp && type_impl_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +0000884 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000885 ClangASTType pointee_ast_type(type_impl_sp->GetASTContext(), type_impl_sp->GetClangASTType().GetPointerType ());
886 lldb::TypeImplSP pointee_type_impl_sp (new TypeImpl(pointee_ast_type));
887 if (pointee_type_impl_sp)
Enrico Granatac9310302011-08-04 17:07:02 +0000888 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000889
890 lldb::DataBufferSP buffer(new lldb_private::DataBufferHeap(&address,sizeof(lldb::addr_t)));
891
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000892 ExecutionContext exe_ctx (value_sp->GetExecutionContextRef());
893 ValueObjectSP ptr_result_valobj_sp(ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000894 pointee_type_impl_sp->GetASTContext(),
895 pointee_type_impl_sp->GetOpaqueQualType(),
896 ConstString(name),
897 buffer,
898 lldb::endian::InlHostByteOrder(),
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000899 exe_ctx.GetAddressByteSize()));
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000900
901 if (ptr_result_valobj_sp)
902 {
903 ptr_result_valobj_sp->GetValue().SetValueType(Value::eValueTypeLoadAddress);
904 Error err;
905 new_value_sp = ptr_result_valobj_sp->Dereference(err);
906 if (new_value_sp)
907 new_value_sp->SetName(ConstString(name));
908 }
909 sb_value.SetSP(new_value_sp);
Enrico Granatac9310302011-08-04 17:07:02 +0000910 }
Enrico Granata979e20d2011-07-29 19:53:35 +0000911 }
Greg Clayton952e9dc2013-03-27 23:08:40 +0000912 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata979e20d2011-07-29 19:53:35 +0000913 if (log)
914 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000915 if (new_value_sp)
916 log->Printf ("SBValue(%p)::CreateValueFromAddress => \"%s\"", value_sp.get(), new_value_sp->GetName().AsCString());
Johnny Chena713b862011-08-09 22:38:07 +0000917 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000918 log->Printf ("SBValue(%p)::CreateValueFromAddress => NULL", value_sp.get());
Johnny Chena713b862011-08-09 22:38:07 +0000919 }
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000920 return sb_value;
Enrico Granata979e20d2011-07-29 19:53:35 +0000921}
922
Enrico Granata91544802011-09-06 19:20:51 +0000923lldb::SBValue
Greg Claytond68e0892011-09-09 23:04:00 +0000924SBValue::CreateValueFromData (const char* name, SBData data, SBType type)
Enrico Granata91544802011-09-06 19:20:51 +0000925{
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000926 lldb::SBValue sb_value;
927 lldb::ValueObjectSP new_value_sp;
928 lldb::ValueObjectSP value_sp(GetSP());
929 if (value_sp)
Enrico Granata91544802011-09-06 19:20:51 +0000930 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000931 ExecutionContext exe_ctx (value_sp->GetExecutionContextRef());
932
933 new_value_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000934 type.m_opaque_sp->GetASTContext() ,
935 type.m_opaque_sp->GetOpaqueQualType(),
936 ConstString(name),
937 *data.m_opaque_sp,
938 LLDB_INVALID_ADDRESS);
939 new_value_sp->SetAddressTypeOfChildren(eAddressTypeLoad);
940 sb_value.SetSP(new_value_sp);
Enrico Granata91544802011-09-06 19:20:51 +0000941 }
Greg Clayton952e9dc2013-03-27 23:08:40 +0000942 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata91544802011-09-06 19:20:51 +0000943 if (log)
944 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000945 if (new_value_sp)
Greg Clayton12b7ea32012-06-04 20:13:23 +0000946 log->Printf ("SBValue(%p)::CreateValueFromData => \"%s\"", value_sp.get(), new_value_sp->GetName().AsCString());
Enrico Granata91544802011-09-06 19:20:51 +0000947 else
Greg Clayton12b7ea32012-06-04 20:13:23 +0000948 log->Printf ("SBValue(%p)::CreateValueFromData => NULL", value_sp.get());
Enrico Granata91544802011-09-06 19:20:51 +0000949 }
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000950 return sb_value;
Enrico Granata91544802011-09-06 19:20:51 +0000951}
952
Chris Lattner24943d22010-06-08 16:52:24 +0000953SBValue
954SBValue::GetChildAtIndex (uint32_t idx)
955{
Greg Clayton8f64c472011-07-15 19:31:49 +0000956 const bool can_create_synthetic = false;
957 lldb::DynamicValueType use_dynamic = eNoDynamicValues;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000958 lldb::ValueObjectSP value_sp(GetSP());
959 if (value_sp)
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000960 {
961 TargetSP target_sp(value_sp->GetTargetSP());
962 if (target_sp)
963 use_dynamic = target_sp->GetPreferDynamicValue();
964 }
Greg Clayton8f64c472011-07-15 19:31:49 +0000965 return GetChildAtIndex (idx, use_dynamic, can_create_synthetic);
Jim Inghame41494a2011-04-16 00:01:13 +0000966}
967
968SBValue
Greg Clayton8f64c472011-07-15 19:31:49 +0000969SBValue::GetChildAtIndex (uint32_t idx, lldb::DynamicValueType use_dynamic, bool can_create_synthetic)
Jim Inghame41494a2011-04-16 00:01:13 +0000970{
Chris Lattner24943d22010-06-08 16:52:24 +0000971 lldb::ValueObjectSP child_sp;
Greg Clayton952e9dc2013-03-27 23:08:40 +0000972 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Chris Lattner24943d22010-06-08 16:52:24 +0000973
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000974 lldb::ValueObjectSP value_sp(GetSP());
975 if (value_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000976 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000977 ProcessSP process_sp(value_sp->GetProcessSP());
978 Process::StopLocker stop_locker;
979 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Claytonb9dcc512011-06-29 18:28:50 +0000980 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000981 if (log)
982 log->Printf ("SBValue(%p)::GetChildAtIndex() => error: process is running", value_sp.get());
983 }
984 else
985 {
986 TargetSP target_sp(value_sp->GetTargetSP());
987 if (target_sp)
Greg Claytonfab305b2011-05-20 23:51:26 +0000988 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000989 Mutex::Locker api_locker (target_sp->GetAPIMutex());
990 const bool can_create = true;
991 child_sp = value_sp->GetChildAtIndex (idx, can_create);
992 if (can_create_synthetic && !child_sp)
Greg Claytonb9dcc512011-06-29 18:28:50 +0000993 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000994 if (value_sp->IsPointerType())
995 {
996 child_sp = value_sp->GetSyntheticArrayMemberFromPointer(idx, can_create);
997 }
998 else if (value_sp->IsArrayType())
999 {
1000 child_sp = value_sp->GetSyntheticArrayMemberFromArray(idx, can_create);
1001 }
Greg Clayton8f64c472011-07-15 19:31:49 +00001002 }
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001003
Greg Claytonfab305b2011-05-20 23:51:26 +00001004 }
Jim Inghame41494a2011-04-16 00:01:13 +00001005 }
1006 }
1007
Enrico Granata3d656c72012-10-22 18:18:36 +00001008 SBValue sb_value;
1009 sb_value.SetSP (child_sp, use_dynamic, GetPreferSyntheticValue());
Greg Clayton49ce6822010-10-31 03:01:06 +00001010 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001011 log->Printf ("SBValue(%p)::GetChildAtIndex (%u) => SBValue(%p)", value_sp.get(), idx, value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +00001012
Chris Lattner24943d22010-06-08 16:52:24 +00001013 return sb_value;
1014}
1015
1016uint32_t
1017SBValue::GetIndexOfChildWithName (const char *name)
1018{
Greg Clayton49ce6822010-10-31 03:01:06 +00001019 uint32_t idx = UINT32_MAX;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001020 lldb::ValueObjectSP value_sp(GetSP());
1021 if (value_sp)
Greg Claytonfab305b2011-05-20 23:51:26 +00001022 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001023 TargetSP target_sp(value_sp->GetTargetSP());
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001024 if (target_sp)
Greg Claytonb9dcc512011-06-29 18:28:50 +00001025 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001026 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Claytonfab305b2011-05-20 23:51:26 +00001027
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001028 idx = value_sp->GetIndexOfChildWithName (ConstString(name));
Greg Claytonb9dcc512011-06-29 18:28:50 +00001029 }
Greg Claytonfab305b2011-05-20 23:51:26 +00001030 }
Greg Clayton952e9dc2013-03-27 23:08:40 +00001031 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +00001032 if (log)
1033 {
1034 if (idx == UINT32_MAX)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001035 log->Printf ("SBValue(%p)::GetIndexOfChildWithName (name=\"%s\") => NOT FOUND", value_sp.get(), name);
Greg Clayton49ce6822010-10-31 03:01:06 +00001036 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001037 log->Printf ("SBValue(%p)::GetIndexOfChildWithName (name=\"%s\") => %u", value_sp.get(), name, idx);
Greg Clayton49ce6822010-10-31 03:01:06 +00001038 }
1039 return idx;
Chris Lattner24943d22010-06-08 16:52:24 +00001040}
1041
1042SBValue
1043SBValue::GetChildMemberWithName (const char *name)
1044{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001045 lldb::ValueObjectSP value_sp(GetSP());
1046 if (value_sp)
Johnny Chen446ccaa2011-06-29 21:19:39 +00001047 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001048 lldb::DynamicValueType use_dynamic_value = eNoDynamicValues;
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001049 TargetSP target_sp(value_sp->GetTargetSP());
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001050 if (target_sp)
1051 {
1052 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1053 use_dynamic_value = target_sp->GetPreferDynamicValue();
1054 }
Johnny Chen446ccaa2011-06-29 21:19:39 +00001055 return GetChildMemberWithName (name, use_dynamic_value);
1056 }
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001057 return SBValue();
Jim Inghame41494a2011-04-16 00:01:13 +00001058}
1059
1060SBValue
Jim Ingham10de7d12011-05-04 03:43:18 +00001061SBValue::GetChildMemberWithName (const char *name, lldb::DynamicValueType use_dynamic_value)
Jim Inghame41494a2011-04-16 00:01:13 +00001062{
Chris Lattner24943d22010-06-08 16:52:24 +00001063 lldb::ValueObjectSP child_sp;
1064 const ConstString str_name (name);
1065
Greg Clayton952e9dc2013-03-27 23:08:40 +00001066 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton905acaf2011-05-20 22:07:17 +00001067
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001068 lldb::ValueObjectSP value_sp(GetSP());
1069 if (value_sp)
Chris Lattner24943d22010-06-08 16:52:24 +00001070 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001071 ProcessSP process_sp(value_sp->GetProcessSP());
1072 Process::StopLocker stop_locker;
1073 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Jim Inghame41494a2011-04-16 00:01:13 +00001074 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001075 if (log)
1076 log->Printf ("SBValue(%p)::GetChildMemberWithName() => error: process is running", value_sp.get());
1077 }
1078 else
1079 {
1080 TargetSP target_sp(value_sp->GetTargetSP());
1081 if (target_sp)
Greg Claytonfab305b2011-05-20 23:51:26 +00001082 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001083 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1084 child_sp = value_sp->GetChildMemberWithName (str_name, true);
Greg Claytonfab305b2011-05-20 23:51:26 +00001085 }
Jim Inghame41494a2011-04-16 00:01:13 +00001086 }
1087 }
1088
Enrico Granata3d656c72012-10-22 18:18:36 +00001089 SBValue sb_value;
1090 sb_value.SetSP(child_sp, use_dynamic_value, GetPreferSyntheticValue());
Greg Clayton49ce6822010-10-31 03:01:06 +00001091
Greg Clayton49ce6822010-10-31 03:01:06 +00001092 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001093 log->Printf ("SBValue(%p)::GetChildMemberWithName (name=\"%s\") => SBValue(%p)", value_sp.get(), name, value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +00001094
Chris Lattner24943d22010-06-08 16:52:24 +00001095 return sb_value;
1096}
1097
Enrico Granataf7a9b142011-07-15 02:26:42 +00001098lldb::SBValue
Jim Ingham1b425752011-12-08 19:44:08 +00001099SBValue::GetDynamicValue (lldb::DynamicValueType use_dynamic)
1100{
Enrico Granata3d656c72012-10-22 18:18:36 +00001101 SBValue value_sb;
1102 if (IsValid())
Jim Ingham1b425752011-12-08 19:44:08 +00001103 {
Enrico Granata3d656c72012-10-22 18:18:36 +00001104 ValueImplSP proxy_sp(new ValueImpl(m_opaque_sp->GetRootSP(),use_dynamic,m_opaque_sp->GetUseSynthetic()));
1105 value_sb.SetSP(proxy_sp);
Jim Ingham1b425752011-12-08 19:44:08 +00001106 }
Enrico Granata3d656c72012-10-22 18:18:36 +00001107 return value_sb;
Jim Ingham1b425752011-12-08 19:44:08 +00001108}
1109
1110lldb::SBValue
1111SBValue::GetStaticValue ()
1112{
Enrico Granata3d656c72012-10-22 18:18:36 +00001113 SBValue value_sb;
1114 if (IsValid())
Jim Ingham1b425752011-12-08 19:44:08 +00001115 {
Enrico Granata3d656c72012-10-22 18:18:36 +00001116 ValueImplSP proxy_sp(new ValueImpl(m_opaque_sp->GetRootSP(),eNoDynamicValues,m_opaque_sp->GetUseSynthetic()));
1117 value_sb.SetSP(proxy_sp);
Jim Ingham1b425752011-12-08 19:44:08 +00001118 }
Enrico Granata3d656c72012-10-22 18:18:36 +00001119 return value_sb;
Jim Ingham1b425752011-12-08 19:44:08 +00001120}
1121
Enrico Granatadba1de82012-03-27 02:35:13 +00001122lldb::SBValue
1123SBValue::GetNonSyntheticValue ()
1124{
Enrico Granata3d656c72012-10-22 18:18:36 +00001125 SBValue value_sb;
1126 if (IsValid())
Enrico Granatadba1de82012-03-27 02:35:13 +00001127 {
Enrico Granata3d656c72012-10-22 18:18:36 +00001128 ValueImplSP proxy_sp(new ValueImpl(m_opaque_sp->GetRootSP(),m_opaque_sp->GetUseDynamic(),false));
1129 value_sb.SetSP(proxy_sp);
Enrico Granatadba1de82012-03-27 02:35:13 +00001130 }
Enrico Granata3d656c72012-10-22 18:18:36 +00001131 return value_sb;
1132}
1133
1134lldb::DynamicValueType
1135SBValue::GetPreferDynamicValue ()
1136{
1137 if (!IsValid())
1138 return eNoDynamicValues;
1139 return m_opaque_sp->GetUseDynamic();
1140}
1141
1142void
1143SBValue::SetPreferDynamicValue (lldb::DynamicValueType use_dynamic)
1144{
1145 if (IsValid())
1146 return m_opaque_sp->SetUseDynamic (use_dynamic);
1147}
1148
1149bool
1150SBValue::GetPreferSyntheticValue ()
1151{
1152 if (!IsValid())
1153 return false;
1154 return m_opaque_sp->GetUseSynthetic();
1155}
1156
1157void
1158SBValue::SetPreferSyntheticValue (bool use_synthetic)
1159{
1160 if (IsValid())
1161 return m_opaque_sp->SetUseSynthetic (use_synthetic);
Enrico Granatadba1de82012-03-27 02:35:13 +00001162}
1163
Jim Ingham1b425752011-12-08 19:44:08 +00001164bool
1165SBValue::IsDynamic()
1166{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001167 lldb::ValueObjectSP value_sp(GetSP());
1168 if (value_sp)
Jim Ingham1b425752011-12-08 19:44:08 +00001169 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001170 TargetSP target_sp(value_sp->GetTargetSP());
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001171 if (target_sp)
Jim Ingham1b425752011-12-08 19:44:08 +00001172 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001173 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001174 return value_sp->IsDynamic();
Jim Ingham1b425752011-12-08 19:44:08 +00001175 }
1176 }
1177 return false;
1178}
1179
Enrico Granata3d656c72012-10-22 18:18:36 +00001180bool
1181SBValue::IsSynthetic ()
1182{
1183 lldb::ValueObjectSP value_sp(GetSP());
1184 if (value_sp)
1185 {
1186 TargetSP target_sp(value_sp->GetTargetSP());
1187 if (target_sp)
1188 {
1189 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1190 return value_sp->IsSynthetic();
1191 }
1192 }
1193 return false;
1194}
1195
Jim Ingham1b425752011-12-08 19:44:08 +00001196lldb::SBValue
Enrico Granataf7a9b142011-07-15 02:26:42 +00001197SBValue::GetValueForExpressionPath(const char* expr_path)
1198{
Greg Clayton952e9dc2013-03-27 23:08:40 +00001199 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granataf7a9b142011-07-15 02:26:42 +00001200 lldb::ValueObjectSP child_sp;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001201 lldb::ValueObjectSP value_sp(GetSP());
1202 if (value_sp)
Enrico Granataf7a9b142011-07-15 02:26:42 +00001203 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001204 ProcessSP process_sp(value_sp->GetProcessSP());
1205 Process::StopLocker stop_locker;
1206 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granataf7a9b142011-07-15 02:26:42 +00001207 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001208 if (log)
1209 log->Printf ("SBValue(%p)::GetValueForExpressionPath() => error: process is running", value_sp.get());
1210 }
1211 else
1212 {
1213 TargetSP target_sp(value_sp->GetTargetSP());
1214 if (target_sp)
1215 {
1216 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1217 // using default values for all the fancy options, just do it if you can
1218 child_sp = value_sp->GetValueForExpressionPath(expr_path);
1219 }
Enrico Granataf7a9b142011-07-15 02:26:42 +00001220 }
1221 }
1222
Enrico Granata3d656c72012-10-22 18:18:36 +00001223 SBValue sb_value;
1224 sb_value.SetSP(child_sp,GetPreferDynamicValue(),GetPreferSyntheticValue());
Enrico Granataf7a9b142011-07-15 02:26:42 +00001225
Enrico Granataf7a9b142011-07-15 02:26:42 +00001226 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001227 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 +00001228
1229 return sb_value;
1230}
Chris Lattner24943d22010-06-08 16:52:24 +00001231
Greg Clayton0fb0bcc2011-08-03 22:57:10 +00001232int64_t
Enrico Granatac92eb402011-08-04 01:41:02 +00001233SBValue::GetValueAsSigned(SBError& error, int64_t fail_value)
1234{
Jim Ingham574c3d62011-08-12 23:34:31 +00001235 error.Clear();
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001236 lldb::ValueObjectSP value_sp(GetSP());
1237 if (value_sp)
Enrico Granatac92eb402011-08-04 01:41:02 +00001238 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001239 ProcessSP process_sp(value_sp->GetProcessSP());
1240 Process::StopLocker stop_locker;
1241 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granatac92eb402011-08-04 01:41:02 +00001242 {
Greg Clayton952e9dc2013-03-27 23:08:40 +00001243 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001244 if (log)
1245 log->Printf ("SBValue(%p)::GetValueAsSigned() => error: process is running", value_sp.get());
1246 error.SetErrorString("process is running");
Enrico Granatac92eb402011-08-04 01:41:02 +00001247 }
1248 else
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001249 {
1250 TargetSP target_sp(value_sp->GetTargetSP());
1251 if (target_sp)
1252 {
1253 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1254 Scalar scalar;
1255 if (value_sp->ResolveValue (scalar))
Enrico Granata0fd6c8d2012-10-24 18:14:21 +00001256 return scalar.SLongLong(fail_value);
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001257 else
1258 error.SetErrorString("could not get value");
1259 }
1260 else
1261 error.SetErrorString("could not get target");
1262 }
Enrico Granatac92eb402011-08-04 01:41:02 +00001263 }
1264 error.SetErrorString("invalid SBValue");
1265 return fail_value;
1266}
1267
1268uint64_t
1269SBValue::GetValueAsUnsigned(SBError& error, uint64_t fail_value)
1270{
Jim Ingham574c3d62011-08-12 23:34:31 +00001271 error.Clear();
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001272 lldb::ValueObjectSP value_sp(GetSP());
1273 if (value_sp)
Enrico Granatac92eb402011-08-04 01:41:02 +00001274 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001275 ProcessSP process_sp(value_sp->GetProcessSP());
1276 Process::StopLocker stop_locker;
1277 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granatac92eb402011-08-04 01:41:02 +00001278 {
Greg Clayton952e9dc2013-03-27 23:08:40 +00001279 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001280 if (log)
1281 log->Printf ("SBValue(%p)::GetValueAsUnsigned() => error: process is running", value_sp.get());
1282 error.SetErrorString("process is running");
Enrico Granatac92eb402011-08-04 01:41:02 +00001283 }
1284 else
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001285 {
1286 TargetSP target_sp(value_sp->GetTargetSP());
1287 if (target_sp)
1288 {
1289 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1290 Scalar scalar;
1291 if (value_sp->ResolveValue (scalar))
Enrico Granata4a0a1252012-10-24 20:24:39 +00001292 return scalar.ULongLong(fail_value);
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001293 else
1294 error.SetErrorString("could not get value");
1295 }
1296 else
1297 error.SetErrorString("could not get target");
1298 }
Enrico Granatac92eb402011-08-04 01:41:02 +00001299 }
1300 error.SetErrorString("invalid SBValue");
1301 return fail_value;
1302}
1303
1304int64_t
Greg Clayton0fb0bcc2011-08-03 22:57:10 +00001305SBValue::GetValueAsSigned(int64_t fail_value)
1306{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001307 lldb::ValueObjectSP value_sp(GetSP());
1308 if (value_sp)
Greg Clayton0fb0bcc2011-08-03 22:57:10 +00001309 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001310 ProcessSP process_sp(value_sp->GetProcessSP());
1311 Process::StopLocker stop_locker;
1312 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Clayton0fb0bcc2011-08-03 22:57:10 +00001313 {
Greg Clayton952e9dc2013-03-27 23:08:40 +00001314 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001315 if (log)
1316 log->Printf ("SBValue(%p)::GetValueAsSigned() => error: process is running", value_sp.get());
1317 }
1318 else
1319 {
1320 TargetSP target_sp(value_sp->GetTargetSP());
1321 if (target_sp)
1322 {
1323 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1324 Scalar scalar;
1325 if (value_sp->ResolveValue (scalar))
Enrico Granata0fd6c8d2012-10-24 18:14:21 +00001326 return scalar.SLongLong(fail_value);
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001327 }
Greg Clayton0fb0bcc2011-08-03 22:57:10 +00001328 }
1329 }
1330 return fail_value;
1331}
1332
1333uint64_t
1334SBValue::GetValueAsUnsigned(uint64_t fail_value)
1335{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001336 lldb::ValueObjectSP value_sp(GetSP());
1337 if (value_sp)
Greg Clayton0fb0bcc2011-08-03 22:57:10 +00001338 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001339 ProcessSP process_sp(value_sp->GetProcessSP());
1340 Process::StopLocker stop_locker;
1341 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Clayton0fb0bcc2011-08-03 22:57:10 +00001342 {
Greg Clayton952e9dc2013-03-27 23:08:40 +00001343 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001344 if (log)
1345 log->Printf ("SBValue(%p)::GetValueAsUnsigned() => error: process is running", value_sp.get());
1346 }
1347 else
1348 {
1349 TargetSP target_sp(value_sp->GetTargetSP());
1350 if (target_sp)
1351 {
1352 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1353 Scalar scalar;
1354 if (value_sp->ResolveValue (scalar))
Enrico Granata4a0a1252012-10-24 20:24:39 +00001355 return scalar.ULongLong(fail_value);
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001356 }
Greg Clayton0fb0bcc2011-08-03 22:57:10 +00001357 }
1358 }
1359 return fail_value;
1360}
1361
Greg Clayton54037b12012-10-23 01:50:10 +00001362bool
1363SBValue::MightHaveChildren ()
1364{
Greg Clayton952e9dc2013-03-27 23:08:40 +00001365 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton54037b12012-10-23 01:50:10 +00001366 bool has_children = false;
1367 lldb::ValueObjectSP value_sp(GetSP());
1368 if (value_sp)
1369 has_children = value_sp->MightHaveChildren();
1370
1371 if (log)
Enrico Granatafe9d7bf2013-02-28 02:26:12 +00001372 log->Printf ("SBValue(%p)::MightHaveChildren() => %i", value_sp.get(), has_children);
Greg Clayton54037b12012-10-23 01:50:10 +00001373 return has_children;
1374}
1375
Chris Lattner24943d22010-06-08 16:52:24 +00001376uint32_t
1377SBValue::GetNumChildren ()
1378{
1379 uint32_t num_children = 0;
1380
Greg Clayton952e9dc2013-03-27 23:08:40 +00001381 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001382 lldb::ValueObjectSP value_sp(GetSP());
1383 if (value_sp)
Greg Claytonfab305b2011-05-20 23:51:26 +00001384 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001385 ProcessSP process_sp(value_sp->GetProcessSP());
1386 Process::StopLocker stop_locker;
1387 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Claytonb9dcc512011-06-29 18:28:50 +00001388 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001389 if (log)
1390 log->Printf ("SBValue(%p)::GetNumChildren() => error: process is running", value_sp.get());
1391 }
1392 else
1393 {
1394 TargetSP target_sp(value_sp->GetTargetSP());
1395 if (target_sp)
1396 {
1397 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Claytonfab305b2011-05-20 23:51:26 +00001398
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001399 num_children = value_sp->GetNumChildren();
1400 }
Greg Claytonb9dcc512011-06-29 18:28:50 +00001401 }
Greg Claytonfab305b2011-05-20 23:51:26 +00001402 }
Greg Clayton49ce6822010-10-31 03:01:06 +00001403
Greg Clayton49ce6822010-10-31 03:01:06 +00001404 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001405 log->Printf ("SBValue(%p)::GetNumChildren () => %u", value_sp.get(), num_children);
Chris Lattner24943d22010-06-08 16:52:24 +00001406
1407 return num_children;
1408}
1409
Chris Lattner24943d22010-06-08 16:52:24 +00001410
1411SBValue
1412SBValue::Dereference ()
1413{
Greg Clayton49ce6822010-10-31 03:01:06 +00001414 SBValue sb_value;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001415 lldb::ValueObjectSP value_sp(GetSP());
1416 if (value_sp)
Chris Lattner24943d22010-06-08 16:52:24 +00001417 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001418 TargetSP target_sp(value_sp->GetTargetSP());
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001419 if (target_sp)
Greg Claytonb9dcc512011-06-29 18:28:50 +00001420 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001421 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Claytonfab305b2011-05-20 23:51:26 +00001422
Greg Claytonb9dcc512011-06-29 18:28:50 +00001423 Error error;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001424 sb_value = value_sp->Dereference (error);
Greg Claytonb9dcc512011-06-29 18:28:50 +00001425 }
Chris Lattner24943d22010-06-08 16:52:24 +00001426 }
Greg Clayton952e9dc2013-03-27 23:08:40 +00001427 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +00001428 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001429 log->Printf ("SBValue(%p)::Dereference () => SBValue(%p)", value_sp.get(), value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +00001430
1431 return sb_value;
Chris Lattner24943d22010-06-08 16:52:24 +00001432}
1433
1434bool
Greg Clayton49ce6822010-10-31 03:01:06 +00001435SBValue::TypeIsPointerType ()
Chris Lattner24943d22010-06-08 16:52:24 +00001436{
1437 bool is_ptr_type = false;
1438
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001439 lldb::ValueObjectSP value_sp(GetSP());
1440 if (value_sp)
Greg Claytonfab305b2011-05-20 23:51:26 +00001441 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001442 TargetSP target_sp(value_sp->GetTargetSP());
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001443 if (target_sp)
Greg Claytonb9dcc512011-06-29 18:28:50 +00001444 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001445 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Claytonfab305b2011-05-20 23:51:26 +00001446
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001447 is_ptr_type = value_sp->IsPointerType();
Greg Claytonb9dcc512011-06-29 18:28:50 +00001448 }
Greg Claytonfab305b2011-05-20 23:51:26 +00001449 }
Greg Clayton49ce6822010-10-31 03:01:06 +00001450
Greg Clayton952e9dc2013-03-27 23:08:40 +00001451 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +00001452 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001453 log->Printf ("SBValue(%p)::TypeIsPointerType () => %i", value_sp.get(), is_ptr_type);
Greg Clayton49ce6822010-10-31 03:01:06 +00001454
Chris Lattner24943d22010-06-08 16:52:24 +00001455
1456 return is_ptr_type;
1457}
1458
Chris Lattner24943d22010-06-08 16:52:24 +00001459void *
1460SBValue::GetOpaqueType()
1461{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001462 lldb::ValueObjectSP value_sp(GetSP());
1463 if (value_sp)
Greg Claytonfab305b2011-05-20 23:51:26 +00001464 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001465 TargetSP target_sp(value_sp->GetTargetSP());
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001466 if (target_sp)
Greg Claytonb9dcc512011-06-29 18:28:50 +00001467 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001468 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Claytonfab305b2011-05-20 23:51:26 +00001469
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001470 return value_sp->GetClangType();
Greg Claytonb9dcc512011-06-29 18:28:50 +00001471 }
Greg Claytonfab305b2011-05-20 23:51:26 +00001472 }
Chris Lattner24943d22010-06-08 16:52:24 +00001473 return NULL;
1474}
1475
Enrico Granata979e20d2011-07-29 19:53:35 +00001476lldb::SBTarget
1477SBValue::GetTarget()
1478{
Greg Clayton334d33a2012-01-30 07:41:31 +00001479 SBTarget sb_target;
1480 TargetSP target_sp;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001481 lldb::ValueObjectSP value_sp(GetSP());
1482 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +00001483 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001484 target_sp = value_sp->GetTargetSP();
Greg Clayton334d33a2012-01-30 07:41:31 +00001485 sb_target.SetSP (target_sp);
Enrico Granata979e20d2011-07-29 19:53:35 +00001486 }
Greg Clayton952e9dc2013-03-27 23:08:40 +00001487 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata979e20d2011-07-29 19:53:35 +00001488 if (log)
1489 {
Greg Clayton334d33a2012-01-30 07:41:31 +00001490 if (target_sp.get() == NULL)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001491 log->Printf ("SBValue(%p)::GetTarget () => NULL", value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001492 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001493 log->Printf ("SBValue(%p)::GetTarget () => %p", value_sp.get(), target_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001494 }
Greg Clayton334d33a2012-01-30 07:41:31 +00001495 return sb_target;
Enrico Granata979e20d2011-07-29 19:53:35 +00001496}
1497
1498lldb::SBProcess
1499SBValue::GetProcess()
1500{
Greg Clayton334d33a2012-01-30 07:41:31 +00001501 SBProcess sb_process;
1502 ProcessSP process_sp;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001503 lldb::ValueObjectSP value_sp(GetSP());
1504 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +00001505 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001506 process_sp = value_sp->GetProcessSP();
Greg Clayton334d33a2012-01-30 07:41:31 +00001507 if (process_sp)
1508 sb_process.SetSP (process_sp);
Enrico Granata979e20d2011-07-29 19:53:35 +00001509 }
Greg Clayton952e9dc2013-03-27 23:08:40 +00001510 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata979e20d2011-07-29 19:53:35 +00001511 if (log)
1512 {
Greg Clayton334d33a2012-01-30 07:41:31 +00001513 if (process_sp.get() == NULL)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001514 log->Printf ("SBValue(%p)::GetProcess () => NULL", value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001515 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001516 log->Printf ("SBValue(%p)::GetProcess () => %p", value_sp.get(), process_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001517 }
Greg Clayton334d33a2012-01-30 07:41:31 +00001518 return sb_process;
Enrico Granata979e20d2011-07-29 19:53:35 +00001519}
1520
1521lldb::SBThread
1522SBValue::GetThread()
1523{
Greg Clayton90c52142012-01-30 02:53:15 +00001524 SBThread sb_thread;
1525 ThreadSP thread_sp;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001526 lldb::ValueObjectSP value_sp(GetSP());
1527 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +00001528 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001529 thread_sp = value_sp->GetThreadSP();
1530 sb_thread.SetThread(thread_sp);
Enrico Granata979e20d2011-07-29 19:53:35 +00001531 }
Greg Clayton952e9dc2013-03-27 23:08:40 +00001532 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata979e20d2011-07-29 19:53:35 +00001533 if (log)
1534 {
Greg Clayton90c52142012-01-30 02:53:15 +00001535 if (thread_sp.get() == NULL)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001536 log->Printf ("SBValue(%p)::GetThread () => NULL", value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001537 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001538 log->Printf ("SBValue(%p)::GetThread () => %p", value_sp.get(), thread_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001539 }
Greg Clayton90c52142012-01-30 02:53:15 +00001540 return sb_thread;
Enrico Granata979e20d2011-07-29 19:53:35 +00001541}
1542
1543lldb::SBFrame
1544SBValue::GetFrame()
1545{
Greg Clayton334d33a2012-01-30 07:41:31 +00001546 SBFrame sb_frame;
1547 StackFrameSP frame_sp;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001548 lldb::ValueObjectSP value_sp(GetSP());
1549 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +00001550 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001551 frame_sp = value_sp->GetFrameSP();
1552 sb_frame.SetFrameSP (frame_sp);
Enrico Granata979e20d2011-07-29 19:53:35 +00001553 }
Greg Clayton952e9dc2013-03-27 23:08:40 +00001554 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata979e20d2011-07-29 19:53:35 +00001555 if (log)
1556 {
Greg Clayton334d33a2012-01-30 07:41:31 +00001557 if (frame_sp.get() == NULL)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001558 log->Printf ("SBValue(%p)::GetFrame () => NULL", value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001559 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001560 log->Printf ("SBValue(%p)::GetFrame () => %p", value_sp.get(), frame_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001561 }
Greg Clayton334d33a2012-01-30 07:41:31 +00001562 return sb_frame;
Enrico Granata979e20d2011-07-29 19:53:35 +00001563}
1564
1565
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001566lldb::ValueObjectSP
1567SBValue::GetSP () const
Chris Lattner24943d22010-06-08 16:52:24 +00001568{
Enrico Granata3d656c72012-10-22 18:18:36 +00001569 if (!m_opaque_sp || !m_opaque_sp->IsValid())
1570 return ValueObjectSP();
1571 return m_opaque_sp->GetSP();
1572}
1573
1574void
1575SBValue::SetSP (ValueImplSP impl_sp)
1576{
1577 m_opaque_sp = impl_sp;
Chris Lattner24943d22010-06-08 16:52:24 +00001578}
1579
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001580void
1581SBValue::SetSP (const lldb::ValueObjectSP &sp)
Chris Lattner24943d22010-06-08 16:52:24 +00001582{
Enrico Granata3d656c72012-10-22 18:18:36 +00001583 if (sp)
1584 {
1585 lldb::TargetSP target_sp(sp->GetTargetSP());
1586 if (target_sp)
1587 {
1588 lldb::DynamicValueType use_dynamic = target_sp->GetPreferDynamicValue();
1589 bool use_synthetic = target_sp->TargetProperties::GetEnableSyntheticValue();
1590 m_opaque_sp = ValueImplSP(new ValueImpl(sp, use_dynamic, use_synthetic));
1591 }
1592 else
1593 m_opaque_sp = ValueImplSP(new ValueImpl(sp,eNoDynamicValues,true));
1594 }
1595 else
1596 m_opaque_sp = ValueImplSP(new ValueImpl(sp,eNoDynamicValues,false));
Chris Lattner24943d22010-06-08 16:52:24 +00001597}
Caroline Tice98f930f2010-09-20 05:20:02 +00001598
Enrico Granata3d656c72012-10-22 18:18:36 +00001599void
1600SBValue::SetSP (const lldb::ValueObjectSP &sp, lldb::DynamicValueType use_dynamic)
1601{
1602 if (sp)
1603 {
1604 lldb::TargetSP target_sp(sp->GetTargetSP());
1605 if (target_sp)
1606 {
1607 bool use_synthetic = target_sp->TargetProperties::GetEnableSyntheticValue();
1608 SetSP (sp, use_dynamic, use_synthetic);
1609 }
1610 else
1611 SetSP (sp, use_dynamic, true);
1612 }
1613 else
1614 SetSP (sp, use_dynamic, false);
1615}
1616
1617void
1618SBValue::SetSP (const lldb::ValueObjectSP &sp, bool use_synthetic)
1619{
1620 if (sp)
1621 {
1622 lldb::TargetSP target_sp(sp->GetTargetSP());
1623 if (target_sp)
1624 {
1625 lldb::DynamicValueType use_dynamic = target_sp->GetPreferDynamicValue();
1626 SetSP (sp, use_dynamic, use_synthetic);
1627 }
1628 else
1629 SetSP (sp, eNoDynamicValues, use_synthetic);
1630 }
1631 else
1632 SetSP (sp, eNoDynamicValues, use_synthetic);
1633}
1634
1635void
1636SBValue::SetSP (const lldb::ValueObjectSP &sp, lldb::DynamicValueType use_dynamic, bool use_synthetic)
1637{
1638 m_opaque_sp = ValueImplSP(new ValueImpl(sp,use_dynamic,use_synthetic));
1639}
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001640
Caroline Tice98f930f2010-09-20 05:20:02 +00001641bool
Greg Clayton49ce6822010-10-31 03:01:06 +00001642SBValue::GetExpressionPath (SBStream &description)
1643{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001644 lldb::ValueObjectSP value_sp(GetSP());
1645 if (value_sp)
Greg Clayton49ce6822010-10-31 03:01:06 +00001646 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001647 value_sp->GetExpressionPath (description.ref(), false);
Greg Claytonb01000f2011-01-17 03:46:26 +00001648 return true;
1649 }
1650 return false;
1651}
1652
1653bool
1654SBValue::GetExpressionPath (SBStream &description, bool qualify_cxx_base_classes)
1655{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001656 lldb::ValueObjectSP value_sp(GetSP());
1657 if (value_sp)
Greg Claytonb01000f2011-01-17 03:46:26 +00001658 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001659 value_sp->GetExpressionPath (description.ref(), qualify_cxx_base_classes);
Greg Clayton49ce6822010-10-31 03:01:06 +00001660 return true;
1661 }
1662 return false;
1663}
1664
1665bool
Caroline Tice98f930f2010-09-20 05:20:02 +00001666SBValue::GetDescription (SBStream &description)
1667{
Greg Clayton96154be2011-11-13 06:57:31 +00001668 Stream &strm = description.ref();
1669
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001670 lldb::ValueObjectSP value_sp(GetSP());
1671 if (value_sp)
Caroline Tice98f930f2010-09-20 05:20:02 +00001672 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001673 ProcessSP process_sp(value_sp->GetProcessSP());
1674 Process::StopLocker stop_locker;
1675 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
1676 {
Greg Clayton952e9dc2013-03-27 23:08:40 +00001677 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001678 if (log)
1679 log->Printf ("SBValue(%p)::GetDescription() => error: process is running", value_sp.get());
1680 }
1681 else
1682 {
1683 ValueObject::DumpValueObject (strm, value_sp.get());
1684 }
Caroline Tice98f930f2010-09-20 05:20:02 +00001685 }
1686 else
Greg Clayton96154be2011-11-13 06:57:31 +00001687 strm.PutCString ("No value");
Caroline Tice98f930f2010-09-20 05:20:02 +00001688
1689 return true;
1690}
Greg Claytone179a582011-01-05 18:43:15 +00001691
1692lldb::Format
Greg Claytond68e0892011-09-09 23:04:00 +00001693SBValue::GetFormat ()
Greg Claytone179a582011-01-05 18:43:15 +00001694{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001695 lldb::ValueObjectSP value_sp(GetSP());
1696 if (value_sp)
1697 return value_sp->GetFormat();
Greg Claytone179a582011-01-05 18:43:15 +00001698 return eFormatDefault;
1699}
1700
1701void
1702SBValue::SetFormat (lldb::Format format)
1703{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001704 lldb::ValueObjectSP value_sp(GetSP());
1705 if (value_sp)
1706 value_sp->SetFormat(format);
Greg Claytone179a582011-01-05 18:43:15 +00001707}
1708
Enrico Granata979e20d2011-07-29 19:53:35 +00001709lldb::SBValue
1710SBValue::AddressOf()
1711{
1712 SBValue sb_value;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001713 lldb::ValueObjectSP value_sp(GetSP());
1714 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +00001715 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001716 TargetSP target_sp (value_sp->GetTargetSP());
1717 if (target_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +00001718 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001719 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Enrico Granata979e20d2011-07-29 19:53:35 +00001720 Error error;
Enrico Granata3d656c72012-10-22 18:18:36 +00001721 sb_value.SetSP(value_sp->AddressOf (error),GetPreferDynamicValue(), GetPreferSyntheticValue());
Enrico Granata979e20d2011-07-29 19:53:35 +00001722 }
1723 }
Greg Clayton952e9dc2013-03-27 23:08:40 +00001724 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata979e20d2011-07-29 19:53:35 +00001725 if (log)
Greg Clayton12b7ea32012-06-04 20:13:23 +00001726 log->Printf ("SBValue(%p)::AddressOf () => SBValue(%p)", value_sp.get(), value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001727
1728 return sb_value;
Johnny Chena713b862011-08-09 22:38:07 +00001729}
Enrico Granata91544802011-09-06 19:20:51 +00001730
1731lldb::addr_t
1732SBValue::GetLoadAddress()
1733{
1734 lldb::addr_t value = LLDB_INVALID_ADDRESS;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001735 lldb::ValueObjectSP value_sp(GetSP());
1736 if (value_sp)
Enrico Granata91544802011-09-06 19:20:51 +00001737 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001738 TargetSP target_sp (value_sp->GetTargetSP());
1739 if (target_sp)
Enrico Granata91544802011-09-06 19:20:51 +00001740 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001741 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Enrico Granata91544802011-09-06 19:20:51 +00001742 const bool scalar_is_load_address = true;
1743 AddressType addr_type;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001744 value = value_sp->GetAddressOf(scalar_is_load_address, &addr_type);
Enrico Granata91544802011-09-06 19:20:51 +00001745 if (addr_type == eAddressTypeFile)
1746 {
Greg Clayton3508c382012-02-24 01:59:29 +00001747 ModuleSP module_sp (value_sp->GetModule());
1748 if (!module_sp)
Enrico Granata91544802011-09-06 19:20:51 +00001749 value = LLDB_INVALID_ADDRESS;
1750 else
1751 {
1752 Address addr;
Greg Clayton3508c382012-02-24 01:59:29 +00001753 module_sp->ResolveFileAddress(value, addr);
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001754 value = addr.GetLoadAddress(target_sp.get());
Enrico Granata91544802011-09-06 19:20:51 +00001755 }
1756 }
1757 else if (addr_type == eAddressTypeHost || addr_type == eAddressTypeInvalid)
1758 value = LLDB_INVALID_ADDRESS;
1759 }
1760 }
Greg Clayton952e9dc2013-03-27 23:08:40 +00001761 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata91544802011-09-06 19:20:51 +00001762 if (log)
Daniel Malea5f35a4b2012-11-29 21:49:15 +00001763 log->Printf ("SBValue(%p)::GetLoadAddress () => (%" PRIu64 ")", value_sp.get(), value);
Enrico Granata91544802011-09-06 19:20:51 +00001764
1765 return value;
1766}
1767
1768lldb::SBAddress
1769SBValue::GetAddress()
1770{
1771 Address addr;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001772 lldb::ValueObjectSP value_sp(GetSP());
1773 if (value_sp)
Enrico Granata91544802011-09-06 19:20:51 +00001774 {
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001775 TargetSP target_sp (value_sp->GetTargetSP());
1776 if (target_sp)
Enrico Granata91544802011-09-06 19:20:51 +00001777 {
1778 lldb::addr_t value = LLDB_INVALID_ADDRESS;
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001779 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Enrico Granata91544802011-09-06 19:20:51 +00001780 const bool scalar_is_load_address = true;
1781 AddressType addr_type;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001782 value = value_sp->GetAddressOf(scalar_is_load_address, &addr_type);
Enrico Granata91544802011-09-06 19:20:51 +00001783 if (addr_type == eAddressTypeFile)
1784 {
Greg Clayton3508c382012-02-24 01:59:29 +00001785 ModuleSP module_sp (value_sp->GetModule());
1786 if (module_sp)
1787 module_sp->ResolveFileAddress(value, addr);
Enrico Granata91544802011-09-06 19:20:51 +00001788 }
1789 else if (addr_type == eAddressTypeLoad)
1790 {
1791 // no need to check the return value on this.. if it can actually do the resolve
1792 // addr will be in the form (section,offset), otherwise it will simply be returned
1793 // as (NULL, value)
Greg Claytonb4d7fc02012-02-17 07:49:44 +00001794 addr.SetLoadAddress(value, target_sp.get());
Enrico Granata91544802011-09-06 19:20:51 +00001795 }
1796 }
1797 }
Greg Clayton952e9dc2013-03-27 23:08:40 +00001798 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata91544802011-09-06 19:20:51 +00001799 if (log)
Daniel Malea5f35a4b2012-11-29 21:49:15 +00001800 log->Printf ("SBValue(%p)::GetAddress () => (%s,%" PRIu64 ")", value_sp.get(),
Jim Ingham47beabb2012-10-16 21:41:58 +00001801 (addr.GetSection() ? addr.GetSection()->GetName().GetCString() : "NULL"),
1802 addr.GetOffset());
Enrico Granata91544802011-09-06 19:20:51 +00001803 return SBAddress(new Address(addr));
1804}
1805
1806lldb::SBData
1807SBValue::GetPointeeData (uint32_t item_idx,
1808 uint32_t item_count)
1809{
Greg Clayton952e9dc2013-03-27 23:08:40 +00001810 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata91544802011-09-06 19:20:51 +00001811 lldb::SBData sb_data;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001812 lldb::ValueObjectSP value_sp(GetSP());
1813 if (value_sp)
Enrico Granata91544802011-09-06 19:20:51 +00001814 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001815 ProcessSP process_sp(value_sp->GetProcessSP());
1816 Process::StopLocker stop_locker;
1817 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granata91544802011-09-06 19:20:51 +00001818 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001819 if (log)
1820 log->Printf ("SBValue(%p)::GetPointeeData() => error: process is running", value_sp.get());
1821 }
1822 else
1823 {
1824 TargetSP target_sp (value_sp->GetTargetSP());
1825 if (target_sp)
1826 {
1827 DataExtractorSP data_sp(new DataExtractor());
1828 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1829 value_sp->GetPointeeData(*data_sp, item_idx, item_count);
1830 if (data_sp->GetByteSize() > 0)
1831 *sb_data = data_sp;
1832 }
Enrico Granata91544802011-09-06 19:20:51 +00001833 }
1834 }
Enrico Granata91544802011-09-06 19:20:51 +00001835 if (log)
1836 log->Printf ("SBValue(%p)::GetPointeeData (%d, %d) => SBData(%p)",
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001837 value_sp.get(),
Enrico Granata91544802011-09-06 19:20:51 +00001838 item_idx,
1839 item_count,
1840 sb_data.get());
1841
1842 return sb_data;
1843}
1844
1845lldb::SBData
1846SBValue::GetData ()
1847{
Greg Clayton952e9dc2013-03-27 23:08:40 +00001848 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata91544802011-09-06 19:20:51 +00001849 lldb::SBData sb_data;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001850 lldb::ValueObjectSP value_sp(GetSP());
1851 if (value_sp)
Enrico Granata91544802011-09-06 19:20:51 +00001852 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001853 ProcessSP process_sp(value_sp->GetProcessSP());
1854 Process::StopLocker stop_locker;
1855 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granata91544802011-09-06 19:20:51 +00001856 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001857 if (log)
1858 log->Printf ("SBValue(%p)::GetData() => error: process is running", value_sp.get());
1859 }
1860 else
1861 {
1862 TargetSP target_sp (value_sp->GetTargetSP());
1863 if (target_sp)
1864 {
1865 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1866 DataExtractorSP data_sp(new DataExtractor());
1867 value_sp->GetData(*data_sp);
1868 if (data_sp->GetByteSize() > 0)
1869 *sb_data = data_sp;
1870 }
Enrico Granata91544802011-09-06 19:20:51 +00001871 }
1872 }
Enrico Granata91544802011-09-06 19:20:51 +00001873 if (log)
1874 log->Printf ("SBValue(%p)::GetData () => SBData(%p)",
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001875 value_sp.get(),
Enrico Granata91544802011-09-06 19:20:51 +00001876 sb_data.get());
1877
1878 return sb_data;
1879}
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001880
Sean Callananab8e00e2013-04-13 01:21:23 +00001881bool
1882SBValue::SetData (lldb::SBData &data, SBError &error)
1883{
1884 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1885 lldb::ValueObjectSP value_sp(GetSP());
1886 bool ret = true;
1887
1888 if (value_sp)
1889 {
1890 ProcessSP process_sp(value_sp->GetProcessSP());
1891 Process::StopLocker stop_locker;
1892 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
1893 {
1894 if (log)
1895 log->Printf ("SBValue(%p)::SetData() => error: process is running", value_sp.get());
1896
1897 error.SetErrorString("Process is running");
1898 ret = false;
1899 }
1900 else
1901 {
1902 DataExtractor *data_extractor = data.get();
1903
1904 if (!data_extractor)
1905 {
1906 if (log)
1907 log->Printf ("SBValue(%p)::SetData() => error: no data to set", value_sp.get());
1908
1909 error.SetErrorString("No data to set");
1910 ret = false;
1911 }
1912 else
1913 {
1914 Error set_error;
1915
1916 value_sp->SetData(*data_extractor, set_error);
1917
1918 if (!set_error.Success())
1919 {
1920 error.SetErrorStringWithFormat("Couldn't set data: %s", set_error.AsCString());
1921 ret = false;
1922 }
1923 }
1924 }
1925 }
1926 else
1927 {
1928 error.SetErrorString("Couldn't set data: invalid SBValue");
1929 ret = false;
1930 }
1931
1932 if (log)
1933 log->Printf ("SBValue(%p)::SetData (%p) => %s",
1934 value_sp.get(),
1935 data.get(),
1936 ret ? "true" : "false");
1937 return ret;
1938}
1939
Enrico Granata49306142012-10-10 22:54:17 +00001940lldb::SBDeclaration
1941SBValue::GetDeclaration ()
1942{
1943 lldb::ValueObjectSP value_sp(GetSP());
1944 SBDeclaration decl_sb;
1945 if (value_sp)
1946 {
1947 Declaration decl;
1948 if (value_sp->GetDeclaration(decl))
1949 decl_sb.SetDeclaration(decl);
1950 }
1951 return decl_sb;
1952}
1953
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001954lldb::SBWatchpoint
Johnny Chen3f883492012-06-04 23:19:54 +00001955SBValue::Watch (bool resolve_location, bool read, bool write, SBError &error)
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001956{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001957 SBWatchpoint sb_watchpoint;
1958
1959 // If the SBValue is not valid, there's no point in even trying to watch it.
1960 lldb::ValueObjectSP value_sp(GetSP());
1961 TargetSP target_sp (GetTarget().GetSP());
1962 if (value_sp && target_sp)
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001963 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001964 // Can't watch this if the process is running
1965 ProcessSP process_sp(value_sp->GetProcessSP());
1966 Process::StopLocker stop_locker;
1967 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
1968 {
Greg Clayton952e9dc2013-03-27 23:08:40 +00001969 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001970 if (log)
1971 log->Printf ("SBValue(%p)::Watch() => error: process is running", value_sp.get());
1972 return sb_watchpoint;
1973 }
1974
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001975 // Read and Write cannot both be false.
1976 if (!read && !write)
1977 return sb_watchpoint;
1978
1979 // If the value is not in scope, don't try and watch and invalid value
1980 if (!IsInScope())
1981 return sb_watchpoint;
1982
1983 addr_t addr = GetLoadAddress();
1984 if (addr == LLDB_INVALID_ADDRESS)
1985 return sb_watchpoint;
1986 size_t byte_size = GetByteSize();
1987 if (byte_size == 0)
1988 return sb_watchpoint;
1989
1990 uint32_t watch_type = 0;
1991 if (read)
1992 watch_type |= LLDB_WATCH_TYPE_READ;
1993 if (write)
1994 watch_type |= LLDB_WATCH_TYPE_WRITE;
1995
Johnny Chen3f883492012-06-04 23:19:54 +00001996 Error rc;
Jim Ingham9e376622012-10-23 07:20:06 +00001997 ClangASTType type (value_sp->GetClangAST(), value_sp->GetClangType());
1998 WatchpointSP watchpoint_sp = target_sp->CreateWatchpoint(addr, byte_size, &type, watch_type, rc);
Johnny Chen3f883492012-06-04 23:19:54 +00001999 error.SetError(rc);
Greg Clayton0a19a1b2012-02-04 02:27:34 +00002000
2001 if (watchpoint_sp)
2002 {
2003 sb_watchpoint.SetSP (watchpoint_sp);
2004 Declaration decl;
2005 if (value_sp->GetDeclaration (decl))
2006 {
2007 if (decl.GetFile())
2008 {
2009 StreamString ss;
2010 // True to show fullpath for declaration file.
2011 decl.DumpStopContext(&ss, true);
2012 watchpoint_sp->SetDeclInfo(ss.GetString());
2013 }
2014 }
2015 }
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00002016 }
2017 return sb_watchpoint;
2018}
2019
Johnny Chen8a5ce772012-06-04 23:45:50 +00002020// FIXME: Remove this method impl (as well as the decl in .h) once it is no longer needed.
2021// Backward compatibility fix in the interim.
2022lldb::SBWatchpoint
2023SBValue::Watch (bool resolve_location, bool read, bool write)
2024{
Johnny Chen9c4a3442012-06-05 00:14:15 +00002025 SBError error;
2026 return Watch(resolve_location, read, write, error);
Johnny Chen8a5ce772012-06-04 23:45:50 +00002027}
2028
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00002029lldb::SBWatchpoint
Johnny Chen3f883492012-06-04 23:19:54 +00002030SBValue::WatchPointee (bool resolve_location, bool read, bool write, SBError &error)
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00002031{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00002032 SBWatchpoint sb_watchpoint;
2033 if (IsInScope() && GetType().IsPointerType())
Johnny Chen3f883492012-06-04 23:19:54 +00002034 sb_watchpoint = Dereference().Watch (resolve_location, read, write, error);
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00002035 return sb_watchpoint;
2036}