diff options
Diffstat (limited to 'lldb/source/Core')
-rw-r--r-- | lldb/source/Core/ValueObject.cpp | 1 | ||||
-rw-r--r-- | lldb/source/Core/ValueObjectCast.cpp | 132 | ||||
-rw-r--r-- | lldb/source/Core/ValueObjectDynamicValue.cpp | 105 |
3 files changed, 134 insertions, 104 deletions
diff --git a/lldb/source/Core/ValueObject.cpp b/lldb/source/Core/ValueObject.cpp index f608f85f3cd..c3560f1089e 100644 --- a/lldb/source/Core/ValueObject.cpp +++ b/lldb/source/Core/ValueObject.cpp @@ -24,6 +24,7 @@ #include "lldb/Core/Log.h" #include "lldb/Core/Module.h" #include "lldb/Core/StreamString.h" +#include "lldb/Core/ValueObjectCast.h" #include "lldb/Core/ValueObjectChild.h" #include "lldb/Core/ValueObjectConstResult.h" #include "lldb/Core/ValueObjectDynamicValue.h" diff --git a/lldb/source/Core/ValueObjectCast.cpp b/lldb/source/Core/ValueObjectCast.cpp new file mode 100644 index 00000000000..7834c850874 --- /dev/null +++ b/lldb/source/Core/ValueObjectCast.cpp @@ -0,0 +1,132 @@ +//===-- ValueObjectDynamicValue.cpp ---------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + + +#include "lldb/Core/ValueObjectCast.h" + +// C Includes +// C++ Includes +// Other libraries and framework includes +// Project includes +#include "lldb/Core/Log.h" +#include "lldb/Core/Module.h" +#include "lldb/Core/ValueObjectList.h" +#include "lldb/Core/Value.h" +#include "lldb/Core/ValueObject.h" + +#include "lldb/Symbol/ClangASTType.h" +#include "lldb/Symbol/ObjectFile.h" +#include "lldb/Symbol/SymbolContext.h" +#include "lldb/Symbol/Type.h" +#include "lldb/Symbol/Variable.h" + +#include "lldb/Target/ExecutionContext.h" +#include "lldb/Target/LanguageRuntime.h" +#include "lldb/Target/Process.h" +#include "lldb/Target/RegisterContext.h" +#include "lldb/Target/Target.h" +#include "lldb/Target/Thread.h" + +using namespace lldb_private; + +lldb::ValueObjectSP +ValueObjectCast::Create (ValueObject &parent, + const ConstString &name, + const ClangASTType &cast_type) +{ + ValueObjectCast *cast_valobj_ptr = new ValueObjectCast (parent, name, cast_type); + return cast_valobj_ptr->GetSP(); +} + +ValueObjectCast::ValueObjectCast +( + ValueObject &parent, + const ConstString &name, + const ClangASTType &cast_type +) : + ValueObject(parent), + m_cast_type (cast_type) +{ + SetName (name); + m_value.SetContext (Value::eContextTypeClangType, cast_type.GetOpaqueQualType()); +} + +ValueObjectCast::~ValueObjectCast() +{ +} + +lldb::clang_type_t +ValueObjectCast::GetClangTypeImpl () +{ + return m_cast_type.GetOpaqueQualType(); +} + +uint32_t +ValueObjectCast::CalculateNumChildren() +{ + return ClangASTContext::GetNumChildren (GetClangAST (), GetClangType(), true); +} + +clang::ASTContext * +ValueObjectCast::GetClangASTImpl () +{ + return m_cast_type.GetASTContext(); +} + +size_t +ValueObjectCast::GetByteSize() +{ + return m_value.GetValueByteSize(GetClangAST(), NULL); +} + +lldb::ValueType +ValueObjectCast::GetValueType() const +{ + // Let our parent answer global, local, argument, etc... + return m_parent->GetValueType(); +} + +bool +ValueObjectCast::UpdateValue () +{ + SetValueIsValid (false); + m_error.Clear(); + + if (m_parent->UpdateValueIfNeeded(false)) + { + Value old_value(m_value); + m_update_point.SetUpdated(); + m_value = m_parent->GetValue(); + m_value.SetContext (Value::eContextTypeClangType, GetClangType()); + SetAddressTypeOfChildren(m_parent->GetAddressTypeOfChildren()); + if (ClangASTContext::IsAggregateType (GetClangType())) + { + // this value object represents an aggregate type whose + // children have values, but this object does not. So we + // say we are changed if our location has changed. + SetValueDidChange (m_value.GetValueType() != old_value.GetValueType() || m_value.GetScalar() != old_value.GetScalar()); + } + ExecutionContext exe_ctx (GetExecutionContextRef()); + m_error = m_value.GetValueAsData(&exe_ctx, GetClangAST(), m_data, 0, GetModule().get()); + SetValueDidChange (m_parent->GetValueDidChange()); + return true; + } + + // The dynamic value failed to get an error, pass the error along + if (m_error.Success() && m_parent->GetError().Fail()) + m_error = m_parent->GetError(); + SetValueIsValid (false); + return false; +} + +bool +ValueObjectCast::IsInScope () +{ + return m_parent->IsInScope(); +} diff --git a/lldb/source/Core/ValueObjectDynamicValue.cpp b/lldb/source/Core/ValueObjectDynamicValue.cpp index dfddbd97c95..2b5c605dee6 100644 --- a/lldb/source/Core/ValueObjectDynamicValue.cpp +++ b/lldb/source/Core/ValueObjectDynamicValue.cpp @@ -20,6 +20,7 @@ #include "lldb/Core/Value.h" #include "lldb/Core/ValueObject.h" +#include "lldb/Symbol/ClangASTType.h" #include "lldb/Symbol/ObjectFile.h" #include "lldb/Symbol/SymbolContext.h" #include "lldb/Symbol/Type.h" @@ -32,112 +33,8 @@ #include "lldb/Target/Target.h" #include "lldb/Target/Thread.h" - using namespace lldb_private; -lldb::ValueObjectSP -ValueObjectCast::Create (ValueObject &parent, - const ConstString &name, - const ClangASTType &cast_type) -{ - ValueObjectCast *cast_valobj_ptr = new ValueObjectCast (parent, name, cast_type); - return cast_valobj_ptr->GetSP(); -} - -ValueObjectCast::ValueObjectCast -( - ValueObject &parent, - const ConstString &name, - const ClangASTType &cast_type -) : - ValueObject(parent), - m_cast_type (cast_type) -{ - SetName (name); - m_value.SetContext (Value::eContextTypeClangType, cast_type.GetOpaqueQualType()); -} - -ValueObjectCast::~ValueObjectCast() -{ -} - -lldb::clang_type_t -ValueObjectCast::GetClangTypeImpl () -{ - return m_cast_type.GetOpaqueQualType(); -} - -uint32_t -ValueObjectCast::CalculateNumChildren() -{ - return ClangASTContext::GetNumChildren (GetClangAST (), GetClangType(), true); -} - -clang::ASTContext * -ValueObjectCast::GetClangASTImpl () -{ - return m_cast_type.GetASTContext(); -} - -size_t -ValueObjectCast::GetByteSize() -{ - return m_value.GetValueByteSize(GetClangAST(), NULL); -} - -lldb::ValueType -ValueObjectCast::GetValueType() const -{ - // Let our parent answer global, local, argument, etc... - return m_parent->GetValueType(); -} - -bool -ValueObjectCast::UpdateValue () -{ - SetValueIsValid (false); - m_error.Clear(); - - if (m_parent->UpdateValueIfNeeded(false)) - { - Value old_value(m_value); - m_update_point.SetUpdated(); - m_value = m_parent->GetValue(); - m_value.SetContext (Value::eContextTypeClangType, GetClangType()); - SetAddressTypeOfChildren(m_parent->GetAddressTypeOfChildren()); - if (ClangASTContext::IsAggregateType (GetClangType())) - { - // this value object represents an aggregate type whose - // children have values, but this object does not. So we - // say we are changed if our location has changed. - SetValueDidChange (m_value.GetValueType() != old_value.GetValueType() || m_value.GetScalar() != old_value.GetScalar()); - } - ExecutionContext exe_ctx (GetExecutionContextRef()); - m_error = m_value.GetValueAsData(&exe_ctx, GetClangAST(), m_data, 0, GetModule().get()); - SetValueDidChange (m_parent->GetValueDidChange()); - return true; - } - - // The dynamic value failed to get an error, pass the error along - if (m_error.Success() && m_parent->GetError().Fail()) - m_error = m_parent->GetError(); - SetValueIsValid (false); - return false; -} - - - -bool -ValueObjectCast::IsInScope () -{ - return m_parent->IsInScope(); -} - -//---------------------------------------------------------------------- - - - - ValueObjectDynamicValue::ValueObjectDynamicValue (ValueObject &parent, lldb::DynamicValueType use_dynamic) : ValueObject(parent), m_address (), |