@@ -94,12 +94,15 @@ unsafe impl RawSimpleAlloc for RawSimpleCollector {
94
94
}
95
95
}
96
96
97
- /// A type alias for [::zerogc::DynTrace], which is an
98
- /// object-safe version of [::zerogc::Trace]
99
- ///
100
- /// The `'static` lifetime is a lie and simply represents the
101
- /// fact the lifetime is unchecked.
102
- type DynTrace = dyn :: zerogc:: DynTrace < MarkVisitor < ' static > > ;
97
+ #[ doc( hidden) ] // NOTE: Needs be public for RawCollectorImpl
98
+ pub unsafe trait DynTrace {
99
+ fn trace ( & mut self , visitor : & mut MarkVisitor ) ;
100
+ }
101
+ unsafe impl < T : Trace + ?Sized > DynTrace for T {
102
+ fn trace ( & mut self , visitor : & mut MarkVisitor ) {
103
+ let Ok ( ( ) ) = self . visit ( visitor) ;
104
+ }
105
+ }
103
106
104
107
unsafe impl RawHandleImpl for RawSimpleCollector {
105
108
type TypeInfo = GcType ;
@@ -115,13 +118,13 @@ unsafe impl RawHandleImpl for RawSimpleCollector {
115
118
}
116
119
}
117
120
118
- /// A wrapper for [GcHandleList] that implements [::zerogc:: DynTrace]
121
+ /// A wrapper for [GcHandleList] that implements [DynTrace]
119
122
#[ repr( transparent) ]
120
123
struct GcHandleListWrapper ( GcHandleList < RawSimpleCollector > ) ;
121
- unsafe impl < ' a > :: zerogc :: DynTrace < MarkVisitor < ' a > > for GcHandleListWrapper {
122
- fn visit ( & mut self , visitor : & mut MarkVisitor ) -> Result < ( ) , ! > {
124
+ unsafe impl DynTrace for GcHandleListWrapper {
125
+ fn trace ( & mut self , visitor : & mut MarkVisitor ) {
123
126
unsafe {
124
- self . 0 . trace :: < _ , !> ( |raw_ptr, type_info| {
127
+ let Ok ( ( ) ) = self . 0 . trace :: < _ , !> ( |raw_ptr, type_info| {
125
128
let header = & mut * GcHeader :: from_value_ptr ( raw_ptr, type_info) ;
126
129
// Mark grey
127
130
header. update_raw_state ( MarkState :: Grey .
@@ -132,7 +135,7 @@ unsafe impl<'a> ::zerogc::DynTrace<MarkVisitor<'a>> for GcHandleListWrapper {
132
135
header. update_raw_state ( MarkState :: Black .
133
136
to_raw ( visitor. inverted_mark ) ) ;
134
137
Ok ( ( ) )
135
- } )
138
+ } ) ;
136
139
}
137
140
}
138
141
}
@@ -416,7 +419,7 @@ pub struct RawSimpleCollector {
416
419
}
417
420
418
421
unsafe impl :: zerogc_context:: collector:: RawCollectorImpl for RawSimpleCollector {
419
- type GcDynPointer = NonNull < DynTrace > ;
422
+ type GcDynPointer = NonNull < dyn DynTrace > ;
420
423
421
424
#[ cfg( feature = "multiple-collectors" ) ]
422
425
type Ptr = NonNull < Self > ;
@@ -437,8 +440,9 @@ unsafe impl ::zerogc_context::collector::RawCollectorImpl for RawSimpleCollector
437
440
debug_assert ! ( !value. is_null( ) ) ;
438
441
NonNull :: new_unchecked (
439
442
std:: mem:: transmute :: <
440
- _ , * mut DynTrace
441
- > ( value as * mut dyn :: zerogc:: DynTrace < MarkVisitor > )
443
+ * mut dyn DynTrace ,
444
+ * mut ( dyn DynTrace + ' static )
445
+ > ( value as * mut dyn DynTrace )
442
446
)
443
447
}
444
448
@@ -549,7 +553,7 @@ impl RawSimpleCollector {
549
553
& self , contexts : & [ * mut RawContext < RawSimpleCollector > ]
550
554
) {
551
555
debug_assert ! ( self . manager. is_collecting( ) ) ;
552
- let roots: Vec < * mut DynTrace > = contexts. iter ( )
556
+ let roots: Vec < * mut dyn DynTrace > = contexts. iter ( )
553
557
. flat_map ( |ctx| {
554
558
( * * ctx) . assume_valid_shadow_stack ( )
555
559
. reverse_iter ( ) . map ( NonNull :: as_ptr)
@@ -558,8 +562,8 @@ impl RawSimpleCollector {
558
562
// Cast to wrapper type
559
563
as * const GcHandleList < Self > as * const GcHandleListWrapper
560
564
// Make into virtual pointer
561
- as * const DynTrace
562
- as * mut DynTrace
565
+ as * const dyn DynTrace
566
+ as * mut dyn DynTrace
563
567
) )
564
568
. collect ( ) ;
565
569
let num_roots = roots. len ( ) ;
@@ -586,7 +590,7 @@ impl RawSimpleCollector {
586
590
}
587
591
struct CollectionTask < ' a > {
588
592
expected_collector : CollectorId ,
589
- roots : Vec < * mut DynTrace > ,
593
+ roots : Vec < * mut dyn DynTrace > ,
590
594
heap : & ' a GcHeap ,
591
595
#[ cfg_attr( feature = "implicit-grey-stack" , allow( dead_code) ) ]
592
596
grey_stack : Vec < * mut GcHeader >
@@ -600,16 +604,8 @@ impl<'a> CollectionTask<'a> {
600
604
grey_stack : & mut self . grey_stack ,
601
605
inverted_mark : self . heap . allocator . mark_inverted ( )
602
606
} ;
603
- unsafe {
604
- // Dynamically dispatched
605
- let Ok ( ( ) ) = ( * root) . visit (
606
- // Ignore lifetime
607
- std:: mem:: transmute :: <
608
- & mut MarkVisitor ,
609
- & mut MarkVisitor < ' static >
610
- > ( & mut visitor)
611
- ) ;
612
- }
607
+ // Dynamically dispatched
608
+ unsafe { ( * root) . trace ( & mut visitor) ; }
613
609
}
614
610
#[ cfg( not( feature = "implicit-grey-stack" ) ) ] unsafe {
615
611
let was_inverted_mark = self . heap . allocator . mark_inverted ( ) ;
@@ -792,8 +788,7 @@ impl<T: GcSafe> StaticGcType for T {
792
788
value_size : std:: mem:: size_of :: < T > ( ) ,
793
789
value_offset : Self :: VALUE_OFFSET ,
794
790
trace_func : unsafe { transmute :: < _ , unsafe fn ( * mut c_void , & mut MarkVisitor ) > (
795
- <T as :: zerogc:: DynTrace < MarkVisitor < ' static > > >:: visit
796
- as fn ( & mut T , & mut MarkVisitor < ' static > ) -> Result < ( ) , !> ,
791
+ <T as DynTrace >:: trace as fn ( & mut T , & mut MarkVisitor ) ,
797
792
) } ,
798
793
drop_func : if <T as GcSafe >:: NEEDS_DROP {
799
794
unsafe { Some ( transmute :: < _ , unsafe fn ( * mut c_void ) > (
0 commit comments