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 (),