@@ -660,7 +660,16 @@ def has_children(self):
660
660
return True
661
661
662
662
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 ):
664
673
# type: (SBValue, dict) -> str
665
674
strong = valobj .GetChildMemberWithName ("strong" ).GetValueAsUnsigned ()
666
675
weak = valobj .GetChildMemberWithName ("weak" ).GetValueAsUnsigned ()
@@ -670,15 +679,15 @@ def StdRcSummaryProvider(valobj, dict):
670
679
class StdRcSyntheticProvider :
671
680
"""Pretty-printer for alloc::rc::Rc<T> and alloc::sync::Arc<T>
672
681
673
- struct Rc<T> { ptr: NonNull<RcInner<T> >, ... }
682
+ struct Rc<T> { ptr: NonNull<T >, ... }
674
683
rust 1.31.1: struct NonNull<T> { pointer: NonZero<*const T> }
675
684
rust 1.33.0: struct NonNull<T> { pointer: *const T }
676
685
struct NonZero<T>(T)
677
686
struct RcInner<T> { strong: Cell<usize>, weak: Cell<usize>, value: T }
678
687
struct Cell<T> { value: UnsafeCell<T> }
679
688
struct UnsafeCell<T> { value: T }
680
689
681
- struct Arc<T> { ptr: NonNull<ArcInner<T> >, ... }
690
+ struct Arc<T> { ptr: NonNull<T >, ... }
682
691
struct ArcInner<T> { strong: atomic::AtomicUsize, weak: atomic::AtomicUsize, data: T }
683
692
struct AtomicUsize { v: UnsafeCell<usize> }
684
693
"""
@@ -687,14 +696,17 @@ def __init__(self, valobj, dict, is_atomic=False):
687
696
# type: (SBValue, dict, bool) -> StdRcSyntheticProvider
688
697
self .valobj = valobj
689
698
690
- self .ptr = unwrap_unique_or_non_null ( self . valobj . GetChildMemberWithName ( "ptr" ) )
699
+ self .inner = get_rc_inner ( valobj , is_atomic )
691
700
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 )
693
707
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" ))
698
710
699
711
self .value_builder = ValueBuilder (valobj )
700
712
0 commit comments