SBValue.cpp revision dfc91c368886f961b5cac95efc9adfe9be05cf73
13839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o//===-- SBValue.cpp ---------------------------------------------*- C++ -*-===//
23839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o//
33839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o//                     The LLVM Compiler Infrastructure
43839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o//
53839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o// This file is distributed under the University of Illinois Open Source
63839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o// License. See LICENSE.TXT for details.
73839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o//
8543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o//===----------------------------------------------------------------------===//
9543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o
10543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o#include "lldb/API/SBValue.h"
11543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o
123839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "lldb/Core/DataExtractor.h"
133839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "lldb/Core/Module.h"
143839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "lldb/Core/Stream.h"
153839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "lldb/Core/StreamFile.h"
163839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "lldb/Core/Value.h"
173839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "lldb/Core/ValueObject.h"
183839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "lldb/Symbol/Block.h"
1966d8c3f33f976e83ea0efd361bb5ac182315a421Theodore Ts'o#include "lldb/Symbol/ObjectFile.h"
2066d8c3f33f976e83ea0efd361bb5ac182315a421Theodore Ts'o#include "lldb/Symbol/Variable.h"
2166d8c3f33f976e83ea0efd361bb5ac182315a421Theodore Ts'o#include "lldb/Target/ExecutionContext.h"
2250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#include "lldb/Target/Process.h"
233839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "lldb/Target/StackFrame.h"
2450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#include "lldb/Target/Thread.h"
2550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
263839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "lldb/API/SBProcess.h"
2750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#include "lldb/API/SBTarget.h"
28023d111e92195624463e870146d0f386ba5c2d87Theodore Ts'o#include "lldb/API/SBThread.h"
2950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#include "lldb/API/SBFrame.h"
30023d111e92195624463e870146d0f386ba5c2d87Theodore Ts'o#include "lldb/API/SBDebugger.h"
3150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
323839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ousing namespace lldb;
3350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'ousing namespace lldb_private;
343839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
353839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oSBValue::SBValue () :
363839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o    m_opaque_sp ()
3766d8c3f33f976e83ea0efd361bb5ac182315a421Theodore Ts'o{
3866d8c3f33f976e83ea0efd361bb5ac182315a421Theodore Ts'o}
3966d8c3f33f976e83ea0efd361bb5ac182315a421Theodore Ts'o
4066d8c3f33f976e83ea0efd361bb5ac182315a421Theodore Ts'oSBValue::SBValue (const lldb::ValueObjectSP &value_sp) :
4166d8c3f33f976e83ea0efd361bb5ac182315a421Theodore Ts'o    m_opaque_sp (value_sp)
4266d8c3f33f976e83ea0efd361bb5ac182315a421Theodore Ts'o{
433839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
443839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
45cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'oSBValue::~SBValue()
463c203cb6831fdfe096bae7ce60c594725f70f47dTheodore Ts'o{
4750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
48cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o
49cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'obool
5050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oSBValue::IsValid () const
51cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o{
5250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o    return  (m_opaque_sp.get() != NULL);
53cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o}
54cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o
5550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oconst char *
5650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oSBValue::GetName()
57cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o{
58cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o    if (IsValid())
5950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o        return m_opaque_sp->GetName().AsCString();
6050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o    else
61cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o        return NULL;
62cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o}
6350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
6450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oconst char *
65cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'oSBValue::GetTypeName ()
66e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{
6750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o    if (IsValid())
68a8a813ee3321f3d8986a88c83903b933f1b35e8eTheodore Ts'o        return m_opaque_sp->GetTypeName().AsCString();
693839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o    else
701a4ce9df5884405a7152855b868c3a7bfbeec385Theodore Ts'o        return NULL;
71023d111e92195624463e870146d0f386ba5c2d87Theodore Ts'o}
72023d111e92195624463e870146d0f386ba5c2d87Theodore Ts'o
73023d111e92195624463e870146d0f386ba5c2d87Theodore Ts'osize_t
743c203cb6831fdfe096bae7ce60c594725f70f47dTheodore Ts'oSBValue::GetByteSize ()
7566d8c3f33f976e83ea0efd361bb5ac182315a421Theodore Ts'o{
763839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o    size_t result = 0;
773839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
78cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o    if (IsValid())
79a8a813ee3321f3d8986a88c83903b933f1b35e8eTheodore Ts'o        result = m_opaque_sp->GetByteSize();
80a8a813ee3321f3d8986a88c83903b933f1b35e8eTheodore Ts'o
81cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o    return result;
823839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
83a8a813ee3321f3d8986a88c83903b933f1b35e8eTheodore Ts'o
84a8a813ee3321f3d8986a88c83903b933f1b35e8eTheodore Ts'obool
853839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oSBValue::IsInScope (const SBFrame &frame)
86e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{
873c203cb6831fdfe096bae7ce60c594725f70f47dTheodore Ts'o    bool result = false;
883c203cb6831fdfe096bae7ce60c594725f70f47dTheodore Ts'o
893c203cb6831fdfe096bae7ce60c594725f70f47dTheodore Ts'o    if (IsValid())
903c203cb6831fdfe096bae7ce60c594725f70f47dTheodore Ts'o        result = m_opaque_sp->IsInScope (frame.get());
91e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
92e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    return result;
93023d111e92195624463e870146d0f386ba5c2d87Theodore Ts'o}
94023d111e92195624463e870146d0f386ba5c2d87Theodore Ts'o
9550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oconst char *
9650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oSBValue::GetValue (const SBFrame &frame)
973839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
98    const char *value_string = NULL;
99    if ( m_opaque_sp)
100        value_string = m_opaque_sp->GetValueAsCString (frame.get());
101    return value_string;
102}
103
104const char *
105SBValue::GetObjectDescription (const SBFrame &frame)
106{
107    const char *value_string = NULL;
108    if ( m_opaque_sp)
109        value_string = m_opaque_sp->GetObjectDescription (frame.get());
110    return value_string;
111}
112
113bool
114SBValue::GetValueDidChange (const SBFrame &frame)
115{
116    if (IsValid())
117        return m_opaque_sp->GetValueDidChange (frame.get());
118    return false;
119}
120
121const char *
122SBValue::GetSummary (const SBFrame &frame)
123{
124    const char *value_string = NULL;
125    if ( m_opaque_sp)
126        value_string = m_opaque_sp->GetSummaryAsCString(frame.get());
127    return value_string;
128}
129
130const char *
131SBValue::GetLocation (const SBFrame &frame)
132{
133    const char *value_string = NULL;
134    if (IsValid())
135        value_string = m_opaque_sp->GetLocationAsCString(frame.get());
136    return value_string;
137}
138
139bool
140SBValue::SetValueFromCString (const SBFrame &frame, const char *value_str)
141{
142    bool success = false;
143    if (IsValid())
144        success = m_opaque_sp->SetValueFromCString (frame.get(), value_str);
145    return success;
146}
147
148SBValue
149SBValue::GetChildAtIndex (uint32_t idx)
150{
151    lldb::ValueObjectSP child_sp;
152
153    if (IsValid())
154    {
155        child_sp = m_opaque_sp->GetChildAtIndex (idx, true);
156    }
157
158    SBValue sb_value (child_sp);
159    return sb_value;
160}
161
162uint32_t
163SBValue::GetIndexOfChildWithName (const char *name)
164{
165    if (IsValid())
166        return m_opaque_sp->GetIndexOfChildWithName (ConstString(name));
167    return UINT32_MAX;
168}
169
170SBValue
171SBValue::GetChildMemberWithName (const char *name)
172{
173    lldb::ValueObjectSP child_sp;
174    const ConstString str_name (name);
175
176    if (IsValid())
177    {
178        child_sp = m_opaque_sp->GetChildMemberWithName (str_name, true);
179    }
180
181    SBValue sb_value (child_sp);
182    return sb_value;
183}
184
185
186uint32_t
187SBValue::GetNumChildren ()
188{
189    uint32_t num_children = 0;
190
191    if (IsValid())
192    {
193        num_children = m_opaque_sp->GetNumChildren();
194    }
195
196    return num_children;
197}
198
199bool
200SBValue::ValueIsStale ()
201{
202    bool result = true;
203
204    if (IsValid())
205    {
206        result = m_opaque_sp->GetValueIsValid();
207    }
208
209    return result;
210}
211
212
213SBValue
214SBValue::Dereference ()
215{
216    if (IsValid())
217    {
218        if (m_opaque_sp->IsPointerType())
219        {
220            return GetChildAtIndex(0);
221        }
222    }
223    return *this;
224}
225
226bool
227SBValue::TypeIsPtrType ()
228{
229    bool is_ptr_type = false;
230
231    if (IsValid())
232    {
233        is_ptr_type = m_opaque_sp->IsPointerType();
234    }
235
236    return is_ptr_type;
237}
238
239void *
240SBValue::GetOpaqueType()
241{
242    if (m_opaque_sp)
243        return m_opaque_sp->GetOpaqueClangQualType();
244    return NULL;
245}
246
247// Mimic shared pointer...
248lldb_private::ValueObject *
249SBValue::get() const
250{
251    return m_opaque_sp.get();
252}
253
254lldb_private::ValueObject *
255SBValue::operator->() const
256{
257    return m_opaque_sp.get();
258}
259
260lldb::ValueObjectSP &
261SBValue::operator*()
262{
263    return m_opaque_sp;
264}
265
266const lldb::ValueObjectSP &
267SBValue::operator*() const
268{
269    return m_opaque_sp;
270}
271