1+ import lldb
12import sys
23
34from lldb import SBData , SBError , eBasicTypeLong , eBasicTypeUnsignedLong , \
@@ -660,7 +661,16 @@ def has_children(self):
660661 return True
661662
662663
663- def StdRcSummaryProvider (valobj , dict ):
664+ def get_rc_inner (valobj , is_atomic ):
665+ data_ptr = unwrap_unique_or_non_null (valobj .GetChildMemberWithName ("ptr" ))
666+ inner_type = valobj .type .fields [1 ].type .template_args [0 ]
667+ data_offset = inner_type .fields [- 1 ].byte_offset
668+ inner_address = data_ptr .GetValueAsAddress () - data_offset
669+
670+ return data_ptr .CreateValueFromAddress ("inner" , inner_address , inner_type )
671+
672+
673+ def StdRcSummaryProvider (valobj , dict , is_atomic ):
664674 # type: (SBValue, dict) -> str
665675 strong = valobj .GetChildMemberWithName ("strong" ).GetValueAsUnsigned ()
666676 weak = valobj .GetChildMemberWithName ("weak" ).GetValueAsUnsigned ()
@@ -670,15 +680,15 @@ def StdRcSummaryProvider(valobj, dict):
670680class StdRcSyntheticProvider :
671681 """Pretty-printer for alloc::rc::Rc<T> and alloc::sync::Arc<T>
672682
673- struct Rc<T> { ptr: NonNull<RcInner<T> >, ... }
683+ struct Rc<T> { ptr: NonNull<T >, ... }
674684 rust 1.31.1: struct NonNull<T> { pointer: NonZero<*const T> }
675685 rust 1.33.0: struct NonNull<T> { pointer: *const T }
676686 struct NonZero<T>(T)
677687 struct RcInner<T> { strong: Cell<usize>, weak: Cell<usize>, value: T }
678688 struct Cell<T> { value: UnsafeCell<T> }
679689 struct UnsafeCell<T> { value: T }
680690
681- struct Arc<T> { ptr: NonNull<ArcInner<T> >, ... }
691+ struct Arc<T> { ptr: NonNull<T >, ... }
682692 struct ArcInner<T> { strong: atomic::AtomicUsize, weak: atomic::AtomicUsize, data: T }
683693 struct AtomicUsize { v: UnsafeCell<usize> }
684694 """
@@ -687,14 +697,17 @@ def __init__(self, valobj, dict, is_atomic=False):
687697 # type: (SBValue, dict, bool) -> StdRcSyntheticProvider
688698 self .valobj = valobj
689699
690- self .ptr = unwrap_unique_or_non_null ( self . valobj . GetChildMemberWithName ( "ptr" ) )
700+ self .inner = get_rc_inner ( valobj , is_atomic )
691701
692- self .value = self .ptr .GetChildMemberWithName ("data" if is_atomic else "value" )
702+ self .value = self .inner .GetChildMemberWithName ("data" if is_atomic else "value" )
703+
704+ if is_atomic :
705+ read_cell = lambda x : x .GetChildAtIndex (0 ).GetChildAtIndex (0 )
706+ else :
707+ read_cell = lambda x : x .GetChildAtIndex (0 )
693708
694- self .strong = self .ptr .GetChildMemberWithName ("strong" ).GetChildAtIndex (
695- 0 ).GetChildMemberWithName ("value" )
696- self .weak = self .ptr .GetChildMemberWithName ("weak" ).GetChildAtIndex (
697- 0 ).GetChildMemberWithName ("value" )
709+ self .strong = read_cell (self .inner .GetChildMemberWithName ("strong" ))
710+ self .weak = read_cell (self .inner .GetChildMemberWithName ("weak" ))
698711
699712 self .value_builder = ValueBuilder (valobj )
700713
0 commit comments