|  | //===-- 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()); | 
|  | m_value.SetClangType (cast_type); | 
|  | } | 
|  |  | 
|  | ValueObjectCast::~ValueObjectCast() | 
|  | { | 
|  | } | 
|  |  | 
|  | ClangASTType | 
|  | ValueObjectCast::GetClangTypeImpl () | 
|  | { | 
|  | return m_cast_type; | 
|  | } | 
|  |  | 
|  | size_t | 
|  | ValueObjectCast::CalculateNumChildren() | 
|  | { | 
|  | return GetClangType().GetNumChildren (true); | 
|  | } | 
|  |  | 
|  | uint64_t | 
|  | ValueObjectCast::GetByteSize() | 
|  | { | 
|  | return m_value.GetValueByteSize(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(); | 
|  | ClangASTType clang_type (GetClangType()); | 
|  | //m_value.SetContext (Value::eContextTypeClangType, clang_type); | 
|  | m_value.SetClangType (clang_type); | 
|  | SetAddressTypeOfChildren(m_parent->GetAddressTypeOfChildren()); | 
|  | if (!CanProvideValue()) | 
|  | { | 
|  | // 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, 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(); | 
|  | } |