|  | //===-- LibCxxInitializerList.cpp -------------------------------*- C++ -*-===// | 
|  | // | 
|  | //                     The LLVM Compiler Infrastructure | 
|  | // | 
|  | // This file is distributed under the University of Illinois Open Source | 
|  | // License. See LICENSE.TXT for details. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | // C Includes | 
|  | // C++ Includes | 
|  | // Other libraries and framework includes | 
|  | // Project includes | 
|  | #include "LibCxx.h" | 
|  |  | 
|  | #include "lldb/Core/ConstString.h" | 
|  | #include "lldb/Core/ValueObject.h" | 
|  | #include "lldb/DataFormatters/FormattersHelpers.h" | 
|  |  | 
|  | using namespace lldb; | 
|  | using namespace lldb_private; | 
|  | using namespace lldb_private::formatters; | 
|  |  | 
|  | namespace lldb_private { | 
|  | namespace formatters { | 
|  | class LibcxxInitializerListSyntheticFrontEnd | 
|  | : public SyntheticChildrenFrontEnd { | 
|  | public: | 
|  | LibcxxInitializerListSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp); | 
|  |  | 
|  | ~LibcxxInitializerListSyntheticFrontEnd() override; | 
|  |  | 
|  | size_t CalculateNumChildren() override; | 
|  |  | 
|  | lldb::ValueObjectSP GetChildAtIndex(size_t idx) override; | 
|  |  | 
|  | bool Update() override; | 
|  |  | 
|  | bool MightHaveChildren() override; | 
|  |  | 
|  | size_t GetIndexOfChildWithName(const ConstString &name) override; | 
|  |  | 
|  | private: | 
|  | ValueObject *m_start; | 
|  | CompilerType m_element_type; | 
|  | uint32_t m_element_size; | 
|  | size_t m_num_elements; | 
|  | }; | 
|  | } // namespace formatters | 
|  | } // namespace lldb_private | 
|  |  | 
|  | lldb_private::formatters::LibcxxInitializerListSyntheticFrontEnd:: | 
|  | LibcxxInitializerListSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp) | 
|  | : SyntheticChildrenFrontEnd(*valobj_sp), m_start(nullptr), m_element_type(), | 
|  | m_element_size(0), m_num_elements(0) { | 
|  | if (valobj_sp) | 
|  | Update(); | 
|  | } | 
|  |  | 
|  | lldb_private::formatters::LibcxxInitializerListSyntheticFrontEnd:: | 
|  | ~LibcxxInitializerListSyntheticFrontEnd() { | 
|  | // this needs to stay around because it's a child object who will follow its | 
|  | // parent's life cycle | 
|  | // delete m_start; | 
|  | } | 
|  |  | 
|  | size_t lldb_private::formatters::LibcxxInitializerListSyntheticFrontEnd:: | 
|  | CalculateNumChildren() { | 
|  | static ConstString g___size_("__size_"); | 
|  | m_num_elements = 0; | 
|  | ValueObjectSP size_sp(m_backend.GetChildMemberWithName(g___size_, true)); | 
|  | if (size_sp) | 
|  | m_num_elements = size_sp->GetValueAsUnsigned(0); | 
|  | return m_num_elements; | 
|  | } | 
|  |  | 
|  | lldb::ValueObjectSP lldb_private::formatters:: | 
|  | LibcxxInitializerListSyntheticFrontEnd::GetChildAtIndex(size_t idx) { | 
|  | if (!m_start) | 
|  | return lldb::ValueObjectSP(); | 
|  |  | 
|  | uint64_t offset = idx * m_element_size; | 
|  | offset = offset + m_start->GetValueAsUnsigned(0); | 
|  | StreamString name; | 
|  | name.Printf("[%" PRIu64 "]", (uint64_t)idx); | 
|  | return CreateValueObjectFromAddress(name.GetData(), offset, | 
|  | m_backend.GetExecutionContextRef(), | 
|  | m_element_type); | 
|  | } | 
|  |  | 
|  | bool lldb_private::formatters::LibcxxInitializerListSyntheticFrontEnd:: | 
|  | Update() { | 
|  | static ConstString g___begin_("__begin_"); | 
|  |  | 
|  | m_start = nullptr; | 
|  | m_num_elements = 0; | 
|  | lldb::TemplateArgumentKind kind; | 
|  | m_element_type = m_backend.GetCompilerType().GetTemplateArgument(0, kind); | 
|  | if (kind != lldb::eTemplateArgumentKindType || !m_element_type.IsValid()) | 
|  | return false; | 
|  |  | 
|  | m_element_size = m_element_type.GetByteSize(nullptr); | 
|  |  | 
|  | if (m_element_size > 0) | 
|  | m_start = | 
|  | m_backend.GetChildMemberWithName(g___begin_, true) | 
|  | .get(); // store raw pointers or end up with a circular dependency | 
|  |  | 
|  | return false; | 
|  | } | 
|  |  | 
|  | bool lldb_private::formatters::LibcxxInitializerListSyntheticFrontEnd:: | 
|  | MightHaveChildren() { | 
|  | return true; | 
|  | } | 
|  |  | 
|  | size_t lldb_private::formatters::LibcxxInitializerListSyntheticFrontEnd:: | 
|  | GetIndexOfChildWithName(const ConstString &name) { | 
|  | if (!m_start) | 
|  | return UINT32_MAX; | 
|  | return ExtractIndexFromString(name.GetCString()); | 
|  | } | 
|  |  | 
|  | lldb_private::SyntheticChildrenFrontEnd * | 
|  | lldb_private::formatters::LibcxxInitializerListSyntheticFrontEndCreator( | 
|  | CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) { | 
|  | return (valobj_sp ? new LibcxxInitializerListSyntheticFrontEnd(valobj_sp) | 
|  | : nullptr); | 
|  | } |