Skip to content

Commit 7bf4421

Browse files
committed
Remove DynTrace object for now
We need a better solution! See issue #15 This reverts commit afcc179.
1 parent 8c0ef2a commit 7bf4421

File tree

3 files changed

+26
-44
lines changed

3 files changed

+26
-44
lines changed

libs/derive/tests/basic.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ struct NopTrace {
3838
wow: Box<NopTrace>
3939
}
4040

41+
4142
#[test]
4243
fn basic() {
4344
let _b = Basic::<dummy::DummyCollectorId> {

libs/simple/src/lib.rs

Lines changed: 25 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -94,12 +94,15 @@ unsafe impl RawSimpleAlloc for RawSimpleCollector {
9494
}
9595
}
9696

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+
}
103106

104107
unsafe impl RawHandleImpl for RawSimpleCollector {
105108
type TypeInfo = GcType;
@@ -115,13 +118,13 @@ unsafe impl RawHandleImpl for RawSimpleCollector {
115118
}
116119
}
117120

118-
/// A wrapper for [GcHandleList] that implements [::zerogc::DynTrace]
121+
/// A wrapper for [GcHandleList] that implements [DynTrace]
119122
#[repr(transparent)]
120123
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) {
123126
unsafe {
124-
self.0.trace::<_, !>(|raw_ptr, type_info| {
127+
let Ok(()) = self.0.trace::<_, !>(|raw_ptr, type_info| {
125128
let header = &mut *GcHeader::from_value_ptr(raw_ptr, type_info);
126129
// Mark grey
127130
header.update_raw_state(MarkState::Grey.
@@ -132,7 +135,7 @@ unsafe impl<'a> ::zerogc::DynTrace<MarkVisitor<'a>> for GcHandleListWrapper {
132135
header.update_raw_state(MarkState::Black.
133136
to_raw(visitor.inverted_mark));
134137
Ok(())
135-
})
138+
});
136139
}
137140
}
138141
}
@@ -416,7 +419,7 @@ pub struct RawSimpleCollector {
416419
}
417420

418421
unsafe impl ::zerogc_context::collector::RawCollectorImpl for RawSimpleCollector {
419-
type GcDynPointer = NonNull<DynTrace>;
422+
type GcDynPointer = NonNull<dyn DynTrace>;
420423

421424
#[cfg(feature = "multiple-collectors")]
422425
type Ptr = NonNull<Self>;
@@ -437,8 +440,9 @@ unsafe impl ::zerogc_context::collector::RawCollectorImpl for RawSimpleCollector
437440
debug_assert!(!value.is_null());
438441
NonNull::new_unchecked(
439442
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)
442446
)
443447
}
444448

@@ -549,7 +553,7 @@ impl RawSimpleCollector {
549553
&self, contexts: &[*mut RawContext<RawSimpleCollector>]
550554
) {
551555
debug_assert!(self.manager.is_collecting());
552-
let roots: Vec<*mut DynTrace> = contexts.iter()
556+
let roots: Vec<*mut dyn DynTrace> = contexts.iter()
553557
.flat_map(|ctx| {
554558
(**ctx).assume_valid_shadow_stack()
555559
.reverse_iter().map(NonNull::as_ptr)
@@ -558,8 +562,8 @@ impl RawSimpleCollector {
558562
// Cast to wrapper type
559563
as *const GcHandleList<Self> as *const GcHandleListWrapper
560564
// Make into virtual pointer
561-
as *const DynTrace
562-
as *mut DynTrace
565+
as *const dyn DynTrace
566+
as *mut dyn DynTrace
563567
))
564568
.collect();
565569
let num_roots = roots.len();
@@ -586,7 +590,7 @@ impl RawSimpleCollector {
586590
}
587591
struct CollectionTask<'a> {
588592
expected_collector: CollectorId,
589-
roots: Vec<*mut DynTrace>,
593+
roots: Vec<*mut dyn DynTrace>,
590594
heap: &'a GcHeap,
591595
#[cfg_attr(feature = "implicit-grey-stack", allow(dead_code))]
592596
grey_stack: Vec<*mut GcHeader>
@@ -600,16 +604,8 @@ impl<'a> CollectionTask<'a> {
600604
grey_stack: &mut self.grey_stack,
601605
inverted_mark: self.heap.allocator.mark_inverted()
602606
};
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); }
613609
}
614610
#[cfg(not(feature = "implicit-grey-stack"))] unsafe {
615611
let was_inverted_mark = self.heap.allocator.mark_inverted();
@@ -792,8 +788,7 @@ impl<T: GcSafe> StaticGcType for T {
792788
value_size: std::mem::size_of::<T>(),
793789
value_offset: Self::VALUE_OFFSET,
794790
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),
797792
) },
798793
drop_func: if <T as GcSafe>::NEEDS_DROP {
799794
unsafe { Some(transmute::<_, unsafe fn(*mut c_void)>(

src/lib.rs

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -783,20 +783,6 @@ pub unsafe trait GcBrand<'new_gc, Id: CollectorId>: Trace {
783783
type Branded: Trace + 'new_gc;
784784
}
785785

786-
/// An object-safe version of the [Trace] trait
787-
pub unsafe trait DynTrace<V: GcVisitor> {
788-
/// Visit this object
789-
///
790-
/// See [Trace::visit] for more details
791-
fn visit(&mut self, visitor: &mut V) -> Result<(), V::Err>;
792-
}
793-
unsafe impl<T: Trace, V: GcVisitor> DynTrace<V> for T {
794-
#[inline]
795-
fn visit(&mut self, visitor: &mut V) -> Result<(), <V as GcVisitor>::Err> {
796-
<T as Trace>::visit(self, visitor)
797-
}
798-
}
799-
800786
/// Indicates that a type can be traced by a garbage collector.
801787
///
802788
/// This doesn't necessarily mean that the type is safe to allocate in a garbage collector ([GcSafe]).

0 commit comments

Comments
 (0)