Fixed casting in the lldb::SBValue::Cast(SBType) function.
git-svn-id: https://llvm.org/svn/llvm-project/lldb/trunk@149673 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/API/SBValue.cpp b/source/API/SBValue.cpp
index 96182e3..58a718b 100644
--- a/source/API/SBValue.cpp
+++ b/source/API/SBValue.cpp
@@ -378,8 +378,8 @@
SBValue::Cast (SBType type)
{
lldb::SBValue sb_value;
- if (m_opaque_sp)
- sb_value = CreateChildAtOffset(m_opaque_sp->GetName().GetCString(), 0, type);
+ if (m_opaque_sp && type.IsValid())
+ *sb_value = m_opaque_sp->Cast(type.ref().GetClangASTType());
return sb_value;
}
diff --git a/source/Core/ValueObject.cpp b/source/Core/ValueObject.cpp
index dbf5bc6..60eaa3a 100644
--- a/source/Core/ValueObject.cpp
+++ b/source/Core/ValueObject.cpp
@@ -3429,6 +3429,12 @@
return m_addr_of_valobj_sp;
}
+ValueObjectSP
+ValueObject::Cast (const ClangASTType &clang_ast_type)
+{
+ ValueObjectSP valobj_sp(new ValueObjectCast (*this, GetName(), clang_ast_type));
+ return valobj_sp;
+}
ValueObjectSP
ValueObject::CastPointerType (const char *name, ClangASTType &clang_ast_type)
diff --git a/source/Core/ValueObjectDynamicValue.cpp b/source/Core/ValueObjectDynamicValue.cpp
index c053362..b55d927 100644
--- a/source/Core/ValueObjectDynamicValue.cpp
+++ b/source/Core/ValueObjectDynamicValue.cpp
@@ -34,6 +34,107 @@
using namespace lldb_private;
+
+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::GetClangType ()
+{
+ return m_cast_type.GetOpaqueQualType();
+}
+
+ConstString
+ValueObjectCast::GetTypeName()
+{
+ return ClangASTType::GetConstTypeName (GetClangType());
+}
+
+uint32_t
+ValueObjectCast::CalculateNumChildren()
+{
+ return ClangASTContext::GetNumChildren (GetClangAST (), GetClangType(), true);
+}
+
+clang::ASTContext *
+ValueObjectCast::GetClangAST ()
+{
+ 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 (GetExecutionContextScope());
+ m_error = m_value.GetValueAsData(&exe_ctx, GetClangAST(), m_data, 0, GetModule());
+ 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 (),