1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
use crate::visitor::Visitor;

pub type TraceCallback = extern "C" fn(*mut Visitor, *const u8);

/// Trait specifying how the garbage collector processes an object of type `T`.
pub trait TraceTrait: Sized {
    /// Function invoking the tracing for an object of type `T`.
    /// - `visitor`: The visitor to dispatch to.
    fn trace(&self, vis: &mut Visitor) {
        let _ = vis;
    }
    /// `trace_` method is used for C FFI safety. 
    extern "C" fn trace_(vis: *mut Visitor, this: *const u8) {
        unsafe {
            (*this.cast::<Self>()).trace(&mut *vis);
        }
    }
    /// Returns trace descriptor for type that implements this trait. Not recommended to override it. 
    fn get_trace_descriptor(this: *const u8) -> TraceDescriptor {
        TraceDescriptor {
            base_object_payload: this,
            callback: Self::trace_,
        }
    }
}

/// Describe how to trace an object.
pub struct TraceDescriptor {
    pub base_object_payload: *const u8,
    pub callback: TraceCallback,
}