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