blob: 435dcff7a3e55d147c83801bbe26e6c395f72c53 [file] [log] [blame]
Chris Lattner30fdc8d2010-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 Malea93a64302012-12-05 00:20:57 +000010#include "lldb/lldb-python.h"
11
Eli Friedman4c5de692010-06-09 07:44:37 +000012#include "lldb/API/SBValue.h"
Enrico Granata864e3e82012-02-17 03:18:30 +000013
Enrico Granata10de0902012-10-10 22:54:17 +000014#include "lldb/API/SBDeclaration.h"
Caroline Ticedde9cff2010-09-20 05:20:02 +000015#include "lldb/API/SBStream.h"
Enrico Granata864e3e82012-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 Lattner30fdc8d2010-06-08 16:52:24 +000020
Johnny Chen01a67862011-10-14 00:42:25 +000021#include "lldb/Breakpoint/Watchpoint.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000022#include "lldb/Core/DataExtractor.h"
Caroline Ticeceb6b132010-10-26 03:11:13 +000023#include "lldb/Core/Log.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000024#include "lldb/Core/Module.h"
Greg Claytonfe42ac42011-08-03 22:57:10 +000025#include "lldb/Core/Scalar.h"
Greg Clayton1f746072012-08-29 21:13:06 +000026#include "lldb/Core/Section.h"
Chris Lattner30fdc8d2010-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 Granata6f3533f2011-07-29 19:53:35 +000031#include "lldb/Core/ValueObjectConstResult.h"
Enrico Granata5548cb52013-01-28 23:47:25 +000032#include "lldb/DataFormatters/DataVisualization.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000033#include "lldb/Symbol/Block.h"
Enrico Granata10de0902012-10-10 22:54:17 +000034#include "lldb/Symbol/Declaration.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000035#include "lldb/Symbol/ObjectFile.h"
Greg Clayton81e871e2012-02-04 02:27:34 +000036#include "lldb/Symbol/Type.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000037#include "lldb/Symbol/Variable.h"
Johnny Chen01a67862011-10-14 00:42:25 +000038#include "lldb/Symbol/VariableList.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000039#include "lldb/Target/ExecutionContext.h"
40#include "lldb/Target/Process.h"
41#include "lldb/Target/StackFrame.h"
Greg Claytonaf67cec2010-12-20 20:49:23 +000042#include "lldb/Target/Target.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000043#include "lldb/Target/Thread.h"
44
Jim Ingham35e1bda2012-10-16 21:41:58 +000045#include "lldb/API/SBDebugger.h"
46#include "lldb/API/SBExpressionOptions.h"
47#include "lldb/API/SBFrame.h"
Eli Friedman4c5de692010-06-09 07:44:37 +000048#include "lldb/API/SBProcess.h"
49#include "lldb/API/SBTarget.h"
50#include "lldb/API/SBThread.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000051
52using namespace lldb;
53using namespace lldb_private;
54
Enrico Granatae3e91512012-10-22 18:18:36 +000055namespace {
56 class ValueImpl
57 {
58 public:
59 ValueImpl ()
60 {
61 }
62
63 ValueImpl (lldb::ValueObjectSP opaque_sp,
64 lldb::DynamicValueType use_dynamic,
65 bool use_synthetic) :
66 m_opaque_sp(opaque_sp),
67 m_use_dynamic(use_dynamic),
68 m_use_synthetic(use_synthetic)
69 {
70 }
71
72 ValueImpl (const ValueImpl& rhs) :
73 m_opaque_sp(rhs.m_opaque_sp),
74 m_use_dynamic(rhs.m_use_dynamic),
75 m_use_synthetic(rhs.m_use_synthetic)
76 {
77 }
78
79 ValueImpl &
80 operator = (const ValueImpl &rhs)
81 {
82 if (this != &rhs)
83 {
84 m_opaque_sp = rhs.m_opaque_sp;
85 m_use_dynamic = rhs.m_use_dynamic;
86 m_use_synthetic = rhs.m_use_synthetic;
87 }
88 return *this;
89 }
90
91 bool
92 IsValid ()
93 {
94 return m_opaque_sp.get() != NULL;
95 }
96
97 lldb::ValueObjectSP
98 GetRootSP ()
99 {
100 return m_opaque_sp;
101 }
102
103 lldb::ValueObjectSP
104 GetSP ()
105 {
106 if (!m_opaque_sp)
107 return m_opaque_sp;
108 lldb::ValueObjectSP value_sp = m_opaque_sp;
Jim Inghamfce1dad2013-04-04 02:23:41 +0000109
110 Mutex::Locker api_lock;
111 Target *target = value_sp->GetTargetSP().get();
112 if (target)
113 api_lock.Lock(target->GetAPIMutex());
114
Enrico Granatae3e91512012-10-22 18:18:36 +0000115 if (value_sp->GetDynamicValue(m_use_dynamic))
116 value_sp = value_sp->GetDynamicValue(m_use_dynamic);
117 if (value_sp->GetSyntheticValue(m_use_synthetic))
118 value_sp = value_sp->GetSyntheticValue(m_use_synthetic);
119 return value_sp;
120 }
121
122 void
123 SetUseDynamic (lldb::DynamicValueType use_dynamic)
124 {
125 m_use_dynamic = use_dynamic;
126 }
127
128 void
129 SetUseSynthetic (bool use_synthetic)
130 {
131 m_use_synthetic = use_synthetic;
132 }
133
134 lldb::DynamicValueType
135 GetUseDynamic ()
136 {
137 return m_use_dynamic;
138 }
139
140 bool
141 GetUseSynthetic ()
142 {
143 return m_use_synthetic;
144 }
145
146 private:
147 lldb::ValueObjectSP m_opaque_sp;
148 lldb::DynamicValueType m_use_dynamic;
149 bool m_use_synthetic;
150 };
151}
152
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000153SBValue::SBValue () :
Greg Clayton66111032010-06-23 01:19:29 +0000154 m_opaque_sp ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000155{
156}
157
Enrico Granatac5bc4122012-03-27 02:35:13 +0000158SBValue::SBValue (const lldb::ValueObjectSP &value_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000159{
Enrico Granatae3e91512012-10-22 18:18:36 +0000160 SetSP(value_sp);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000161}
162
Enrico Granatac5bc4122012-03-27 02:35:13 +0000163SBValue::SBValue(const SBValue &rhs)
Greg Claytonefabb122010-11-05 23:17:00 +0000164{
Enrico Granatae3e91512012-10-22 18:18:36 +0000165 SetSP(rhs.m_opaque_sp);
Greg Claytonefabb122010-11-05 23:17:00 +0000166}
167
Greg Claytonbf2331c2011-09-09 23:04:00 +0000168SBValue &
Greg Claytonefabb122010-11-05 23:17:00 +0000169SBValue::operator = (const SBValue &rhs)
170{
171 if (this != &rhs)
Enrico Granatac5bc4122012-03-27 02:35:13 +0000172 {
Enrico Granatae3e91512012-10-22 18:18:36 +0000173 SetSP(rhs.m_opaque_sp);
Enrico Granatac5bc4122012-03-27 02:35:13 +0000174 }
Greg Claytonefabb122010-11-05 23:17:00 +0000175 return *this;
176}
177
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000178SBValue::~SBValue()
179{
180}
181
182bool
Greg Claytonbf2331c2011-09-09 23:04:00 +0000183SBValue::IsValid ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000184{
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000185 // If this function ever changes to anything that does more than just
186 // check if the opaque shared pointer is non NULL, then we need to update
187 // all "if (m_opaque_sp)" code in this file.
Enrico Granatae3e91512012-10-22 18:18:36 +0000188 return m_opaque_sp.get() != NULL && m_opaque_sp->GetRootSP().get() != NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000189}
190
Jim Ingham5d3bca42011-12-19 20:39:44 +0000191void
192SBValue::Clear()
193{
194 m_opaque_sp.reset();
195}
196
Greg Clayton524e60b2010-10-06 22:10:17 +0000197SBError
198SBValue::GetError()
199{
200 SBError sb_error;
201
Greg Clayton81e871e2012-02-04 02:27:34 +0000202 lldb::ValueObjectSP value_sp(GetSP());
203 if (value_sp)
204 sb_error.SetError(value_sp->GetError());
Greg Claytonb9556ac2012-01-30 07:41:31 +0000205 else
206 sb_error.SetErrorString("error: invalid value");
Greg Clayton524e60b2010-10-06 22:10:17 +0000207
208 return sb_error;
209}
210
Johnny Chenb0b8be72011-07-07 20:46:23 +0000211user_id_t
212SBValue::GetID()
213{
Greg Clayton81e871e2012-02-04 02:27:34 +0000214 lldb::ValueObjectSP value_sp(GetSP());
215 if (value_sp)
216 return value_sp->GetID();
Johnny Chenb0b8be72011-07-07 20:46:23 +0000217 return LLDB_INVALID_UID;
218}
219
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000220const char *
221SBValue::GetName()
222{
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000223
224 const char *name = NULL;
Greg Clayton81e871e2012-02-04 02:27:34 +0000225 lldb::ValueObjectSP value_sp(GetSP());
226 if (value_sp)
227 name = value_sp->GetName().GetCString();
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000228
Greg Clayton5160ce52013-03-27 23:08:40 +0000229 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton93aa84e2010-10-29 04:59:35 +0000230 if (log)
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000231 {
232 if (name)
Greg Clayton81e871e2012-02-04 02:27:34 +0000233 log->Printf ("SBValue(%p)::GetName () => \"%s\"", value_sp.get(), name);
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000234 else
Greg Clayton81e871e2012-02-04 02:27:34 +0000235 log->Printf ("SBValue(%p)::GetName () => NULL", value_sp.get());
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000236 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000237
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000238 return name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000239}
240
241const char *
242SBValue::GetTypeName ()
243{
Greg Clayton5160ce52013-03-27 23:08:40 +0000244 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000245 const char *name = NULL;
Greg Clayton81e871e2012-02-04 02:27:34 +0000246 lldb::ValueObjectSP value_sp(GetSP());
247 if (value_sp)
Jim Ingham48cdc582012-08-21 01:46:35 +0000248 {
249 // For a dynamic type we might have to run code to determine the type we are going to report,
250 // and we might not have updated the type before we get asked this. So make sure to get the API lock.
251
252 ProcessSP process_sp(value_sp->GetProcessSP());
253 Process::StopLocker stop_locker;
254 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
255 {
256 if (log)
257 log->Printf ("SBValue(%p)::GetTypeName() => error: process is running", value_sp.get());
258 }
259 else
260 {
261 TargetSP target_sp(value_sp->GetTargetSP());
262 if (target_sp)
263 {
264 Mutex::Locker api_locker (target_sp->GetAPIMutex());
265 name = value_sp->GetQualifiedTypeName().GetCString();
266 }
267 }
268 }
269
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000270 if (log)
271 {
272 if (name)
Greg Clayton81e871e2012-02-04 02:27:34 +0000273 log->Printf ("SBValue(%p)::GetTypeName () => \"%s\"", value_sp.get(), name);
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000274 else
Greg Clayton81e871e2012-02-04 02:27:34 +0000275 log->Printf ("SBValue(%p)::GetTypeName () => NULL", value_sp.get());
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000276 }
277
278 return name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000279}
280
281size_t
282SBValue::GetByteSize ()
283{
Greg Clayton5160ce52013-03-27 23:08:40 +0000284 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000285 size_t result = 0;
286
Greg Clayton81e871e2012-02-04 02:27:34 +0000287 lldb::ValueObjectSP value_sp(GetSP());
288 if (value_sp)
Jim Ingham48cdc582012-08-21 01:46:35 +0000289 {
290 // For a dynamic type we might have to run code to determine the type we are going to report,
291 // and we might not have updated the type before we get asked this. So make sure to get the API lock.
292
293 ProcessSP process_sp(value_sp->GetProcessSP());
294 Process::StopLocker stop_locker;
295 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
296 {
297 if (log)
298 log->Printf ("SBValue(%p)::GetTypeName() => error: process is running", value_sp.get());
299 }
300 else
301 {
302 TargetSP target_sp(value_sp->GetTargetSP());
303 if (target_sp)
304 {
305 Mutex::Locker api_locker (target_sp->GetAPIMutex());
306 result = value_sp->GetByteSize();
307 }
308 }
309 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000310
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000311 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000312 log->Printf ("SBValue(%p)::GetByteSize () => %" PRIu64, value_sp.get(), (uint64_t)result);
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000313
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000314 return result;
315}
316
317bool
Jim Ingham6035b672011-03-31 00:19:25 +0000318SBValue::IsInScope ()
319{
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000320 bool result = false;
321
Greg Clayton81e871e2012-02-04 02:27:34 +0000322 lldb::ValueObjectSP value_sp(GetSP());
323 if (value_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000324 {
Greg Claytoncc4d0142012-02-17 07:49:44 +0000325 TargetSP target_sp(value_sp->GetTargetSP());
Greg Clayton81e871e2012-02-04 02:27:34 +0000326 if (target_sp)
Greg Clayton626f4a12011-06-29 18:28:50 +0000327 {
Greg Claytoncc4d0142012-02-17 07:49:44 +0000328 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Clayton81e871e2012-02-04 02:27:34 +0000329 result = value_sp->IsInScope ();
Greg Clayton626f4a12011-06-29 18:28:50 +0000330 }
Greg Claytonaf67cec2010-12-20 20:49:23 +0000331 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000332
Greg Clayton5160ce52013-03-27 23:08:40 +0000333 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000334 if (log)
Greg Clayton81e871e2012-02-04 02:27:34 +0000335 log->Printf ("SBValue(%p)::IsInScope () => %i", value_sp.get(), result);
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000336
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000337 return result;
338}
339
340const char *
Jim Ingham6035b672011-03-31 00:19:25 +0000341SBValue::GetValue ()
342{
Greg Clayton5160ce52013-03-27 23:08:40 +0000343 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +0000344
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000345 const char *cstr = NULL;
Greg Clayton81e871e2012-02-04 02:27:34 +0000346 lldb::ValueObjectSP value_sp(GetSP());
347 if (value_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000348 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000349 ProcessSP process_sp(value_sp->GetProcessSP());
350 Process::StopLocker stop_locker;
351 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Clayton626f4a12011-06-29 18:28:50 +0000352 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000353 if (log)
354 log->Printf ("SBValue(%p)::GetValue() => error: process is running", value_sp.get());
355 }
356 else
357 {
358 TargetSP target_sp(value_sp->GetTargetSP());
359 if (target_sp)
360 {
361 Mutex::Locker api_locker (target_sp->GetAPIMutex());
362 cstr = value_sp->GetValueAsCString ();
363 }
Greg Clayton626f4a12011-06-29 18:28:50 +0000364 }
Greg Claytonaf67cec2010-12-20 20:49:23 +0000365 }
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000366 if (log)
367 {
368 if (cstr)
Greg Claytonc9858e42012-04-06 02:17:47 +0000369 log->Printf ("SBValue(%p)::GetValue() => \"%s\"", value_sp.get(), cstr);
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000370 else
Greg Claytonc9858e42012-04-06 02:17:47 +0000371 log->Printf ("SBValue(%p)::GetValue() => NULL", value_sp.get());
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000372 }
373
374 return cstr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000375}
376
Greg Clayton73b472d2010-10-27 03:32:59 +0000377ValueType
378SBValue::GetValueType ()
379{
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000380 ValueType result = eValueTypeInvalid;
Greg Clayton81e871e2012-02-04 02:27:34 +0000381 lldb::ValueObjectSP value_sp(GetSP());
382 if (value_sp)
383 result = value_sp->GetValueType();
Greg Clayton5160ce52013-03-27 23:08:40 +0000384 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000385 if (log)
386 {
387 switch (result)
388 {
Greg Clayton81e871e2012-02-04 02:27:34 +0000389 case eValueTypeInvalid: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeInvalid", value_sp.get()); break;
390 case eValueTypeVariableGlobal: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableGlobal", value_sp.get()); break;
391 case eValueTypeVariableStatic: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableStatic", value_sp.get()); break;
392 case eValueTypeVariableArgument:log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableArgument", value_sp.get()); break;
393 case eValueTypeVariableLocal: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableLocal", value_sp.get()); break;
394 case eValueTypeRegister: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeRegister", value_sp.get()); break;
395 case eValueTypeRegisterSet: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeRegisterSet", value_sp.get()); break;
396 case eValueTypeConstResult: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeConstResult", value_sp.get()); break;
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000397 }
398 }
399 return result;
Greg Clayton73b472d2010-10-27 03:32:59 +0000400}
401
Jim Ingham53c47f12010-09-10 23:12:17 +0000402const char *
Jim Ingham6035b672011-03-31 00:19:25 +0000403SBValue::GetObjectDescription ()
404{
Greg Clayton5160ce52013-03-27 23:08:40 +0000405 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000406 const char *cstr = NULL;
Greg Clayton81e871e2012-02-04 02:27:34 +0000407 lldb::ValueObjectSP value_sp(GetSP());
408 if (value_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000409 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000410 ProcessSP process_sp(value_sp->GetProcessSP());
411 Process::StopLocker stop_locker;
412 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Clayton626f4a12011-06-29 18:28:50 +0000413 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000414 if (log)
415 log->Printf ("SBValue(%p)::GetObjectDescription() => error: process is running", value_sp.get());
416 }
417 else
418 {
419 TargetSP target_sp(value_sp->GetTargetSP());
420 if (target_sp)
421 {
422 Mutex::Locker api_locker (target_sp->GetAPIMutex());
423 cstr = value_sp->GetObjectDescription ();
424 }
Greg Clayton626f4a12011-06-29 18:28:50 +0000425 }
Greg Claytonaf67cec2010-12-20 20:49:23 +0000426 }
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000427 if (log)
428 {
429 if (cstr)
Greg Claytonc9858e42012-04-06 02:17:47 +0000430 log->Printf ("SBValue(%p)::GetObjectDescription() => \"%s\"", value_sp.get(), cstr);
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000431 else
Greg Claytonc9858e42012-04-06 02:17:47 +0000432 log->Printf ("SBValue(%p)::GetObjectDescription() => NULL", value_sp.get());
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000433 }
434 return cstr;
Jim Ingham53c47f12010-09-10 23:12:17 +0000435}
436
Enrico Granata6f3533f2011-07-29 19:53:35 +0000437SBType
438SBValue::GetType()
439{
Greg Clayton5160ce52013-03-27 23:08:40 +0000440 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton81e871e2012-02-04 02:27:34 +0000441 SBType sb_type;
442 lldb::ValueObjectSP value_sp(GetSP());
443 TypeImplSP type_sp;
444 if (value_sp)
Enrico Granata6f3533f2011-07-29 19:53:35 +0000445 {
Jim Inghamcbbdaa92012-04-13 18:30:20 +0000446 ProcessSP process_sp(value_sp->GetProcessSP());
447 Process::StopLocker stop_locker;
448 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
449 {
450 if (log)
Greg Claytoneac87f82012-06-04 20:13:23 +0000451 log->Printf ("SBValue(%p)::GetType() => error: process is running", value_sp.get());
Jim Inghamcbbdaa92012-04-13 18:30:20 +0000452 }
453 else
454 {
455 TargetSP target_sp(value_sp->GetTargetSP());
456 if (target_sp)
457 {
458 Mutex::Locker api_locker (target_sp->GetAPIMutex());
459 type_sp.reset (new TypeImpl(ClangASTType (value_sp->GetClangAST(), value_sp->GetClangType())));
460 sb_type.SetSP(type_sp);
461 }
462 }
Enrico Granata6f3533f2011-07-29 19:53:35 +0000463 }
Enrico Granata6f3533f2011-07-29 19:53:35 +0000464 if (log)
465 {
Greg Clayton81e871e2012-02-04 02:27:34 +0000466 if (type_sp)
467 log->Printf ("SBValue(%p)::GetType => SBType(%p)", value_sp.get(), type_sp.get());
Enrico Granata6f3533f2011-07-29 19:53:35 +0000468 else
Greg Clayton81e871e2012-02-04 02:27:34 +0000469 log->Printf ("SBValue(%p)::GetType => NULL", value_sp.get());
Enrico Granata6f3533f2011-07-29 19:53:35 +0000470 }
Greg Clayton81e871e2012-02-04 02:27:34 +0000471 return sb_type;
Enrico Granata6f3533f2011-07-29 19:53:35 +0000472}
473
Jim Ingham6035b672011-03-31 00:19:25 +0000474bool
475SBValue::GetValueDidChange ()
476{
Greg Clayton5160ce52013-03-27 23:08:40 +0000477 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000478 bool result = false;
Greg Clayton81e871e2012-02-04 02:27:34 +0000479 lldb::ValueObjectSP value_sp(GetSP());
480 if (value_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000481 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000482 ProcessSP process_sp(value_sp->GetProcessSP());
483 Process::StopLocker stop_locker;
484 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Clayton626f4a12011-06-29 18:28:50 +0000485 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000486 if (log)
487 log->Printf ("SBValue(%p)::GetValueDidChange() => error: process is running", value_sp.get());
488 }
489 else
490 {
491 TargetSP target_sp(value_sp->GetTargetSP());
492 if (target_sp)
493 {
494 Mutex::Locker api_locker (target_sp->GetAPIMutex());
495 result = value_sp->GetValueDidChange ();
496 }
Greg Clayton626f4a12011-06-29 18:28:50 +0000497 }
Greg Claytonaf67cec2010-12-20 20:49:23 +0000498 }
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000499 if (log)
Greg Claytonc9858e42012-04-06 02:17:47 +0000500 log->Printf ("SBValue(%p)::GetValueDidChange() => %i", value_sp.get(), result);
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000501
502 return result;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000503}
504
Jason Molendacf7e2dc2012-02-21 05:33:55 +0000505#ifndef LLDB_DISABLE_PYTHON
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000506const char *
Jim Ingham6035b672011-03-31 00:19:25 +0000507SBValue::GetSummary ()
508{
Greg Clayton5160ce52013-03-27 23:08:40 +0000509 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000510 const char *cstr = NULL;
Greg Clayton81e871e2012-02-04 02:27:34 +0000511 lldb::ValueObjectSP value_sp(GetSP());
512 if (value_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000513 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000514 ProcessSP process_sp(value_sp->GetProcessSP());
515 Process::StopLocker stop_locker;
516 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Clayton626f4a12011-06-29 18:28:50 +0000517 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000518 if (log)
519 log->Printf ("SBValue(%p)::GetSummary() => error: process is running", value_sp.get());
520 }
521 else
522 {
523 TargetSP target_sp(value_sp->GetTargetSP());
524 if (target_sp)
525 {
526 Mutex::Locker api_locker (target_sp->GetAPIMutex());
527 cstr = value_sp->GetSummaryAsCString();
528 }
Greg Clayton626f4a12011-06-29 18:28:50 +0000529 }
Greg Claytonaf67cec2010-12-20 20:49:23 +0000530 }
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000531 if (log)
532 {
533 if (cstr)
Greg Claytonc9858e42012-04-06 02:17:47 +0000534 log->Printf ("SBValue(%p)::GetSummary() => \"%s\"", value_sp.get(), cstr);
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000535 else
Greg Claytonc9858e42012-04-06 02:17:47 +0000536 log->Printf ("SBValue(%p)::GetSummary() => NULL", value_sp.get());
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000537 }
538 return cstr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000539}
Jason Molendacf7e2dc2012-02-21 05:33:55 +0000540#endif // LLDB_DISABLE_PYTHON
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000541
542const char *
Jim Ingham6035b672011-03-31 00:19:25 +0000543SBValue::GetLocation ()
544{
Greg Clayton5160ce52013-03-27 23:08:40 +0000545 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000546 const char *cstr = NULL;
Greg Clayton81e871e2012-02-04 02:27:34 +0000547 lldb::ValueObjectSP value_sp(GetSP());
548 if (value_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000549 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000550 ProcessSP process_sp(value_sp->GetProcessSP());
551 Process::StopLocker stop_locker;
552 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Clayton626f4a12011-06-29 18:28:50 +0000553 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000554 if (log)
555 log->Printf ("SBValue(%p)::GetLocation() => error: process is running", value_sp.get());
556 }
557 else
558 {
559 TargetSP target_sp(value_sp->GetTargetSP());
560 if (target_sp)
561 {
562 Mutex::Locker api_locker (target_sp->GetAPIMutex());
563 cstr = value_sp->GetLocationAsCString();
564 }
Greg Clayton626f4a12011-06-29 18:28:50 +0000565 }
Greg Claytonaf67cec2010-12-20 20:49:23 +0000566 }
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000567 if (log)
568 {
569 if (cstr)
Greg Claytonc9858e42012-04-06 02:17:47 +0000570 log->Printf ("SBValue(%p)::GetLocation() => \"%s\"", value_sp.get(), cstr);
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000571 else
Greg Claytonc9858e42012-04-06 02:17:47 +0000572 log->Printf ("SBValue(%p)::GetLocation() => NULL", value_sp.get());
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000573 }
574 return cstr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000575}
576
Enrico Granata07a4ac22012-05-08 21:25:06 +0000577// Deprecated - use the one that takes an lldb::SBError
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000578bool
Jim Ingham6035b672011-03-31 00:19:25 +0000579SBValue::SetValueFromCString (const char *value_str)
580{
Enrico Granata07a4ac22012-05-08 21:25:06 +0000581 lldb::SBError dummy;
582 return SetValueFromCString(value_str,dummy);
583}
584
585bool
586SBValue::SetValueFromCString (const char *value_str, lldb::SBError& error)
587{
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000588 bool success = false;
Greg Clayton81e871e2012-02-04 02:27:34 +0000589 lldb::ValueObjectSP value_sp(GetSP());
Greg Clayton5160ce52013-03-27 23:08:40 +0000590 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton81e871e2012-02-04 02:27:34 +0000591 if (value_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000592 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000593 ProcessSP process_sp(value_sp->GetProcessSP());
594 Process::StopLocker stop_locker;
595 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Clayton626f4a12011-06-29 18:28:50 +0000596 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000597 if (log)
598 log->Printf ("SBValue(%p)::SetValueFromCString() => error: process is running", value_sp.get());
599 }
600 else
601 {
602 TargetSP target_sp(value_sp->GetTargetSP());
603 if (target_sp)
604 {
605 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Enrico Granata07a4ac22012-05-08 21:25:06 +0000606 success = value_sp->SetValueFromCString (value_str,error.ref());
Greg Claytonc9858e42012-04-06 02:17:47 +0000607 }
Greg Clayton626f4a12011-06-29 18:28:50 +0000608 }
Greg Claytonaf67cec2010-12-20 20:49:23 +0000609 }
Greg Claytonc9858e42012-04-06 02:17:47 +0000610 if (log)
611 log->Printf ("SBValue(%p)::SetValueFromCString(\"%s\") => %i", value_sp.get(), value_str, success);
612
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000613 return success;
614}
615
Enrico Granata864e3e82012-02-17 03:18:30 +0000616lldb::SBTypeFormat
617SBValue::GetTypeFormat ()
618{
619 lldb::SBTypeFormat format;
620 lldb::ValueObjectSP value_sp(GetSP());
621 if (value_sp)
622 {
Jim Inghamcbbdaa92012-04-13 18:30:20 +0000623 ProcessSP process_sp(value_sp->GetProcessSP());
624 Process::StopLocker stop_locker;
625 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granata864e3e82012-02-17 03:18:30 +0000626 {
Greg Clayton5160ce52013-03-27 23:08:40 +0000627 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Jim Inghamcbbdaa92012-04-13 18:30:20 +0000628 if (log)
Greg Claytoneac87f82012-06-04 20:13:23 +0000629 log->Printf ("SBValue(%p)::GetTypeFormat() => error: process is running", value_sp.get());
Jim Inghamcbbdaa92012-04-13 18:30:20 +0000630 }
631 else
632 {
633 TargetSP target_sp(value_sp->GetTargetSP());
634 if (target_sp)
Greg Claytoncc4d0142012-02-17 07:49:44 +0000635 {
Jim Inghamcbbdaa92012-04-13 18:30:20 +0000636 Mutex::Locker api_locker (target_sp->GetAPIMutex());
637 if (value_sp->UpdateValueIfNeeded(true))
638 {
639 lldb::TypeFormatImplSP format_sp = value_sp->GetValueFormat();
640 if (format_sp)
641 format.SetSP(format_sp);
642 }
Greg Claytoncc4d0142012-02-17 07:49:44 +0000643 }
Enrico Granata864e3e82012-02-17 03:18:30 +0000644 }
645 }
646 return format;
647}
648
Jason Molendacf7e2dc2012-02-21 05:33:55 +0000649#ifndef LLDB_DISABLE_PYTHON
Enrico Granata864e3e82012-02-17 03:18:30 +0000650lldb::SBTypeSummary
651SBValue::GetTypeSummary ()
652{
653 lldb::SBTypeSummary summary;
654 lldb::ValueObjectSP value_sp(GetSP());
655 if (value_sp)
656 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000657 ProcessSP process_sp(value_sp->GetProcessSP());
658 Process::StopLocker stop_locker;
659 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granata864e3e82012-02-17 03:18:30 +0000660 {
Greg Clayton5160ce52013-03-27 23:08:40 +0000661 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +0000662 if (log)
663 log->Printf ("SBValue(%p)::GetTypeSummary() => error: process is running", value_sp.get());
664 }
665 else
666 {
667 TargetSP target_sp(value_sp->GetTargetSP());
668 if (target_sp)
Greg Claytoncc4d0142012-02-17 07:49:44 +0000669 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000670 Mutex::Locker api_locker (target_sp->GetAPIMutex());
671 if (value_sp->UpdateValueIfNeeded(true))
672 {
673 lldb::TypeSummaryImplSP summary_sp = value_sp->GetSummaryFormat();
674 if (summary_sp)
675 summary.SetSP(summary_sp);
676 }
Greg Claytoncc4d0142012-02-17 07:49:44 +0000677 }
Enrico Granata864e3e82012-02-17 03:18:30 +0000678 }
679 }
680 return summary;
681}
Jason Molendacf7e2dc2012-02-21 05:33:55 +0000682#endif // LLDB_DISABLE_PYTHON
Enrico Granata864e3e82012-02-17 03:18:30 +0000683
684lldb::SBTypeFilter
685SBValue::GetTypeFilter ()
686{
687 lldb::SBTypeFilter filter;
688 lldb::ValueObjectSP value_sp(GetSP());
689 if (value_sp)
690 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000691 ProcessSP process_sp(value_sp->GetProcessSP());
692 Process::StopLocker stop_locker;
693 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granata864e3e82012-02-17 03:18:30 +0000694 {
Greg Clayton5160ce52013-03-27 23:08:40 +0000695 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +0000696 if (log)
697 log->Printf ("SBValue(%p)::GetTypeFilter() => error: process is running", value_sp.get());
698 }
699 else
700 {
701 TargetSP target_sp(value_sp->GetTargetSP());
702 if (target_sp)
Enrico Granata864e3e82012-02-17 03:18:30 +0000703 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000704 Mutex::Locker api_locker (target_sp->GetAPIMutex());
705 if (value_sp->UpdateValueIfNeeded(true))
Greg Claytoncc4d0142012-02-17 07:49:44 +0000706 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000707 lldb::SyntheticChildrenSP synthetic_sp = value_sp->GetSyntheticChildren();
708
709 if (synthetic_sp && !synthetic_sp->IsScripted())
710 {
Greg Clayton7b0992d2013-04-18 22:45:39 +0000711 TypeFilterImplSP filter_sp = std::static_pointer_cast<TypeFilterImpl>(synthetic_sp);
Greg Claytonc9858e42012-04-06 02:17:47 +0000712 filter.SetSP(filter_sp);
713 }
Greg Claytoncc4d0142012-02-17 07:49:44 +0000714 }
Enrico Granata864e3e82012-02-17 03:18:30 +0000715 }
716 }
717 }
718 return filter;
719}
720
Jason Molendacf7e2dc2012-02-21 05:33:55 +0000721#ifndef LLDB_DISABLE_PYTHON
Enrico Granata864e3e82012-02-17 03:18:30 +0000722lldb::SBTypeSynthetic
723SBValue::GetTypeSynthetic ()
724{
725 lldb::SBTypeSynthetic synthetic;
726 lldb::ValueObjectSP value_sp(GetSP());
727 if (value_sp)
728 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000729 ProcessSP process_sp(value_sp->GetProcessSP());
730 Process::StopLocker stop_locker;
731 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granata864e3e82012-02-17 03:18:30 +0000732 {
Greg Clayton5160ce52013-03-27 23:08:40 +0000733 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +0000734 if (log)
735 log->Printf ("SBValue(%p)::GetTypeSynthetic() => error: process is running", value_sp.get());
736 }
737 else
738 {
739 TargetSP target_sp(value_sp->GetTargetSP());
740 if (target_sp)
Enrico Granata864e3e82012-02-17 03:18:30 +0000741 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000742 Mutex::Locker api_locker (target_sp->GetAPIMutex());
743 if (value_sp->UpdateValueIfNeeded(true))
Greg Claytoncc4d0142012-02-17 07:49:44 +0000744 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000745 lldb::SyntheticChildrenSP children_sp = value_sp->GetSyntheticChildren();
746
747 if (children_sp && children_sp->IsScripted())
748 {
Greg Clayton7b0992d2013-04-18 22:45:39 +0000749 ScriptedSyntheticChildrenSP synth_sp = std::static_pointer_cast<ScriptedSyntheticChildren>(children_sp);
Greg Claytonc9858e42012-04-06 02:17:47 +0000750 synthetic.SetSP(synth_sp);
751 }
Greg Claytoncc4d0142012-02-17 07:49:44 +0000752 }
Enrico Granata864e3e82012-02-17 03:18:30 +0000753 }
754 }
755 }
756 return synthetic;
757}
Jason Molendacf7e2dc2012-02-21 05:33:55 +0000758#endif
Enrico Granata864e3e82012-02-17 03:18:30 +0000759
Enrico Granata6f3533f2011-07-29 19:53:35 +0000760lldb::SBValue
Greg Claytonbf2331c2011-09-09 23:04:00 +0000761SBValue::CreateChildAtOffset (const char *name, uint32_t offset, SBType type)
Enrico Granata6f3533f2011-07-29 19:53:35 +0000762{
Greg Clayton81e871e2012-02-04 02:27:34 +0000763 lldb::SBValue sb_value;
764 lldb::ValueObjectSP value_sp(GetSP());
765 lldb::ValueObjectSP new_value_sp;
766 if (value_sp)
Enrico Granata6f3533f2011-07-29 19:53:35 +0000767 {
Jim Inghamcbbdaa92012-04-13 18:30:20 +0000768 ProcessSP process_sp(value_sp->GetProcessSP());
769 Process::StopLocker stop_locker;
770 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granata6f3533f2011-07-29 19:53:35 +0000771 {
Greg Clayton5160ce52013-03-27 23:08:40 +0000772 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Jim Inghamcbbdaa92012-04-13 18:30:20 +0000773 if (log)
Greg Claytoneac87f82012-06-04 20:13:23 +0000774 log->Printf ("SBValue(%p)::CreateChildAtOffset() => error: process is running", value_sp.get());
Jim Inghamcbbdaa92012-04-13 18:30:20 +0000775 }
776 else
777 {
778 TargetSP target_sp(value_sp->GetTargetSP());
779 if (target_sp)
780 {
781 Mutex::Locker api_locker (target_sp->GetAPIMutex());
782 TypeImplSP type_sp (type.GetSP());
783 if (type.IsValid())
784 {
Enrico Granatae3e91512012-10-22 18:18:36 +0000785 sb_value.SetSP(value_sp->GetSyntheticChildAtOffset(offset, type_sp->GetClangASTType(), true),GetPreferDynamicValue(),GetPreferSyntheticValue());
Jim Inghamcbbdaa92012-04-13 18:30:20 +0000786 new_value_sp = sb_value.GetSP();
787 if (new_value_sp)
788 new_value_sp->SetName(ConstString(name));
789 }
790 }
Enrico Granata6f3533f2011-07-29 19:53:35 +0000791 }
792 }
Greg Clayton5160ce52013-03-27 23:08:40 +0000793 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata6f3533f2011-07-29 19:53:35 +0000794 if (log)
795 {
Greg Clayton81e871e2012-02-04 02:27:34 +0000796 if (new_value_sp)
Jim Ingham35e1bda2012-10-16 21:41:58 +0000797 log->Printf ("SBValue(%p)::CreateChildAtOffset => \"%s\"",
798 value_sp.get(),
799 new_value_sp->GetName().AsCString());
Enrico Granata6f3533f2011-07-29 19:53:35 +0000800 else
Jim Ingham35e1bda2012-10-16 21:41:58 +0000801 log->Printf ("SBValue(%p)::CreateChildAtOffset => NULL",
802 value_sp.get());
Enrico Granata6f3533f2011-07-29 19:53:35 +0000803 }
Greg Clayton81e871e2012-02-04 02:27:34 +0000804 return sb_value;
Enrico Granata6f3533f2011-07-29 19:53:35 +0000805}
806
807lldb::SBValue
Greg Claytonbf2331c2011-09-09 23:04:00 +0000808SBValue::Cast (SBType type)
Enrico Granata6f3533f2011-07-29 19:53:35 +0000809{
Greg Claytonef496d52012-01-31 04:25:15 +0000810 lldb::SBValue sb_value;
Greg Clayton81e871e2012-02-04 02:27:34 +0000811 lldb::ValueObjectSP value_sp(GetSP());
812 TypeImplSP type_sp (type.GetSP());
813 if (value_sp && type_sp)
Enrico Granatae3e91512012-10-22 18:18:36 +0000814 sb_value.SetSP(value_sp->Cast(type_sp->GetClangASTType()),GetPreferDynamicValue(),GetPreferSyntheticValue());
Greg Claytonef496d52012-01-31 04:25:15 +0000815 return sb_value;
Enrico Granata6f3533f2011-07-29 19:53:35 +0000816}
817
818lldb::SBValue
819SBValue::CreateValueFromExpression (const char *name, const char* expression)
820{
Jim Ingham35e1bda2012-10-16 21:41:58 +0000821 SBExpressionOptions options;
Greg Claytoncced1562012-10-16 22:58:25 +0000822 options.ref().SetKeepInMemory(true);
Jim Ingham35e1bda2012-10-16 21:41:58 +0000823 return CreateValueFromExpression (name, expression, options);
824}
825
826lldb::SBValue
827SBValue::CreateValueFromExpression (const char *name, const char *expression, SBExpressionOptions &options)
828{
Greg Clayton5160ce52013-03-27 23:08:40 +0000829 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton81e871e2012-02-04 02:27:34 +0000830 lldb::SBValue sb_value;
831 lldb::ValueObjectSP value_sp(GetSP());
832 lldb::ValueObjectSP new_value_sp;
833 if (value_sp)
Enrico Granata6f3533f2011-07-29 19:53:35 +0000834 {
Greg Claytoncc4d0142012-02-17 07:49:44 +0000835 ExecutionContext exe_ctx (value_sp->GetExecutionContextRef());
Greg Claytonc9858e42012-04-06 02:17:47 +0000836 ProcessSP process_sp(exe_ctx.GetProcessSP());
837 Process::StopLocker stop_locker;
838 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Johnny Chen50660442011-12-20 01:52:44 +0000839 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000840 if (log)
841 log->Printf ("SBValue(%p)::CreateValueFromExpression() => error: process is running", value_sp.get());
842 }
843 else
844 {
845 Target* target = exe_ctx.GetTargetPtr();
846 if (target)
Greg Claytoncc4d0142012-02-17 07:49:44 +0000847 {
Greg Claytoncced1562012-10-16 22:58:25 +0000848 options.ref().SetKeepInMemory(true);
Greg Claytonc9858e42012-04-06 02:17:47 +0000849 target->EvaluateExpression (expression,
850 exe_ctx.GetFramePtr(),
Enrico Granatad4439aa2012-09-05 20:41:26 +0000851 new_value_sp,
Jim Ingham35e1bda2012-10-16 21:41:58 +0000852 options.ref());
Greg Claytonc9858e42012-04-06 02:17:47 +0000853 if (new_value_sp)
854 {
855 new_value_sp->SetName(ConstString(name));
856 sb_value.SetSP(new_value_sp);
857 }
Greg Claytoncc4d0142012-02-17 07:49:44 +0000858 }
Johnny Chen50660442011-12-20 01:52:44 +0000859 }
Enrico Granata6f3533f2011-07-29 19:53:35 +0000860 }
Enrico Granata6f3533f2011-07-29 19:53:35 +0000861 if (log)
862 {
Greg Clayton81e871e2012-02-04 02:27:34 +0000863 if (new_value_sp)
Greg Claytoneac87f82012-06-04 20:13:23 +0000864 log->Printf ("SBValue(%p)::CreateValueFromExpression(name=\"%s\", expression=\"%s\") => SBValue (%p)",
Greg Claytonc9858e42012-04-06 02:17:47 +0000865 value_sp.get(),
866 name,
867 expression,
868 new_value_sp.get());
Enrico Granata6f3533f2011-07-29 19:53:35 +0000869 else
Greg Claytoneac87f82012-06-04 20:13:23 +0000870 log->Printf ("SBValue(%p)::CreateValueFromExpression(name=\"%s\", expression=\"%s\") => NULL",
Greg Claytonc9858e42012-04-06 02:17:47 +0000871 value_sp.get(),
872 name,
873 expression);
Enrico Granata6f3533f2011-07-29 19:53:35 +0000874 }
Greg Clayton81e871e2012-02-04 02:27:34 +0000875 return sb_value;
Enrico Granata6f3533f2011-07-29 19:53:35 +0000876}
877
878lldb::SBValue
Greg Clayton81e871e2012-02-04 02:27:34 +0000879SBValue::CreateValueFromAddress(const char* name, lldb::addr_t address, SBType sb_type)
Enrico Granata6f3533f2011-07-29 19:53:35 +0000880{
Greg Clayton81e871e2012-02-04 02:27:34 +0000881 lldb::SBValue sb_value;
882 lldb::ValueObjectSP value_sp(GetSP());
883 lldb::ValueObjectSP new_value_sp;
884 lldb::TypeImplSP type_impl_sp (sb_type.GetSP());
885 if (value_sp && type_impl_sp)
Enrico Granata6f3533f2011-07-29 19:53:35 +0000886 {
Greg Clayton81e871e2012-02-04 02:27:34 +0000887 ClangASTType pointee_ast_type(type_impl_sp->GetASTContext(), type_impl_sp->GetClangASTType().GetPointerType ());
888 lldb::TypeImplSP pointee_type_impl_sp (new TypeImpl(pointee_ast_type));
889 if (pointee_type_impl_sp)
Enrico Granata61408e02011-08-04 17:07:02 +0000890 {
Greg Clayton81e871e2012-02-04 02:27:34 +0000891
892 lldb::DataBufferSP buffer(new lldb_private::DataBufferHeap(&address,sizeof(lldb::addr_t)));
893
Greg Claytoncc4d0142012-02-17 07:49:44 +0000894 ExecutionContext exe_ctx (value_sp->GetExecutionContextRef());
895 ValueObjectSP ptr_result_valobj_sp(ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
Greg Clayton81e871e2012-02-04 02:27:34 +0000896 pointee_type_impl_sp->GetASTContext(),
897 pointee_type_impl_sp->GetOpaqueQualType(),
898 ConstString(name),
899 buffer,
900 lldb::endian::InlHostByteOrder(),
Greg Claytoncc4d0142012-02-17 07:49:44 +0000901 exe_ctx.GetAddressByteSize()));
Greg Clayton81e871e2012-02-04 02:27:34 +0000902
903 if (ptr_result_valobj_sp)
904 {
905 ptr_result_valobj_sp->GetValue().SetValueType(Value::eValueTypeLoadAddress);
906 Error err;
907 new_value_sp = ptr_result_valobj_sp->Dereference(err);
908 if (new_value_sp)
909 new_value_sp->SetName(ConstString(name));
910 }
911 sb_value.SetSP(new_value_sp);
Enrico Granata61408e02011-08-04 17:07:02 +0000912 }
Enrico Granata6f3533f2011-07-29 19:53:35 +0000913 }
Greg Clayton5160ce52013-03-27 23:08:40 +0000914 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata6f3533f2011-07-29 19:53:35 +0000915 if (log)
916 {
Greg Clayton81e871e2012-02-04 02:27:34 +0000917 if (new_value_sp)
918 log->Printf ("SBValue(%p)::CreateValueFromAddress => \"%s\"", value_sp.get(), new_value_sp->GetName().AsCString());
Johnny Chen4a871f92011-08-09 22:38:07 +0000919 else
Greg Clayton81e871e2012-02-04 02:27:34 +0000920 log->Printf ("SBValue(%p)::CreateValueFromAddress => NULL", value_sp.get());
Johnny Chen4a871f92011-08-09 22:38:07 +0000921 }
Greg Clayton81e871e2012-02-04 02:27:34 +0000922 return sb_value;
Enrico Granata6f3533f2011-07-29 19:53:35 +0000923}
924
Enrico Granata9128ee22011-09-06 19:20:51 +0000925lldb::SBValue
Greg Claytonbf2331c2011-09-09 23:04:00 +0000926SBValue::CreateValueFromData (const char* name, SBData data, SBType type)
Enrico Granata9128ee22011-09-06 19:20:51 +0000927{
Greg Clayton81e871e2012-02-04 02:27:34 +0000928 lldb::SBValue sb_value;
929 lldb::ValueObjectSP new_value_sp;
930 lldb::ValueObjectSP value_sp(GetSP());
931 if (value_sp)
Enrico Granata9128ee22011-09-06 19:20:51 +0000932 {
Greg Claytoncc4d0142012-02-17 07:49:44 +0000933 ExecutionContext exe_ctx (value_sp->GetExecutionContextRef());
934
935 new_value_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
Greg Clayton81e871e2012-02-04 02:27:34 +0000936 type.m_opaque_sp->GetASTContext() ,
937 type.m_opaque_sp->GetOpaqueQualType(),
938 ConstString(name),
939 *data.m_opaque_sp,
940 LLDB_INVALID_ADDRESS);
941 new_value_sp->SetAddressTypeOfChildren(eAddressTypeLoad);
942 sb_value.SetSP(new_value_sp);
Enrico Granata9128ee22011-09-06 19:20:51 +0000943 }
Greg Clayton5160ce52013-03-27 23:08:40 +0000944 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata9128ee22011-09-06 19:20:51 +0000945 if (log)
946 {
Greg Clayton81e871e2012-02-04 02:27:34 +0000947 if (new_value_sp)
Greg Claytoneac87f82012-06-04 20:13:23 +0000948 log->Printf ("SBValue(%p)::CreateValueFromData => \"%s\"", value_sp.get(), new_value_sp->GetName().AsCString());
Enrico Granata9128ee22011-09-06 19:20:51 +0000949 else
Greg Claytoneac87f82012-06-04 20:13:23 +0000950 log->Printf ("SBValue(%p)::CreateValueFromData => NULL", value_sp.get());
Enrico Granata9128ee22011-09-06 19:20:51 +0000951 }
Greg Clayton81e871e2012-02-04 02:27:34 +0000952 return sb_value;
Enrico Granata9128ee22011-09-06 19:20:51 +0000953}
954
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000955SBValue
956SBValue::GetChildAtIndex (uint32_t idx)
957{
Greg Claytonf66024822011-07-15 19:31:49 +0000958 const bool can_create_synthetic = false;
959 lldb::DynamicValueType use_dynamic = eNoDynamicValues;
Greg Clayton81e871e2012-02-04 02:27:34 +0000960 lldb::ValueObjectSP value_sp(GetSP());
961 if (value_sp)
Greg Claytoncc4d0142012-02-17 07:49:44 +0000962 {
963 TargetSP target_sp(value_sp->GetTargetSP());
964 if (target_sp)
965 use_dynamic = target_sp->GetPreferDynamicValue();
966 }
Greg Claytonf66024822011-07-15 19:31:49 +0000967 return GetChildAtIndex (idx, use_dynamic, can_create_synthetic);
Jim Ingham78a685a2011-04-16 00:01:13 +0000968}
969
970SBValue
Greg Claytonf66024822011-07-15 19:31:49 +0000971SBValue::GetChildAtIndex (uint32_t idx, lldb::DynamicValueType use_dynamic, bool can_create_synthetic)
Jim Ingham78a685a2011-04-16 00:01:13 +0000972{
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000973 lldb::ValueObjectSP child_sp;
Greg Clayton5160ce52013-03-27 23:08:40 +0000974 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000975
Greg Clayton81e871e2012-02-04 02:27:34 +0000976 lldb::ValueObjectSP value_sp(GetSP());
977 if (value_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000978 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000979 ProcessSP process_sp(value_sp->GetProcessSP());
980 Process::StopLocker stop_locker;
981 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Clayton626f4a12011-06-29 18:28:50 +0000982 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000983 if (log)
984 log->Printf ("SBValue(%p)::GetChildAtIndex() => error: process is running", value_sp.get());
985 }
986 else
987 {
988 TargetSP target_sp(value_sp->GetTargetSP());
989 if (target_sp)
Greg Clayton21c5ab42011-05-20 23:51:26 +0000990 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000991 Mutex::Locker api_locker (target_sp->GetAPIMutex());
992 const bool can_create = true;
993 child_sp = value_sp->GetChildAtIndex (idx, can_create);
994 if (can_create_synthetic && !child_sp)
Greg Clayton626f4a12011-06-29 18:28:50 +0000995 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000996 if (value_sp->IsPointerType())
997 {
998 child_sp = value_sp->GetSyntheticArrayMemberFromPointer(idx, can_create);
999 }
1000 else if (value_sp->IsArrayType())
1001 {
1002 child_sp = value_sp->GetSyntheticArrayMemberFromArray(idx, can_create);
1003 }
Greg Claytonf66024822011-07-15 19:31:49 +00001004 }
Greg Claytonc9858e42012-04-06 02:17:47 +00001005
Greg Clayton21c5ab42011-05-20 23:51:26 +00001006 }
Jim Ingham78a685a2011-04-16 00:01:13 +00001007 }
1008 }
1009
Enrico Granatae3e91512012-10-22 18:18:36 +00001010 SBValue sb_value;
1011 sb_value.SetSP (child_sp, use_dynamic, GetPreferSyntheticValue());
Greg Claytoncfd1ace2010-10-31 03:01:06 +00001012 if (log)
Greg Clayton81e871e2012-02-04 02:27:34 +00001013 log->Printf ("SBValue(%p)::GetChildAtIndex (%u) => SBValue(%p)", value_sp.get(), idx, value_sp.get());
Greg Claytoncfd1ace2010-10-31 03:01:06 +00001014
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001015 return sb_value;
1016}
1017
1018uint32_t
1019SBValue::GetIndexOfChildWithName (const char *name)
1020{
Greg Claytoncfd1ace2010-10-31 03:01:06 +00001021 uint32_t idx = UINT32_MAX;
Greg Clayton81e871e2012-02-04 02:27:34 +00001022 lldb::ValueObjectSP value_sp(GetSP());
1023 if (value_sp)
Greg Clayton21c5ab42011-05-20 23:51:26 +00001024 {
Greg Claytoncc4d0142012-02-17 07:49:44 +00001025 TargetSP target_sp(value_sp->GetTargetSP());
Greg Clayton81e871e2012-02-04 02:27:34 +00001026 if (target_sp)
Greg Clayton626f4a12011-06-29 18:28:50 +00001027 {
Greg Claytoncc4d0142012-02-17 07:49:44 +00001028 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Clayton21c5ab42011-05-20 23:51:26 +00001029
Greg Clayton81e871e2012-02-04 02:27:34 +00001030 idx = value_sp->GetIndexOfChildWithName (ConstString(name));
Greg Clayton626f4a12011-06-29 18:28:50 +00001031 }
Greg Clayton21c5ab42011-05-20 23:51:26 +00001032 }
Greg Clayton5160ce52013-03-27 23:08:40 +00001033 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytoncfd1ace2010-10-31 03:01:06 +00001034 if (log)
1035 {
1036 if (idx == UINT32_MAX)
Greg Clayton81e871e2012-02-04 02:27:34 +00001037 log->Printf ("SBValue(%p)::GetIndexOfChildWithName (name=\"%s\") => NOT FOUND", value_sp.get(), name);
Greg Claytoncfd1ace2010-10-31 03:01:06 +00001038 else
Greg Clayton81e871e2012-02-04 02:27:34 +00001039 log->Printf ("SBValue(%p)::GetIndexOfChildWithName (name=\"%s\") => %u", value_sp.get(), name, idx);
Greg Claytoncfd1ace2010-10-31 03:01:06 +00001040 }
1041 return idx;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001042}
1043
1044SBValue
1045SBValue::GetChildMemberWithName (const char *name)
1046{
Greg Clayton81e871e2012-02-04 02:27:34 +00001047 lldb::ValueObjectSP value_sp(GetSP());
1048 if (value_sp)
Johnny Chen6999f862011-06-29 21:19:39 +00001049 {
Greg Clayton81e871e2012-02-04 02:27:34 +00001050 lldb::DynamicValueType use_dynamic_value = eNoDynamicValues;
Greg Claytoncc4d0142012-02-17 07:49:44 +00001051 TargetSP target_sp(value_sp->GetTargetSP());
Greg Clayton81e871e2012-02-04 02:27:34 +00001052 if (target_sp)
1053 {
1054 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1055 use_dynamic_value = target_sp->GetPreferDynamicValue();
1056 }
Johnny Chen6999f862011-06-29 21:19:39 +00001057 return GetChildMemberWithName (name, use_dynamic_value);
1058 }
Greg Clayton81e871e2012-02-04 02:27:34 +00001059 return SBValue();
Jim Ingham78a685a2011-04-16 00:01:13 +00001060}
1061
1062SBValue
Jim Ingham2837b762011-05-04 03:43:18 +00001063SBValue::GetChildMemberWithName (const char *name, lldb::DynamicValueType use_dynamic_value)
Jim Ingham78a685a2011-04-16 00:01:13 +00001064{
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001065 lldb::ValueObjectSP child_sp;
1066 const ConstString str_name (name);
1067
Greg Clayton5160ce52013-03-27 23:08:40 +00001068 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton43479732011-05-20 22:07:17 +00001069
Greg Clayton81e871e2012-02-04 02:27:34 +00001070 lldb::ValueObjectSP value_sp(GetSP());
1071 if (value_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001072 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001073 ProcessSP process_sp(value_sp->GetProcessSP());
1074 Process::StopLocker stop_locker;
1075 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Jim Ingham78a685a2011-04-16 00:01:13 +00001076 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001077 if (log)
1078 log->Printf ("SBValue(%p)::GetChildMemberWithName() => error: process is running", value_sp.get());
1079 }
1080 else
1081 {
1082 TargetSP target_sp(value_sp->GetTargetSP());
1083 if (target_sp)
Greg Clayton21c5ab42011-05-20 23:51:26 +00001084 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001085 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1086 child_sp = value_sp->GetChildMemberWithName (str_name, true);
Greg Clayton21c5ab42011-05-20 23:51:26 +00001087 }
Jim Ingham78a685a2011-04-16 00:01:13 +00001088 }
1089 }
1090
Enrico Granatae3e91512012-10-22 18:18:36 +00001091 SBValue sb_value;
1092 sb_value.SetSP(child_sp, use_dynamic_value, GetPreferSyntheticValue());
Greg Claytoncfd1ace2010-10-31 03:01:06 +00001093
Greg Claytoncfd1ace2010-10-31 03:01:06 +00001094 if (log)
Greg Clayton81e871e2012-02-04 02:27:34 +00001095 log->Printf ("SBValue(%p)::GetChildMemberWithName (name=\"%s\") => SBValue(%p)", value_sp.get(), name, value_sp.get());
Greg Claytoncfd1ace2010-10-31 03:01:06 +00001096
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001097 return sb_value;
1098}
1099
Enrico Granataf2bbf712011-07-15 02:26:42 +00001100lldb::SBValue
Jim Ingham60dbabb2011-12-08 19:44:08 +00001101SBValue::GetDynamicValue (lldb::DynamicValueType use_dynamic)
1102{
Enrico Granatae3e91512012-10-22 18:18:36 +00001103 SBValue value_sb;
1104 if (IsValid())
Jim Ingham60dbabb2011-12-08 19:44:08 +00001105 {
Enrico Granatae3e91512012-10-22 18:18:36 +00001106 ValueImplSP proxy_sp(new ValueImpl(m_opaque_sp->GetRootSP(),use_dynamic,m_opaque_sp->GetUseSynthetic()));
1107 value_sb.SetSP(proxy_sp);
Jim Ingham60dbabb2011-12-08 19:44:08 +00001108 }
Enrico Granatae3e91512012-10-22 18:18:36 +00001109 return value_sb;
Jim Ingham60dbabb2011-12-08 19:44:08 +00001110}
1111
1112lldb::SBValue
1113SBValue::GetStaticValue ()
1114{
Enrico Granatae3e91512012-10-22 18:18:36 +00001115 SBValue value_sb;
1116 if (IsValid())
Jim Ingham60dbabb2011-12-08 19:44:08 +00001117 {
Enrico Granatae3e91512012-10-22 18:18:36 +00001118 ValueImplSP proxy_sp(new ValueImpl(m_opaque_sp->GetRootSP(),eNoDynamicValues,m_opaque_sp->GetUseSynthetic()));
1119 value_sb.SetSP(proxy_sp);
Jim Ingham60dbabb2011-12-08 19:44:08 +00001120 }
Enrico Granatae3e91512012-10-22 18:18:36 +00001121 return value_sb;
Jim Ingham60dbabb2011-12-08 19:44:08 +00001122}
1123
Enrico Granatac5bc4122012-03-27 02:35:13 +00001124lldb::SBValue
1125SBValue::GetNonSyntheticValue ()
1126{
Enrico Granatae3e91512012-10-22 18:18:36 +00001127 SBValue value_sb;
1128 if (IsValid())
Enrico Granatac5bc4122012-03-27 02:35:13 +00001129 {
Enrico Granatae3e91512012-10-22 18:18:36 +00001130 ValueImplSP proxy_sp(new ValueImpl(m_opaque_sp->GetRootSP(),m_opaque_sp->GetUseDynamic(),false));
1131 value_sb.SetSP(proxy_sp);
Enrico Granatac5bc4122012-03-27 02:35:13 +00001132 }
Enrico Granatae3e91512012-10-22 18:18:36 +00001133 return value_sb;
1134}
1135
1136lldb::DynamicValueType
1137SBValue::GetPreferDynamicValue ()
1138{
1139 if (!IsValid())
1140 return eNoDynamicValues;
1141 return m_opaque_sp->GetUseDynamic();
1142}
1143
1144void
1145SBValue::SetPreferDynamicValue (lldb::DynamicValueType use_dynamic)
1146{
1147 if (IsValid())
1148 return m_opaque_sp->SetUseDynamic (use_dynamic);
1149}
1150
1151bool
1152SBValue::GetPreferSyntheticValue ()
1153{
1154 if (!IsValid())
1155 return false;
1156 return m_opaque_sp->GetUseSynthetic();
1157}
1158
1159void
1160SBValue::SetPreferSyntheticValue (bool use_synthetic)
1161{
1162 if (IsValid())
1163 return m_opaque_sp->SetUseSynthetic (use_synthetic);
Enrico Granatac5bc4122012-03-27 02:35:13 +00001164}
1165
Jim Ingham60dbabb2011-12-08 19:44:08 +00001166bool
1167SBValue::IsDynamic()
1168{
Greg Clayton81e871e2012-02-04 02:27:34 +00001169 lldb::ValueObjectSP value_sp(GetSP());
1170 if (value_sp)
Jim Ingham60dbabb2011-12-08 19:44:08 +00001171 {
Greg Claytoncc4d0142012-02-17 07:49:44 +00001172 TargetSP target_sp(value_sp->GetTargetSP());
Greg Clayton81e871e2012-02-04 02:27:34 +00001173 if (target_sp)
Jim Ingham60dbabb2011-12-08 19:44:08 +00001174 {
Greg Claytoncc4d0142012-02-17 07:49:44 +00001175 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Clayton81e871e2012-02-04 02:27:34 +00001176 return value_sp->IsDynamic();
Jim Ingham60dbabb2011-12-08 19:44:08 +00001177 }
1178 }
1179 return false;
1180}
1181
Enrico Granatae3e91512012-10-22 18:18:36 +00001182bool
1183SBValue::IsSynthetic ()
1184{
1185 lldb::ValueObjectSP value_sp(GetSP());
1186 if (value_sp)
1187 {
1188 TargetSP target_sp(value_sp->GetTargetSP());
1189 if (target_sp)
1190 {
1191 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1192 return value_sp->IsSynthetic();
1193 }
1194 }
1195 return false;
1196}
1197
Jim Ingham60dbabb2011-12-08 19:44:08 +00001198lldb::SBValue
Enrico Granataf2bbf712011-07-15 02:26:42 +00001199SBValue::GetValueForExpressionPath(const char* expr_path)
1200{
Greg Clayton5160ce52013-03-27 23:08:40 +00001201 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granataf2bbf712011-07-15 02:26:42 +00001202 lldb::ValueObjectSP child_sp;
Greg Clayton81e871e2012-02-04 02:27:34 +00001203 lldb::ValueObjectSP value_sp(GetSP());
1204 if (value_sp)
Enrico Granataf2bbf712011-07-15 02:26:42 +00001205 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001206 ProcessSP process_sp(value_sp->GetProcessSP());
1207 Process::StopLocker stop_locker;
1208 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granataf2bbf712011-07-15 02:26:42 +00001209 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001210 if (log)
1211 log->Printf ("SBValue(%p)::GetValueForExpressionPath() => error: process is running", value_sp.get());
1212 }
1213 else
1214 {
1215 TargetSP target_sp(value_sp->GetTargetSP());
1216 if (target_sp)
1217 {
1218 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1219 // using default values for all the fancy options, just do it if you can
1220 child_sp = value_sp->GetValueForExpressionPath(expr_path);
1221 }
Enrico Granataf2bbf712011-07-15 02:26:42 +00001222 }
1223 }
1224
Enrico Granatae3e91512012-10-22 18:18:36 +00001225 SBValue sb_value;
1226 sb_value.SetSP(child_sp,GetPreferDynamicValue(),GetPreferSyntheticValue());
Enrico Granataf2bbf712011-07-15 02:26:42 +00001227
Enrico Granataf2bbf712011-07-15 02:26:42 +00001228 if (log)
Greg Clayton81e871e2012-02-04 02:27:34 +00001229 log->Printf ("SBValue(%p)::GetValueForExpressionPath (expr_path=\"%s\") => SBValue(%p)", value_sp.get(), expr_path, value_sp.get());
Enrico Granataf2bbf712011-07-15 02:26:42 +00001230
1231 return sb_value;
1232}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001233
Greg Claytonfe42ac42011-08-03 22:57:10 +00001234int64_t
Enrico Granata6fd87d52011-08-04 01:41:02 +00001235SBValue::GetValueAsSigned(SBError& error, int64_t fail_value)
1236{
Jim Ingham16e0c682011-08-12 23:34:31 +00001237 error.Clear();
Greg Clayton81e871e2012-02-04 02:27:34 +00001238 lldb::ValueObjectSP value_sp(GetSP());
1239 if (value_sp)
Enrico Granata6fd87d52011-08-04 01:41:02 +00001240 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001241 ProcessSP process_sp(value_sp->GetProcessSP());
1242 Process::StopLocker stop_locker;
1243 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granata6fd87d52011-08-04 01:41:02 +00001244 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001245 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001246 if (log)
1247 log->Printf ("SBValue(%p)::GetValueAsSigned() => error: process is running", value_sp.get());
1248 error.SetErrorString("process is running");
Enrico Granata6fd87d52011-08-04 01:41:02 +00001249 }
1250 else
Greg Claytonc9858e42012-04-06 02:17:47 +00001251 {
1252 TargetSP target_sp(value_sp->GetTargetSP());
1253 if (target_sp)
1254 {
1255 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1256 Scalar scalar;
1257 if (value_sp->ResolveValue (scalar))
Enrico Granata7e137e32012-10-24 18:14:21 +00001258 return scalar.SLongLong(fail_value);
Greg Claytonc9858e42012-04-06 02:17:47 +00001259 else
1260 error.SetErrorString("could not get value");
1261 }
1262 else
1263 error.SetErrorString("could not get target");
1264 }
Enrico Granata6fd87d52011-08-04 01:41:02 +00001265 }
1266 error.SetErrorString("invalid SBValue");
1267 return fail_value;
1268}
1269
1270uint64_t
1271SBValue::GetValueAsUnsigned(SBError& error, uint64_t fail_value)
1272{
Jim Ingham16e0c682011-08-12 23:34:31 +00001273 error.Clear();
Greg Clayton81e871e2012-02-04 02:27:34 +00001274 lldb::ValueObjectSP value_sp(GetSP());
1275 if (value_sp)
Enrico Granata6fd87d52011-08-04 01:41:02 +00001276 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001277 ProcessSP process_sp(value_sp->GetProcessSP());
1278 Process::StopLocker stop_locker;
1279 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granata6fd87d52011-08-04 01:41:02 +00001280 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001281 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001282 if (log)
1283 log->Printf ("SBValue(%p)::GetValueAsUnsigned() => error: process is running", value_sp.get());
1284 error.SetErrorString("process is running");
Enrico Granata6fd87d52011-08-04 01:41:02 +00001285 }
1286 else
Greg Claytonc9858e42012-04-06 02:17:47 +00001287 {
1288 TargetSP target_sp(value_sp->GetTargetSP());
1289 if (target_sp)
1290 {
1291 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1292 Scalar scalar;
1293 if (value_sp->ResolveValue (scalar))
Enrico Granata48ea80f2012-10-24 20:24:39 +00001294 return scalar.ULongLong(fail_value);
Greg Claytonc9858e42012-04-06 02:17:47 +00001295 else
1296 error.SetErrorString("could not get value");
1297 }
1298 else
1299 error.SetErrorString("could not get target");
1300 }
Enrico Granata6fd87d52011-08-04 01:41:02 +00001301 }
1302 error.SetErrorString("invalid SBValue");
1303 return fail_value;
1304}
1305
1306int64_t
Greg Claytonfe42ac42011-08-03 22:57:10 +00001307SBValue::GetValueAsSigned(int64_t fail_value)
1308{
Greg Clayton81e871e2012-02-04 02:27:34 +00001309 lldb::ValueObjectSP value_sp(GetSP());
1310 if (value_sp)
Greg Claytonfe42ac42011-08-03 22:57:10 +00001311 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001312 ProcessSP process_sp(value_sp->GetProcessSP());
1313 Process::StopLocker stop_locker;
1314 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Claytonfe42ac42011-08-03 22:57:10 +00001315 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001316 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001317 if (log)
1318 log->Printf ("SBValue(%p)::GetValueAsSigned() => error: process is running", value_sp.get());
1319 }
1320 else
1321 {
1322 TargetSP target_sp(value_sp->GetTargetSP());
1323 if (target_sp)
1324 {
1325 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1326 Scalar scalar;
1327 if (value_sp->ResolveValue (scalar))
Enrico Granata7e137e32012-10-24 18:14:21 +00001328 return scalar.SLongLong(fail_value);
Greg Claytonc9858e42012-04-06 02:17:47 +00001329 }
Greg Claytonfe42ac42011-08-03 22:57:10 +00001330 }
1331 }
1332 return fail_value;
1333}
1334
1335uint64_t
1336SBValue::GetValueAsUnsigned(uint64_t fail_value)
1337{
Greg Clayton81e871e2012-02-04 02:27:34 +00001338 lldb::ValueObjectSP value_sp(GetSP());
1339 if (value_sp)
Greg Claytonfe42ac42011-08-03 22:57:10 +00001340 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001341 ProcessSP process_sp(value_sp->GetProcessSP());
1342 Process::StopLocker stop_locker;
1343 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Claytonfe42ac42011-08-03 22:57:10 +00001344 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001345 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001346 if (log)
1347 log->Printf ("SBValue(%p)::GetValueAsUnsigned() => error: process is running", value_sp.get());
1348 }
1349 else
1350 {
1351 TargetSP target_sp(value_sp->GetTargetSP());
1352 if (target_sp)
1353 {
1354 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1355 Scalar scalar;
1356 if (value_sp->ResolveValue (scalar))
Enrico Granata48ea80f2012-10-24 20:24:39 +00001357 return scalar.ULongLong(fail_value);
Greg Claytonc9858e42012-04-06 02:17:47 +00001358 }
Greg Claytonfe42ac42011-08-03 22:57:10 +00001359 }
1360 }
1361 return fail_value;
1362}
1363
Greg Clayton4a792072012-10-23 01:50:10 +00001364bool
1365SBValue::MightHaveChildren ()
1366{
Greg Clayton5160ce52013-03-27 23:08:40 +00001367 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton4a792072012-10-23 01:50:10 +00001368 bool has_children = false;
1369 lldb::ValueObjectSP value_sp(GetSP());
1370 if (value_sp)
1371 has_children = value_sp->MightHaveChildren();
1372
1373 if (log)
Enrico Granata1ddbd8a2013-02-28 02:26:12 +00001374 log->Printf ("SBValue(%p)::MightHaveChildren() => %i", value_sp.get(), has_children);
Greg Clayton4a792072012-10-23 01:50:10 +00001375 return has_children;
1376}
1377
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001378uint32_t
1379SBValue::GetNumChildren ()
1380{
1381 uint32_t num_children = 0;
1382
Greg Clayton5160ce52013-03-27 23:08:40 +00001383 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton81e871e2012-02-04 02:27:34 +00001384 lldb::ValueObjectSP value_sp(GetSP());
1385 if (value_sp)
Greg Clayton21c5ab42011-05-20 23:51:26 +00001386 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001387 ProcessSP process_sp(value_sp->GetProcessSP());
1388 Process::StopLocker stop_locker;
1389 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Greg Clayton626f4a12011-06-29 18:28:50 +00001390 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001391 if (log)
1392 log->Printf ("SBValue(%p)::GetNumChildren() => error: process is running", value_sp.get());
1393 }
1394 else
1395 {
1396 TargetSP target_sp(value_sp->GetTargetSP());
1397 if (target_sp)
1398 {
1399 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Clayton21c5ab42011-05-20 23:51:26 +00001400
Greg Claytonc9858e42012-04-06 02:17:47 +00001401 num_children = value_sp->GetNumChildren();
1402 }
Greg Clayton626f4a12011-06-29 18:28:50 +00001403 }
Greg Clayton21c5ab42011-05-20 23:51:26 +00001404 }
Greg Claytoncfd1ace2010-10-31 03:01:06 +00001405
Greg Claytoncfd1ace2010-10-31 03:01:06 +00001406 if (log)
Greg Clayton81e871e2012-02-04 02:27:34 +00001407 log->Printf ("SBValue(%p)::GetNumChildren () => %u", value_sp.get(), num_children);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001408
1409 return num_children;
1410}
1411
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001412
1413SBValue
1414SBValue::Dereference ()
1415{
Greg Claytoncfd1ace2010-10-31 03:01:06 +00001416 SBValue sb_value;
Greg Clayton81e871e2012-02-04 02:27:34 +00001417 lldb::ValueObjectSP value_sp(GetSP());
1418 if (value_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001419 {
Greg Claytoncc4d0142012-02-17 07:49:44 +00001420 TargetSP target_sp(value_sp->GetTargetSP());
Greg Clayton81e871e2012-02-04 02:27:34 +00001421 if (target_sp)
Greg Clayton626f4a12011-06-29 18:28:50 +00001422 {
Greg Claytoncc4d0142012-02-17 07:49:44 +00001423 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Clayton21c5ab42011-05-20 23:51:26 +00001424
Greg Clayton626f4a12011-06-29 18:28:50 +00001425 Error error;
Greg Clayton81e871e2012-02-04 02:27:34 +00001426 sb_value = value_sp->Dereference (error);
Greg Clayton626f4a12011-06-29 18:28:50 +00001427 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001428 }
Greg Clayton5160ce52013-03-27 23:08:40 +00001429 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytoncfd1ace2010-10-31 03:01:06 +00001430 if (log)
Greg Clayton81e871e2012-02-04 02:27:34 +00001431 log->Printf ("SBValue(%p)::Dereference () => SBValue(%p)", value_sp.get(), value_sp.get());
Greg Claytoncfd1ace2010-10-31 03:01:06 +00001432
1433 return sb_value;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001434}
1435
1436bool
Greg Claytoncfd1ace2010-10-31 03:01:06 +00001437SBValue::TypeIsPointerType ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001438{
1439 bool is_ptr_type = false;
1440
Greg Clayton81e871e2012-02-04 02:27:34 +00001441 lldb::ValueObjectSP value_sp(GetSP());
1442 if (value_sp)
Greg Clayton21c5ab42011-05-20 23:51:26 +00001443 {
Greg Claytoncc4d0142012-02-17 07:49:44 +00001444 TargetSP target_sp(value_sp->GetTargetSP());
Greg Clayton81e871e2012-02-04 02:27:34 +00001445 if (target_sp)
Greg Clayton626f4a12011-06-29 18:28:50 +00001446 {
Greg Claytoncc4d0142012-02-17 07:49:44 +00001447 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Clayton21c5ab42011-05-20 23:51:26 +00001448
Greg Clayton81e871e2012-02-04 02:27:34 +00001449 is_ptr_type = value_sp->IsPointerType();
Greg Clayton626f4a12011-06-29 18:28:50 +00001450 }
Greg Clayton21c5ab42011-05-20 23:51:26 +00001451 }
Greg Claytoncfd1ace2010-10-31 03:01:06 +00001452
Greg Clayton5160ce52013-03-27 23:08:40 +00001453 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytoncfd1ace2010-10-31 03:01:06 +00001454 if (log)
Greg Clayton81e871e2012-02-04 02:27:34 +00001455 log->Printf ("SBValue(%p)::TypeIsPointerType () => %i", value_sp.get(), is_ptr_type);
Greg Claytoncfd1ace2010-10-31 03:01:06 +00001456
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001457
1458 return is_ptr_type;
1459}
1460
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001461void *
1462SBValue::GetOpaqueType()
1463{
Greg Clayton81e871e2012-02-04 02:27:34 +00001464 lldb::ValueObjectSP value_sp(GetSP());
1465 if (value_sp)
Greg Clayton21c5ab42011-05-20 23:51:26 +00001466 {
Greg Claytoncc4d0142012-02-17 07:49:44 +00001467 TargetSP target_sp(value_sp->GetTargetSP());
Greg Clayton81e871e2012-02-04 02:27:34 +00001468 if (target_sp)
Greg Clayton626f4a12011-06-29 18:28:50 +00001469 {
Greg Claytoncc4d0142012-02-17 07:49:44 +00001470 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Clayton21c5ab42011-05-20 23:51:26 +00001471
Greg Clayton81e871e2012-02-04 02:27:34 +00001472 return value_sp->GetClangType();
Greg Clayton626f4a12011-06-29 18:28:50 +00001473 }
Greg Clayton21c5ab42011-05-20 23:51:26 +00001474 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001475 return NULL;
1476}
1477
Enrico Granata6f3533f2011-07-29 19:53:35 +00001478lldb::SBTarget
1479SBValue::GetTarget()
1480{
Greg Claytonb9556ac2012-01-30 07:41:31 +00001481 SBTarget sb_target;
1482 TargetSP target_sp;
Greg Clayton81e871e2012-02-04 02:27:34 +00001483 lldb::ValueObjectSP value_sp(GetSP());
1484 if (value_sp)
Enrico Granata6f3533f2011-07-29 19:53:35 +00001485 {
Greg Claytoncc4d0142012-02-17 07:49:44 +00001486 target_sp = value_sp->GetTargetSP();
Greg Claytonb9556ac2012-01-30 07:41:31 +00001487 sb_target.SetSP (target_sp);
Enrico Granata6f3533f2011-07-29 19:53:35 +00001488 }
Greg Clayton5160ce52013-03-27 23:08:40 +00001489 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata6f3533f2011-07-29 19:53:35 +00001490 if (log)
1491 {
Greg Claytonb9556ac2012-01-30 07:41:31 +00001492 if (target_sp.get() == NULL)
Greg Clayton81e871e2012-02-04 02:27:34 +00001493 log->Printf ("SBValue(%p)::GetTarget () => NULL", value_sp.get());
Enrico Granata6f3533f2011-07-29 19:53:35 +00001494 else
Greg Clayton81e871e2012-02-04 02:27:34 +00001495 log->Printf ("SBValue(%p)::GetTarget () => %p", value_sp.get(), target_sp.get());
Enrico Granata6f3533f2011-07-29 19:53:35 +00001496 }
Greg Claytonb9556ac2012-01-30 07:41:31 +00001497 return sb_target;
Enrico Granata6f3533f2011-07-29 19:53:35 +00001498}
1499
1500lldb::SBProcess
1501SBValue::GetProcess()
1502{
Greg Claytonb9556ac2012-01-30 07:41:31 +00001503 SBProcess sb_process;
1504 ProcessSP process_sp;
Greg Clayton81e871e2012-02-04 02:27:34 +00001505 lldb::ValueObjectSP value_sp(GetSP());
1506 if (value_sp)
Enrico Granata6f3533f2011-07-29 19:53:35 +00001507 {
Greg Claytoncc4d0142012-02-17 07:49:44 +00001508 process_sp = value_sp->GetProcessSP();
Greg Claytonb9556ac2012-01-30 07:41:31 +00001509 if (process_sp)
1510 sb_process.SetSP (process_sp);
Enrico Granata6f3533f2011-07-29 19:53:35 +00001511 }
Greg Clayton5160ce52013-03-27 23:08:40 +00001512 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata6f3533f2011-07-29 19:53:35 +00001513 if (log)
1514 {
Greg Claytonb9556ac2012-01-30 07:41:31 +00001515 if (process_sp.get() == NULL)
Greg Clayton81e871e2012-02-04 02:27:34 +00001516 log->Printf ("SBValue(%p)::GetProcess () => NULL", value_sp.get());
Enrico Granata6f3533f2011-07-29 19:53:35 +00001517 else
Greg Clayton81e871e2012-02-04 02:27:34 +00001518 log->Printf ("SBValue(%p)::GetProcess () => %p", value_sp.get(), process_sp.get());
Enrico Granata6f3533f2011-07-29 19:53:35 +00001519 }
Greg Claytonb9556ac2012-01-30 07:41:31 +00001520 return sb_process;
Enrico Granata6f3533f2011-07-29 19:53:35 +00001521}
1522
1523lldb::SBThread
1524SBValue::GetThread()
1525{
Greg Clayton17a6ad02012-01-30 02:53:15 +00001526 SBThread sb_thread;
1527 ThreadSP thread_sp;
Greg Clayton81e871e2012-02-04 02:27:34 +00001528 lldb::ValueObjectSP value_sp(GetSP());
1529 if (value_sp)
Enrico Granata6f3533f2011-07-29 19:53:35 +00001530 {
Greg Claytoncc4d0142012-02-17 07:49:44 +00001531 thread_sp = value_sp->GetThreadSP();
1532 sb_thread.SetThread(thread_sp);
Enrico Granata6f3533f2011-07-29 19:53:35 +00001533 }
Greg Clayton5160ce52013-03-27 23:08:40 +00001534 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata6f3533f2011-07-29 19:53:35 +00001535 if (log)
1536 {
Greg Clayton17a6ad02012-01-30 02:53:15 +00001537 if (thread_sp.get() == NULL)
Greg Clayton81e871e2012-02-04 02:27:34 +00001538 log->Printf ("SBValue(%p)::GetThread () => NULL", value_sp.get());
Enrico Granata6f3533f2011-07-29 19:53:35 +00001539 else
Greg Clayton81e871e2012-02-04 02:27:34 +00001540 log->Printf ("SBValue(%p)::GetThread () => %p", value_sp.get(), thread_sp.get());
Enrico Granata6f3533f2011-07-29 19:53:35 +00001541 }
Greg Clayton17a6ad02012-01-30 02:53:15 +00001542 return sb_thread;
Enrico Granata6f3533f2011-07-29 19:53:35 +00001543}
1544
1545lldb::SBFrame
1546SBValue::GetFrame()
1547{
Greg Claytonb9556ac2012-01-30 07:41:31 +00001548 SBFrame sb_frame;
1549 StackFrameSP frame_sp;
Greg Clayton81e871e2012-02-04 02:27:34 +00001550 lldb::ValueObjectSP value_sp(GetSP());
1551 if (value_sp)
Enrico Granata6f3533f2011-07-29 19:53:35 +00001552 {
Greg Claytoncc4d0142012-02-17 07:49:44 +00001553 frame_sp = value_sp->GetFrameSP();
1554 sb_frame.SetFrameSP (frame_sp);
Enrico Granata6f3533f2011-07-29 19:53:35 +00001555 }
Greg Clayton5160ce52013-03-27 23:08:40 +00001556 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata6f3533f2011-07-29 19:53:35 +00001557 if (log)
1558 {
Greg Claytonb9556ac2012-01-30 07:41:31 +00001559 if (frame_sp.get() == NULL)
Greg Clayton81e871e2012-02-04 02:27:34 +00001560 log->Printf ("SBValue(%p)::GetFrame () => NULL", value_sp.get());
Enrico Granata6f3533f2011-07-29 19:53:35 +00001561 else
Greg Clayton81e871e2012-02-04 02:27:34 +00001562 log->Printf ("SBValue(%p)::GetFrame () => %p", value_sp.get(), frame_sp.get());
Enrico Granata6f3533f2011-07-29 19:53:35 +00001563 }
Greg Claytonb9556ac2012-01-30 07:41:31 +00001564 return sb_frame;
Enrico Granata6f3533f2011-07-29 19:53:35 +00001565}
1566
1567
Greg Clayton81e871e2012-02-04 02:27:34 +00001568lldb::ValueObjectSP
1569SBValue::GetSP () const
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001570{
Enrico Granatae3e91512012-10-22 18:18:36 +00001571 if (!m_opaque_sp || !m_opaque_sp->IsValid())
1572 return ValueObjectSP();
1573 return m_opaque_sp->GetSP();
1574}
1575
1576void
1577SBValue::SetSP (ValueImplSP impl_sp)
1578{
1579 m_opaque_sp = impl_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001580}
1581
Greg Clayton81e871e2012-02-04 02:27:34 +00001582void
1583SBValue::SetSP (const lldb::ValueObjectSP &sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001584{
Enrico Granatae3e91512012-10-22 18:18:36 +00001585 if (sp)
1586 {
1587 lldb::TargetSP target_sp(sp->GetTargetSP());
1588 if (target_sp)
1589 {
1590 lldb::DynamicValueType use_dynamic = target_sp->GetPreferDynamicValue();
1591 bool use_synthetic = target_sp->TargetProperties::GetEnableSyntheticValue();
1592 m_opaque_sp = ValueImplSP(new ValueImpl(sp, use_dynamic, use_synthetic));
1593 }
1594 else
1595 m_opaque_sp = ValueImplSP(new ValueImpl(sp,eNoDynamicValues,true));
1596 }
1597 else
1598 m_opaque_sp = ValueImplSP(new ValueImpl(sp,eNoDynamicValues,false));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001599}
Caroline Ticedde9cff2010-09-20 05:20:02 +00001600
Enrico Granatae3e91512012-10-22 18:18:36 +00001601void
1602SBValue::SetSP (const lldb::ValueObjectSP &sp, lldb::DynamicValueType use_dynamic)
1603{
1604 if (sp)
1605 {
1606 lldb::TargetSP target_sp(sp->GetTargetSP());
1607 if (target_sp)
1608 {
1609 bool use_synthetic = target_sp->TargetProperties::GetEnableSyntheticValue();
1610 SetSP (sp, use_dynamic, use_synthetic);
1611 }
1612 else
1613 SetSP (sp, use_dynamic, true);
1614 }
1615 else
1616 SetSP (sp, use_dynamic, false);
1617}
1618
1619void
1620SBValue::SetSP (const lldb::ValueObjectSP &sp, bool use_synthetic)
1621{
1622 if (sp)
1623 {
1624 lldb::TargetSP target_sp(sp->GetTargetSP());
1625 if (target_sp)
1626 {
1627 lldb::DynamicValueType use_dynamic = target_sp->GetPreferDynamicValue();
1628 SetSP (sp, use_dynamic, use_synthetic);
1629 }
1630 else
1631 SetSP (sp, eNoDynamicValues, use_synthetic);
1632 }
1633 else
1634 SetSP (sp, eNoDynamicValues, use_synthetic);
1635}
1636
1637void
1638SBValue::SetSP (const lldb::ValueObjectSP &sp, lldb::DynamicValueType use_dynamic, bool use_synthetic)
1639{
1640 m_opaque_sp = ValueImplSP(new ValueImpl(sp,use_dynamic,use_synthetic));
1641}
Greg Clayton81e871e2012-02-04 02:27:34 +00001642
Caroline Ticedde9cff2010-09-20 05:20:02 +00001643bool
Greg Claytoncfd1ace2010-10-31 03:01:06 +00001644SBValue::GetExpressionPath (SBStream &description)
1645{
Greg Clayton81e871e2012-02-04 02:27:34 +00001646 lldb::ValueObjectSP value_sp(GetSP());
1647 if (value_sp)
Greg Claytoncfd1ace2010-10-31 03:01:06 +00001648 {
Greg Clayton81e871e2012-02-04 02:27:34 +00001649 value_sp->GetExpressionPath (description.ref(), false);
Greg Clayton6beaaa62011-01-17 03:46:26 +00001650 return true;
1651 }
1652 return false;
1653}
1654
1655bool
1656SBValue::GetExpressionPath (SBStream &description, bool qualify_cxx_base_classes)
1657{
Greg Clayton81e871e2012-02-04 02:27:34 +00001658 lldb::ValueObjectSP value_sp(GetSP());
1659 if (value_sp)
Greg Clayton6beaaa62011-01-17 03:46:26 +00001660 {
Greg Clayton81e871e2012-02-04 02:27:34 +00001661 value_sp->GetExpressionPath (description.ref(), qualify_cxx_base_classes);
Greg Claytoncfd1ace2010-10-31 03:01:06 +00001662 return true;
1663 }
1664 return false;
1665}
1666
1667bool
Caroline Ticedde9cff2010-09-20 05:20:02 +00001668SBValue::GetDescription (SBStream &description)
1669{
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001670 Stream &strm = description.ref();
1671
Greg Clayton81e871e2012-02-04 02:27:34 +00001672 lldb::ValueObjectSP value_sp(GetSP());
1673 if (value_sp)
Caroline Ticedde9cff2010-09-20 05:20:02 +00001674 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001675 ProcessSP process_sp(value_sp->GetProcessSP());
1676 Process::StopLocker stop_locker;
1677 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
1678 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001679 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001680 if (log)
1681 log->Printf ("SBValue(%p)::GetDescription() => error: process is running", value_sp.get());
1682 }
1683 else
1684 {
1685 ValueObject::DumpValueObject (strm, value_sp.get());
1686 }
Caroline Ticedde9cff2010-09-20 05:20:02 +00001687 }
1688 else
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001689 strm.PutCString ("No value");
Caroline Ticedde9cff2010-09-20 05:20:02 +00001690
1691 return true;
1692}
Greg Claytondc4e9632011-01-05 18:43:15 +00001693
1694lldb::Format
Greg Claytonbf2331c2011-09-09 23:04:00 +00001695SBValue::GetFormat ()
Greg Claytondc4e9632011-01-05 18:43:15 +00001696{
Greg Clayton81e871e2012-02-04 02:27:34 +00001697 lldb::ValueObjectSP value_sp(GetSP());
1698 if (value_sp)
1699 return value_sp->GetFormat();
Greg Claytondc4e9632011-01-05 18:43:15 +00001700 return eFormatDefault;
1701}
1702
1703void
1704SBValue::SetFormat (lldb::Format format)
1705{
Greg Clayton81e871e2012-02-04 02:27:34 +00001706 lldb::ValueObjectSP value_sp(GetSP());
1707 if (value_sp)
1708 value_sp->SetFormat(format);
Greg Claytondc4e9632011-01-05 18:43:15 +00001709}
1710
Enrico Granata6f3533f2011-07-29 19:53:35 +00001711lldb::SBValue
1712SBValue::AddressOf()
1713{
1714 SBValue sb_value;
Greg Clayton81e871e2012-02-04 02:27:34 +00001715 lldb::ValueObjectSP value_sp(GetSP());
1716 if (value_sp)
Enrico Granata6f3533f2011-07-29 19:53:35 +00001717 {
Greg Claytoncc4d0142012-02-17 07:49:44 +00001718 TargetSP target_sp (value_sp->GetTargetSP());
1719 if (target_sp)
Enrico Granata6f3533f2011-07-29 19:53:35 +00001720 {
Greg Claytoncc4d0142012-02-17 07:49:44 +00001721 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Enrico Granata6f3533f2011-07-29 19:53:35 +00001722 Error error;
Enrico Granatae3e91512012-10-22 18:18:36 +00001723 sb_value.SetSP(value_sp->AddressOf (error),GetPreferDynamicValue(), GetPreferSyntheticValue());
Enrico Granata6f3533f2011-07-29 19:53:35 +00001724 }
1725 }
Greg Clayton5160ce52013-03-27 23:08:40 +00001726 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata6f3533f2011-07-29 19:53:35 +00001727 if (log)
Greg Claytoneac87f82012-06-04 20:13:23 +00001728 log->Printf ("SBValue(%p)::AddressOf () => SBValue(%p)", value_sp.get(), value_sp.get());
Enrico Granata6f3533f2011-07-29 19:53:35 +00001729
1730 return sb_value;
Johnny Chen4a871f92011-08-09 22:38:07 +00001731}
Enrico Granata9128ee22011-09-06 19:20:51 +00001732
1733lldb::addr_t
1734SBValue::GetLoadAddress()
1735{
1736 lldb::addr_t value = LLDB_INVALID_ADDRESS;
Greg Clayton81e871e2012-02-04 02:27:34 +00001737 lldb::ValueObjectSP value_sp(GetSP());
1738 if (value_sp)
Enrico Granata9128ee22011-09-06 19:20:51 +00001739 {
Greg Claytoncc4d0142012-02-17 07:49:44 +00001740 TargetSP target_sp (value_sp->GetTargetSP());
1741 if (target_sp)
Enrico Granata9128ee22011-09-06 19:20:51 +00001742 {
Greg Claytoncc4d0142012-02-17 07:49:44 +00001743 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Enrico Granata9128ee22011-09-06 19:20:51 +00001744 const bool scalar_is_load_address = true;
1745 AddressType addr_type;
Greg Clayton81e871e2012-02-04 02:27:34 +00001746 value = value_sp->GetAddressOf(scalar_is_load_address, &addr_type);
Enrico Granata9128ee22011-09-06 19:20:51 +00001747 if (addr_type == eAddressTypeFile)
1748 {
Greg Claytone72dfb32012-02-24 01:59:29 +00001749 ModuleSP module_sp (value_sp->GetModule());
1750 if (!module_sp)
Enrico Granata9128ee22011-09-06 19:20:51 +00001751 value = LLDB_INVALID_ADDRESS;
1752 else
1753 {
1754 Address addr;
Greg Claytone72dfb32012-02-24 01:59:29 +00001755 module_sp->ResolveFileAddress(value, addr);
Greg Claytoncc4d0142012-02-17 07:49:44 +00001756 value = addr.GetLoadAddress(target_sp.get());
Enrico Granata9128ee22011-09-06 19:20:51 +00001757 }
1758 }
1759 else if (addr_type == eAddressTypeHost || addr_type == eAddressTypeInvalid)
1760 value = LLDB_INVALID_ADDRESS;
1761 }
1762 }
Greg Clayton5160ce52013-03-27 23:08:40 +00001763 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata9128ee22011-09-06 19:20:51 +00001764 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00001765 log->Printf ("SBValue(%p)::GetLoadAddress () => (%" PRIu64 ")", value_sp.get(), value);
Enrico Granata9128ee22011-09-06 19:20:51 +00001766
1767 return value;
1768}
1769
1770lldb::SBAddress
1771SBValue::GetAddress()
1772{
1773 Address addr;
Greg Clayton81e871e2012-02-04 02:27:34 +00001774 lldb::ValueObjectSP value_sp(GetSP());
1775 if (value_sp)
Enrico Granata9128ee22011-09-06 19:20:51 +00001776 {
Greg Claytoncc4d0142012-02-17 07:49:44 +00001777 TargetSP target_sp (value_sp->GetTargetSP());
1778 if (target_sp)
Enrico Granata9128ee22011-09-06 19:20:51 +00001779 {
1780 lldb::addr_t value = LLDB_INVALID_ADDRESS;
Greg Claytoncc4d0142012-02-17 07:49:44 +00001781 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Enrico Granata9128ee22011-09-06 19:20:51 +00001782 const bool scalar_is_load_address = true;
1783 AddressType addr_type;
Greg Clayton81e871e2012-02-04 02:27:34 +00001784 value = value_sp->GetAddressOf(scalar_is_load_address, &addr_type);
Enrico Granata9128ee22011-09-06 19:20:51 +00001785 if (addr_type == eAddressTypeFile)
1786 {
Greg Claytone72dfb32012-02-24 01:59:29 +00001787 ModuleSP module_sp (value_sp->GetModule());
1788 if (module_sp)
1789 module_sp->ResolveFileAddress(value, addr);
Enrico Granata9128ee22011-09-06 19:20:51 +00001790 }
1791 else if (addr_type == eAddressTypeLoad)
1792 {
1793 // no need to check the return value on this.. if it can actually do the resolve
1794 // addr will be in the form (section,offset), otherwise it will simply be returned
1795 // as (NULL, value)
Greg Claytoncc4d0142012-02-17 07:49:44 +00001796 addr.SetLoadAddress(value, target_sp.get());
Enrico Granata9128ee22011-09-06 19:20:51 +00001797 }
1798 }
1799 }
Greg Clayton5160ce52013-03-27 23:08:40 +00001800 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata9128ee22011-09-06 19:20:51 +00001801 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00001802 log->Printf ("SBValue(%p)::GetAddress () => (%s,%" PRIu64 ")", value_sp.get(),
Jim Ingham35e1bda2012-10-16 21:41:58 +00001803 (addr.GetSection() ? addr.GetSection()->GetName().GetCString() : "NULL"),
1804 addr.GetOffset());
Enrico Granata9128ee22011-09-06 19:20:51 +00001805 return SBAddress(new Address(addr));
1806}
1807
1808lldb::SBData
1809SBValue::GetPointeeData (uint32_t item_idx,
1810 uint32_t item_count)
1811{
Greg Clayton5160ce52013-03-27 23:08:40 +00001812 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata9128ee22011-09-06 19:20:51 +00001813 lldb::SBData sb_data;
Greg Clayton81e871e2012-02-04 02:27:34 +00001814 lldb::ValueObjectSP value_sp(GetSP());
1815 if (value_sp)
Enrico Granata9128ee22011-09-06 19:20:51 +00001816 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001817 ProcessSP process_sp(value_sp->GetProcessSP());
1818 Process::StopLocker stop_locker;
1819 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granata9128ee22011-09-06 19:20:51 +00001820 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001821 if (log)
1822 log->Printf ("SBValue(%p)::GetPointeeData() => error: process is running", value_sp.get());
1823 }
1824 else
1825 {
1826 TargetSP target_sp (value_sp->GetTargetSP());
1827 if (target_sp)
1828 {
1829 DataExtractorSP data_sp(new DataExtractor());
1830 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1831 value_sp->GetPointeeData(*data_sp, item_idx, item_count);
1832 if (data_sp->GetByteSize() > 0)
1833 *sb_data = data_sp;
1834 }
Enrico Granata9128ee22011-09-06 19:20:51 +00001835 }
1836 }
Enrico Granata9128ee22011-09-06 19:20:51 +00001837 if (log)
1838 log->Printf ("SBValue(%p)::GetPointeeData (%d, %d) => SBData(%p)",
Greg Clayton81e871e2012-02-04 02:27:34 +00001839 value_sp.get(),
Enrico Granata9128ee22011-09-06 19:20:51 +00001840 item_idx,
1841 item_count,
1842 sb_data.get());
1843
1844 return sb_data;
1845}
1846
1847lldb::SBData
1848SBValue::GetData ()
1849{
Greg Clayton5160ce52013-03-27 23:08:40 +00001850 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata9128ee22011-09-06 19:20:51 +00001851 lldb::SBData sb_data;
Greg Clayton81e871e2012-02-04 02:27:34 +00001852 lldb::ValueObjectSP value_sp(GetSP());
1853 if (value_sp)
Enrico Granata9128ee22011-09-06 19:20:51 +00001854 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001855 ProcessSP process_sp(value_sp->GetProcessSP());
1856 Process::StopLocker stop_locker;
1857 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
Enrico Granata9128ee22011-09-06 19:20:51 +00001858 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001859 if (log)
1860 log->Printf ("SBValue(%p)::GetData() => error: process is running", value_sp.get());
1861 }
1862 else
1863 {
1864 TargetSP target_sp (value_sp->GetTargetSP());
1865 if (target_sp)
1866 {
1867 Mutex::Locker api_locker (target_sp->GetAPIMutex());
1868 DataExtractorSP data_sp(new DataExtractor());
1869 value_sp->GetData(*data_sp);
1870 if (data_sp->GetByteSize() > 0)
1871 *sb_data = data_sp;
1872 }
Enrico Granata9128ee22011-09-06 19:20:51 +00001873 }
1874 }
Enrico Granata9128ee22011-09-06 19:20:51 +00001875 if (log)
1876 log->Printf ("SBValue(%p)::GetData () => SBData(%p)",
Greg Clayton81e871e2012-02-04 02:27:34 +00001877 value_sp.get(),
Enrico Granata9128ee22011-09-06 19:20:51 +00001878 sb_data.get());
1879
1880 return sb_data;
1881}
Greg Clayton1b282f92011-10-13 18:08:26 +00001882
Sean Callanan389823e2013-04-13 01:21:23 +00001883bool
1884SBValue::SetData (lldb::SBData &data, SBError &error)
1885{
1886 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1887 lldb::ValueObjectSP value_sp(GetSP());
1888 bool ret = true;
1889
1890 if (value_sp)
1891 {
1892 ProcessSP process_sp(value_sp->GetProcessSP());
1893 Process::StopLocker stop_locker;
1894 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
1895 {
1896 if (log)
1897 log->Printf ("SBValue(%p)::SetData() => error: process is running", value_sp.get());
1898
1899 error.SetErrorString("Process is running");
1900 ret = false;
1901 }
1902 else
1903 {
1904 DataExtractor *data_extractor = data.get();
1905
1906 if (!data_extractor)
1907 {
1908 if (log)
1909 log->Printf ("SBValue(%p)::SetData() => error: no data to set", value_sp.get());
1910
1911 error.SetErrorString("No data to set");
1912 ret = false;
1913 }
1914 else
1915 {
1916 Error set_error;
1917
1918 value_sp->SetData(*data_extractor, set_error);
1919
1920 if (!set_error.Success())
1921 {
1922 error.SetErrorStringWithFormat("Couldn't set data: %s", set_error.AsCString());
1923 ret = false;
1924 }
1925 }
1926 }
1927 }
1928 else
1929 {
1930 error.SetErrorString("Couldn't set data: invalid SBValue");
1931 ret = false;
1932 }
1933
1934 if (log)
1935 log->Printf ("SBValue(%p)::SetData (%p) => %s",
1936 value_sp.get(),
1937 data.get(),
1938 ret ? "true" : "false");
1939 return ret;
1940}
1941
Enrico Granata10de0902012-10-10 22:54:17 +00001942lldb::SBDeclaration
1943SBValue::GetDeclaration ()
1944{
1945 lldb::ValueObjectSP value_sp(GetSP());
1946 SBDeclaration decl_sb;
1947 if (value_sp)
1948 {
1949 Declaration decl;
1950 if (value_sp->GetDeclaration(decl))
1951 decl_sb.SetDeclaration(decl);
1952 }
1953 return decl_sb;
1954}
1955
Greg Clayton1b282f92011-10-13 18:08:26 +00001956lldb::SBWatchpoint
Johnny Chenb90827e2012-06-04 23:19:54 +00001957SBValue::Watch (bool resolve_location, bool read, bool write, SBError &error)
Greg Clayton1b282f92011-10-13 18:08:26 +00001958{
Greg Clayton81e871e2012-02-04 02:27:34 +00001959 SBWatchpoint sb_watchpoint;
1960
1961 // If the SBValue is not valid, there's no point in even trying to watch it.
1962 lldb::ValueObjectSP value_sp(GetSP());
1963 TargetSP target_sp (GetTarget().GetSP());
1964 if (value_sp && target_sp)
Greg Clayton1b282f92011-10-13 18:08:26 +00001965 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001966 // Can't watch this if the process is running
1967 ProcessSP process_sp(value_sp->GetProcessSP());
1968 Process::StopLocker stop_locker;
1969 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock()))
1970 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001971 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001972 if (log)
1973 log->Printf ("SBValue(%p)::Watch() => error: process is running", value_sp.get());
1974 return sb_watchpoint;
1975 }
1976
Greg Clayton81e871e2012-02-04 02:27:34 +00001977 // Read and Write cannot both be false.
1978 if (!read && !write)
1979 return sb_watchpoint;
1980
1981 // If the value is not in scope, don't try and watch and invalid value
1982 if (!IsInScope())
1983 return sb_watchpoint;
1984
1985 addr_t addr = GetLoadAddress();
1986 if (addr == LLDB_INVALID_ADDRESS)
1987 return sb_watchpoint;
1988 size_t byte_size = GetByteSize();
1989 if (byte_size == 0)
1990 return sb_watchpoint;
1991
1992 uint32_t watch_type = 0;
1993 if (read)
1994 watch_type |= LLDB_WATCH_TYPE_READ;
1995 if (write)
1996 watch_type |= LLDB_WATCH_TYPE_WRITE;
1997
Johnny Chenb90827e2012-06-04 23:19:54 +00001998 Error rc;
Jim Inghama7dfb662012-10-23 07:20:06 +00001999 ClangASTType type (value_sp->GetClangAST(), value_sp->GetClangType());
2000 WatchpointSP watchpoint_sp = target_sp->CreateWatchpoint(addr, byte_size, &type, watch_type, rc);
Johnny Chenb90827e2012-06-04 23:19:54 +00002001 error.SetError(rc);
Greg Clayton81e871e2012-02-04 02:27:34 +00002002
2003 if (watchpoint_sp)
2004 {
2005 sb_watchpoint.SetSP (watchpoint_sp);
2006 Declaration decl;
2007 if (value_sp->GetDeclaration (decl))
2008 {
2009 if (decl.GetFile())
2010 {
2011 StreamString ss;
2012 // True to show fullpath for declaration file.
2013 decl.DumpStopContext(&ss, true);
2014 watchpoint_sp->SetDeclInfo(ss.GetString());
2015 }
2016 }
2017 }
Greg Clayton1b282f92011-10-13 18:08:26 +00002018 }
2019 return sb_watchpoint;
2020}
2021
Johnny Chend3761a72012-06-04 23:45:50 +00002022// FIXME: Remove this method impl (as well as the decl in .h) once it is no longer needed.
2023// Backward compatibility fix in the interim.
2024lldb::SBWatchpoint
2025SBValue::Watch (bool resolve_location, bool read, bool write)
2026{
Johnny Chen974759f2012-06-05 00:14:15 +00002027 SBError error;
2028 return Watch(resolve_location, read, write, error);
Johnny Chend3761a72012-06-04 23:45:50 +00002029}
2030
Greg Clayton1b282f92011-10-13 18:08:26 +00002031lldb::SBWatchpoint
Johnny Chenb90827e2012-06-04 23:19:54 +00002032SBValue::WatchPointee (bool resolve_location, bool read, bool write, SBError &error)
Greg Clayton1b282f92011-10-13 18:08:26 +00002033{
Greg Clayton81e871e2012-02-04 02:27:34 +00002034 SBWatchpoint sb_watchpoint;
2035 if (IsInScope() && GetType().IsPointerType())
Johnny Chenb90827e2012-06-04 23:19:54 +00002036 sb_watchpoint = Dereference().Watch (resolve_location, read, write, error);
Greg Clayton1b282f92011-10-13 18:08:26 +00002037 return sb_watchpoint;
2038}