Index: include/lldb/Core/ValueObjectCast.h =================================================================== --- include/lldb/Core/ValueObjectCast.h +++ include/lldb/Core/ValueObjectCast.h @@ -71,11 +71,11 @@ ClangASTType m_cast_type; -private: ValueObjectCast (ValueObject &parent, const ConstString &name, const ClangASTType &cast_type); +private: //------------------------------------------------------------------ // For ValueObject only //------------------------------------------------------------------ Index: include/lldb/Core/ValueObjectConstResult.h =================================================================== --- include/lldb/Core/ValueObjectConstResult.h +++ include/lldb/Core/ValueObjectConstResult.h @@ -131,6 +131,9 @@ virtual lldb::LanguageType GetPreferredDisplayLanguage (); + virtual lldb::ValueObjectSP + Cast (const ClangASTType &clang_ast_type); + protected: virtual bool UpdateValue (); Index: include/lldb/Core/ValueObjectConstResultCast.h =================================================================== --- /dev/null +++ include/lldb/Core/ValueObjectConstResultCast.h @@ -0,0 +1,77 @@ +//===-- ValueObjectConstResultCast.h ----------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef liblldb_ValueObjectConstResultCast_h_ +#define liblldb_ValueObjectConstResultCast_h_ + +// C Includes +// C++ Includes +// Other libraries and framework includes +// Project includes +#include "lldb/Core/ValueObjectCast.h" +#include "lldb/Core/ValueObjectConstResultImpl.h" + +namespace lldb_private { + +class ValueObjectConstResultCast : public ValueObjectCast +{ +public: + ValueObjectConstResultCast ( + ValueObject &parent, + const ConstString &name, + const ClangASTType &cast_type, + lldb::addr_t live_address = LLDB_INVALID_ADDRESS); + + virtual + ~ValueObjectConstResultCast (); + + virtual lldb::ValueObjectSP + Dereference (Error &error); + + virtual ValueObject * + CreateChildAtIndex (size_t idx, + bool synthetic_array_member, + int32_t synthetic_index); + + virtual ClangASTType + GetClangType () + { + return ValueObjectCast::GetClangType(); + } + + virtual lldb::ValueObjectSP + GetSyntheticChildAtOffset(uint32_t offset, + const ClangASTType& type, + bool can_create); + + virtual lldb::ValueObjectSP + AddressOf (Error &error); + + virtual size_t + GetPointeeData (DataExtractor& data, + uint32_t item_idx = 0, + uint32_t item_count = 1); + + virtual lldb::ValueObjectSP + Cast (const ClangASTType &clang_ast_type); + +protected: + ValueObjectConstResultImpl m_impl; + +private: + friend class ValueObject; + friend class ValueObjectConstResult; + friend class ValueObjectConstResultImpl; + + DISALLOW_COPY_AND_ASSIGN (ValueObjectConstResultCast); +}; + +} // namespace lldb_private + +#endif // liblldb_ValueObjectConstResultCast_h_ Index: include/lldb/Core/ValueObjectConstResultChild.h =================================================================== --- include/lldb/Core/ValueObjectConstResultChild.h +++ include/lldb/Core/ValueObjectConstResultChild.h @@ -34,7 +34,8 @@ uint32_t bitfield_bit_size, uint32_t bitfield_bit_offset, bool is_base_class, - bool is_deref_of_parent); + bool is_deref_of_parent, + lldb::addr_t live_address = LLDB_INVALID_ADDRESS); virtual ~ValueObjectConstResultChild(); @@ -60,6 +61,9 @@ GetPointeeData (DataExtractor& data, uint32_t item_idx = 0, uint32_t item_count = 1); + + virtual lldb::ValueObjectSP + Cast (const ClangASTType &clang_ast_type); protected: ValueObjectConstResultImpl m_impl; Index: include/lldb/Core/ValueObjectConstResultImpl.h =================================================================== --- include/lldb/Core/ValueObjectConstResultImpl.h +++ include/lldb/Core/ValueObjectConstResultImpl.h @@ -52,6 +52,9 @@ { return m_live_address; } + + lldb::ValueObjectSP + Cast (const ClangASTType &clang_ast_type); void SetLiveAddress(lldb::addr_t addr = LLDB_INVALID_ADDRESS, Index: source/Core/CMakeLists.txt =================================================================== --- source/Core/CMakeLists.txt +++ source/Core/CMakeLists.txt @@ -65,6 +65,7 @@ ValueObjectCast.cpp ValueObjectChild.cpp ValueObjectConstResult.cpp + ValueObjectConstResultCast.cpp ValueObjectConstResultChild.cpp ValueObjectConstResultImpl.cpp ValueObjectDynamicValue.cpp Index: source/Core/ValueObjectConstResult.cpp =================================================================== --- source/Core/ValueObjectConstResult.cpp +++ source/Core/ValueObjectConstResult.cpp @@ -365,6 +365,12 @@ return ValueObjectSP(); } +lldb::ValueObjectSP +ValueObjectConstResult::Cast (const ClangASTType &clang_ast_type) +{ + return m_impl.Cast(clang_ast_type); +} + lldb::LanguageType ValueObjectConstResult::GetPreferredDisplayLanguage () { Index: source/Core/ValueObjectConstResultCast.cpp =================================================================== --- /dev/null +++ source/Core/ValueObjectConstResultCast.cpp @@ -0,0 +1,75 @@ +//===-- ValueObjectConstResultCast.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/ValueObjectConstResultCast.h" + +#include "lldb/Core/ValueObjectConstResult.h" +#include "lldb/Core/ValueObjectList.h" + +#include "lldb/Symbol/ClangASTContext.h" + +using namespace lldb_private; + +ValueObjectConstResultCast::ValueObjectConstResultCast( + ValueObject &parent, + const ConstString &name, + const ClangASTType &cast_type, + lldb::addr_t live_address) : + ValueObjectCast (parent, name, cast_type), + m_impl(this, live_address) +{ + m_name = name; +} + +ValueObjectConstResultCast::~ValueObjectConstResultCast() +{ +} + +lldb::ValueObjectSP +ValueObjectConstResultCast::Dereference (Error &error) +{ + return m_impl.Dereference(error); +} + +lldb::ValueObjectSP +ValueObjectConstResultCast::GetSyntheticChildAtOffset(uint32_t offset, + const ClangASTType& type, + bool can_create) +{ + return m_impl.GetSyntheticChildAtOffset(offset, type, can_create); +} + +lldb::ValueObjectSP +ValueObjectConstResultCast::AddressOf (Error &error) +{ + return m_impl.AddressOf(error); +} + +ValueObject * +ValueObjectConstResultCast::CreateChildAtIndex (size_t idx, + bool synthetic_array_member, + int32_t synthetic_index) +{ + return m_impl.CreateChildAtIndex( + idx, synthetic_array_member, synthetic_index); +} + +size_t +ValueObjectConstResultCast::GetPointeeData (DataExtractor& data, + uint32_t item_idx, + uint32_t item_count) +{ + return m_impl.GetPointeeData(data, item_idx, item_count); +} + +lldb::ValueObjectSP +ValueObjectConstResultCast::Cast (const ClangASTType &clang_ast_type) +{ + return m_impl.Cast(clang_ast_type); +} Index: source/Core/ValueObjectConstResultChild.cpp =================================================================== --- source/Core/ValueObjectConstResultChild.cpp +++ source/Core/ValueObjectConstResultChild.cpp @@ -26,7 +26,8 @@ uint32_t bitfield_bit_size, uint32_t bitfield_bit_offset, bool is_base_class, - bool is_deref_of_parent + bool is_deref_of_parent, + lldb::addr_t live_address ) : ValueObjectChild (parent, clang_type, @@ -38,7 +39,7 @@ is_base_class, is_deref_of_parent, eAddressTypeLoad), - m_impl(this) + m_impl(this, live_address) { m_name = name; } @@ -78,3 +79,9 @@ { return m_impl.GetPointeeData(data, item_idx, item_count); } + +lldb::ValueObjectSP +ValueObjectConstResultChild::Cast (const ClangASTType &clang_ast_type) +{ + return m_impl.Cast(clang_ast_type); +} Index: source/Core/ValueObjectConstResultImpl.cpp =================================================================== --- source/Core/ValueObjectConstResultImpl.cpp +++ source/Core/ValueObjectConstResultImpl.cpp @@ -11,6 +11,7 @@ #include "lldb/Core/ValueObjectChild.h" #include "lldb/Core/ValueObjectConstResult.h" +#include "lldb/Core/ValueObjectConstResultCast.h" #include "lldb/Core/ValueObjectConstResultChild.h" #include "lldb/Core/ValueObjectMemory.h" #include "lldb/Core/DataExtractor.h" @@ -96,7 +97,11 @@ ConstString child_name; if (!child_name_str.empty()) child_name.SetCString (child_name_str.c_str()); - + + lldb::addr_t child_addr = m_live_address; + if (child_addr != LLDB_INVALID_ADDRESS) + child_addr += child_byte_offset; + valobj = new ValueObjectConstResultChild (*m_impl_backend, child_clang_type, child_name, @@ -105,7 +110,8 @@ child_bitfield_bit_size, child_bitfield_bit_offset, child_is_base_class, - child_is_deref_of_parent); + child_is_deref_of_parent, + child_addr); if (m_live_address != LLDB_INVALID_ADDRESS) valobj->m_impl.SetLiveAddress(m_live_address+child_byte_offset); } @@ -155,6 +161,17 @@ return m_impl_backend->ValueObject::AddressOf(error); } +lldb::ValueObjectSP +ValueObjectConstResultImpl::Cast (const ClangASTType &clang_ast_type) +{ + if (m_impl_backend == NULL) + return lldb::ValueObjectSP(); + + ValueObjectConstResultCast *result_cast = new ValueObjectConstResultCast( + *m_impl_backend, m_impl_backend->GetName(), clang_ast_type, m_live_address); + return result_cast->GetSP(); +} + lldb::addr_t ValueObjectConstResultImpl::GetAddressOf (bool scalar_is_load_address, AddressType *address_type)