26 namespace formatters {
36 lldb::ValueObjectSP GetChildAtIndex(
size_t idx)
override;
38 bool Update()
override;
40 bool MightHaveChildren()
override;
42 size_t GetIndexOfChildWithName(
ConstString name)
override;
48 size_t m_num_elements = 0;
65 return m_num_elements;
71 return lldb::ValueObjectSP();
72 if (m_tree ==
nullptr)
73 return lldb::ValueObjectSP();
75 while (idx >= m_elements_cache.size()) {
76 if (m_next_element ==
nullptr)
77 return lldb::ValueObjectSP();
80 ValueObjectSP node_sp = m_next_element->Dereference(
error);
81 if (!node_sp ||
error.Fail())
82 return lldb::ValueObjectSP();
84 ValueObjectSP value_sp =
85 node_sp->GetChildMemberWithName(
ConstString(
"__value_"),
true);
86 ValueObjectSP hash_sp =
87 node_sp->GetChildMemberWithName(
ConstString(
"__hash_"),
true);
88 if (!hash_sp || !value_sp) {
89 if (!m_element_type) {
90 auto p1_sp = m_backend.GetChildAtNamePath({
ConstString(
"__table_"),
95 ValueObjectSP first_sp =
nullptr;
96 switch (p1_sp->GetCompilerType().GetNumDirectBaseClasses()) {
99 first_sp = p1_sp->GetChildMemberWithName(
ConstString(
"__first_"),
104 ValueObjectSP first_elem_parent_sp =
105 p1_sp->GetChildAtIndex(0,
true);
106 first_sp = p1_sp->GetChildMemberWithName(
ConstString(
"__value_"),
116 m_element_type = first_sp->GetCompilerType();
117 m_element_type = m_element_type.GetTypeTemplateArgument(0);
118 m_element_type = m_element_type.GetPointeeType();
119 m_node_type = m_element_type;
120 m_element_type = m_element_type.GetTypeTemplateArgument(0);
123 m_element_type.GetFieldAtIndex(0, name,
nullptr,
nullptr,
nullptr);
124 m_element_type = m_element_type.GetTypedefedType();
128 node_sp = node_sp->Cast(m_node_type);
129 value_sp = node_sp->GetChildMemberWithName(
ConstString(
"__value_"),
true);
130 hash_sp = node_sp->GetChildMemberWithName(
ConstString(
"__hash_"),
true);
131 if (!value_sp || !hash_sp)
134 m_elements_cache.push_back(
135 {value_sp.get(), hash_sp->GetValueAsUnsigned(0)});
137 node_sp->GetChildMemberWithName(
ConstString(
"__next_"),
true).get();
138 if (!m_next_element || m_next_element->GetValueAsUnsigned(0) == 0)
139 m_next_element =
nullptr;
142 std::pair<ValueObject *, uint64_t> val_hash = m_elements_cache[idx];
144 return lldb::ValueObjectSP();
146 stream.
Printf(
"[%" PRIu64
"]", (uint64_t)idx);
149 val_hash.first->GetData(data,
error);
151 return lldb::ValueObjectSP();
152 const bool thread_and_frame_only_if_stopped =
true;
154 thread_and_frame_only_if_stopped);
155 return CreateValueObjectFromData(stream.
GetString(), data, exe_ctx,
156 val_hash.first->GetCompilerType());
162 m_next_element =
nullptr;
163 m_elements_cache.clear();
164 ValueObjectSP table_sp =
165 m_backend.GetChildMemberWithName(
ConstString(
"__table_"),
true);
169 ValueObjectSP p2_sp = table_sp->GetChildMemberWithName(
171 ValueObjectSP num_elements_sp =
nullptr;
172 llvm::SmallVector<ConstString, 3> next_path;
173 switch (p2_sp->GetCompilerType().GetNumDirectBaseClasses()) {
176 num_elements_sp = p2_sp->GetChildMemberWithName(
183 ValueObjectSP first_elem_parent = p2_sp->GetChildAtIndex(0,
true);
184 num_elements_sp = first_elem_parent->GetChildMemberWithName(
194 if (!num_elements_sp)
197 m_tree = table_sp->GetChildAtNamePath(next_path).get();
198 if (m_tree ==
nullptr)
201 m_num_elements = num_elements_sp->GetValueAsUnsigned(0);
203 if (m_num_elements > 0)
205 table_sp->GetChildAtNamePath(next_path).get();