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