51 lines
1.2 KiB
Rust
51 lines
1.2 KiB
Rust
use super::trace::{GCTrace, GCTracer};
|
|
use std::{cell::RefCell, collections::HashMap, ops::Deref};
|
|
unsafe impl GCTrace for () {}
|
|
unsafe impl GCTrace for i32 {}
|
|
unsafe impl GCTrace for u32 {}
|
|
unsafe impl GCTrace for i64 {}
|
|
unsafe impl GCTrace for u64 {}
|
|
unsafe impl GCTrace for f32 {}
|
|
unsafe impl GCTrace for f64 {}
|
|
unsafe impl GCTrace for isize {}
|
|
unsafe impl GCTrace for usize {}
|
|
unsafe impl GCTrace for String {}
|
|
|
|
unsafe impl<T: GCTrace> GCTrace for (T,) {
|
|
fn trace(&self, tracer: &mut GCTracer) {
|
|
tracer.mark_reachable_rec(&self.0)
|
|
}
|
|
}
|
|
|
|
unsafe impl<T: GCTrace> GCTrace for RefCell<T> {
|
|
fn trace(&self, tracer: &mut GCTracer) {
|
|
let borrow = self.borrow();
|
|
tracer.mark_reachable_rec(borrow.deref())
|
|
}
|
|
}
|
|
|
|
unsafe impl<T: GCTrace> GCTrace for Option<T> {
|
|
fn trace(&self, tracer: &mut GCTracer) {
|
|
if let Some(ref v) = self {
|
|
tracer.mark_reachable_rec(v)
|
|
}
|
|
}
|
|
}
|
|
|
|
unsafe impl<K: GCTrace, V: GCTrace> GCTrace for HashMap<K, V> {
|
|
fn trace(&self, tracer: &mut GCTracer) {
|
|
for (k, v) in self.iter() {
|
|
tracer.mark_reachable_rec(k);
|
|
tracer.mark_reachable_rec(v);
|
|
}
|
|
}
|
|
}
|
|
|
|
unsafe impl<T: GCTrace> GCTrace for Vec<T> {
|
|
fn trace(&self, tracer: &mut GCTracer) {
|
|
for val in self.iter() {
|
|
tracer.mark_reachable_rec(val)
|
|
}
|
|
}
|
|
}
|