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);
pub trait TraceTrait: Sized {
fn trace(&self, vis: &mut Visitor) {
let _ = vis;
}
extern "C" fn trace_(vis: *mut Visitor, this: *const u8) {
unsafe {
(*this.cast::<Self>()).trace(&mut *vis);
}
}
fn get_trace_descriptor(this: *const u8) -> TraceDescriptor {
TraceDescriptor {
base_object_payload: this,
callback: Self::trace_,
}
}
}
pub struct TraceDescriptor {
pub base_object_payload: *const u8,
pub callback: TraceCallback,
}