crftng-intrprtrs/gc/src/trace_impl.rs

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)
}
}
}