@@ -660,7 +660,16 @@ def has_children(self):
660660 return True
661661
662662
663- def StdRcSummaryProvider (valobj , dict ):
663+ def get_rc_inner (valobj , is_atomic ):
664+ data_ptr = unwrap_unique_or_non_null (valobj .GetChildMemberWithName ("ptr" ))
665+ inner_type = valobj .type .fields [1 ].type .template_args [0 ]
666+ data_offset = inner_type .fields [- 1 ].byte_offset
667+ inner_address = data_ptr .GetValueAsAddress () - data_offset
668+
669+ return data_ptr .CreateValueFromAddress ("inner" , inner_address , inner_type )
670+
671+
672+ def StdRcSummaryProvider (valobj , dict , is_atomic ):
664673 # type: (SBValue, dict) -> str
665674 strong = valobj .GetChildMemberWithName ("strong" ).GetValueAsUnsigned ()
666675 weak = valobj .GetChildMemberWithName ("weak" ).GetValueAsUnsigned ()
@@ -670,15 +679,15 @@ def StdRcSummaryProvider(valobj, dict):
670679class StdRcSyntheticProvider :
671680 """Pretty-printer for alloc::rc::Rc<T> and alloc::sync::Arc<T>
672681
673- struct Rc<T> { ptr: NonNull<RcInner<T> >, ... }
682+ struct Rc<T> { ptr: NonNull<T >, ... }
674683 rust 1.31.1: struct NonNull<T> { pointer: NonZero<*const T> }
675684 rust 1.33.0: struct NonNull<T> { pointer: *const T }
676685 struct NonZero<T>(T)
677686 struct RcInner<T> { strong: Cell<usize>, weak: Cell<usize>, value: T }
678687 struct Cell<T> { value: UnsafeCell<T> }
679688 struct UnsafeCell<T> { value: T }
680689
681- struct Arc<T> { ptr: NonNull<ArcInner<T> >, ... }
690+ struct Arc<T> { ptr: NonNull<T >, ... }
682691 struct ArcInner<T> { strong: atomic::AtomicUsize, weak: atomic::AtomicUsize, data: T }
683692 struct AtomicUsize { v: UnsafeCell<usize> }
684693 """
@@ -687,14 +696,17 @@ def __init__(self, valobj, dict, is_atomic=False):
687696 # type: (SBValue, dict, bool) -> StdRcSyntheticProvider
688697 self .valobj = valobj
689698
690- self .ptr = unwrap_unique_or_non_null ( self . valobj . GetChildMemberWithName ( "ptr" ) )
699+ self .inner = get_rc_inner ( valobj , is_atomic )
691700
692- self .value = self .ptr .GetChildMemberWithName ("data" if is_atomic else "value" )
701+ self .value = self .inner .GetChildMemberWithName ("data" if is_atomic else "value" )
702+
703+ if is_atomic :
704+ read_cell = lambda x : x .GetChildAtIndex (0 ).GetChildAtIndex (0 )
705+ else :
706+ read_cell = lambda x : x .GetChildAtIndex (0 )
693707
694- self .strong = self .ptr .GetChildMemberWithName ("strong" ).GetChildAtIndex (
695- 0 ).GetChildMemberWithName ("value" )
696- self .weak = self .ptr .GetChildMemberWithName ("weak" ).GetChildAtIndex (
697- 0 ).GetChildMemberWithName ("value" )
708+ self .strong = read_cell (self .inner .GetChildMemberWithName ("strong" ))
709+ self .weak = read_cell (self .inner .GetChildMemberWithName ("weak" ))
698710
699711 self .value_builder = ValueBuilder (valobj )
700712
0 commit comments