@@ -238,7 +238,8 @@ lldb_private::formatters::LibCxxVectorIteratorSyntheticFrontEndCreator(
238238
239239lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd::
240240 LibcxxSharedPtrSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp)
241- : SyntheticChildrenFrontEnd(*valobj_sp), m_cntrl(nullptr ) {
241+ : SyntheticChildrenFrontEnd(*valobj_sp), m_cntrl(nullptr ),
242+ m_ptr_obj(nullptr ) {
242243 if (valobj_sp)
243244 Update ();
244245}
@@ -251,28 +252,25 @@ llvm::Expected<uint32_t> lldb_private::formatters::
251252lldb::ValueObjectSP
252253lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd::GetChildAtIndex (
253254 uint32_t idx) {
254- if (!m_cntrl)
255+ if (!m_cntrl || !m_ptr_obj )
255256 return lldb::ValueObjectSP ();
256257
257258 ValueObjectSP valobj_sp = m_backend.GetSP ();
258259 if (!valobj_sp)
259260 return lldb::ValueObjectSP ();
260261
261262 if (idx == 0 )
262- return valobj_sp-> GetChildMemberWithName ( " __ptr_ " );
263+ return m_ptr_obj-> GetSP ( );
263264
264265 if (idx == 1 ) {
265- if (auto ptr_sp = valobj_sp->GetChildMemberWithName (" __ptr_" )) {
266- Status status;
267- auto value_type_sp =
268- valobj_sp->GetCompilerType ()
269- .GetTypeTemplateArgument (0 ).GetPointerType ();
270- ValueObjectSP cast_ptr_sp = ptr_sp->Cast (value_type_sp);
271- ValueObjectSP value_sp = cast_ptr_sp->Dereference (status);
272- if (status.Success ()) {
273- return value_sp;
274- }
275- }
266+ Status status;
267+ auto value_type_sp = valobj_sp->GetCompilerType ()
268+ .GetTypeTemplateArgument (0 )
269+ .GetPointerType ();
270+ ValueObjectSP cast_ptr_sp = m_ptr_obj->Cast (value_type_sp);
271+ ValueObjectSP value_sp = cast_ptr_sp->Dereference (status);
272+ if (status.Success ())
273+ return value_sp;
276274 }
277275
278276 return lldb::ValueObjectSP ();
@@ -281,6 +279,7 @@ lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd::GetChildAtIndex(
281279lldb::ChildCacheState
282280lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd::Update () {
283281 m_cntrl = nullptr ;
282+ m_ptr_obj = nullptr ;
284283
285284 ValueObjectSP valobj_sp = m_backend.GetSP ();
286285 if (!valobj_sp)
@@ -290,6 +289,12 @@ lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd::Update() {
290289 if (!target_sp)
291290 return lldb::ChildCacheState::eRefetch;
292291
292+ auto ptr_obj_sp = valobj_sp->GetChildMemberWithName (" __ptr_" );
293+ if (!ptr_obj_sp)
294+ return lldb::ChildCacheState::eRefetch;
295+
296+ m_ptr_obj = ptr_obj_sp->Clone (ConstString (" pointer" )).get ();
297+
293298 lldb::ValueObjectSP cntrl_sp (valobj_sp->GetChildMemberWithName (" __cntrl_" ));
294299
295300 m_cntrl = cntrl_sp.get (); // need to store the raw pointer to avoid a circular
@@ -300,10 +305,12 @@ lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd::Update() {
300305llvm::Expected<size_t >
301306lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd::
302307 GetIndexOfChildWithName (ConstString name) {
303- if (name == " __ptr_" )
308+ if (name == " __ptr_" || name == " pointer " )
304309 return 0 ;
305- if (name == " $$dereference$$" )
310+
311+ if (name == " object" || name == " $$dereference$$" )
306312 return 1 ;
313+
307314 return llvm::createStringError (" Type has no child named '%s'" ,
308315 name.AsCString ());
309316}
0 commit comments