use crate::util::ObjectReference;
use crate::util::VMWorkerThread;
use crate::vm::VMBinding;
pub trait ReferenceGlue<VM: VMBinding> {
type FinalizableType: Finalizable;
fn clear_referent(new_reference: ObjectReference);
fn get_referent(object: ObjectReference) -> Option<ObjectReference>;
fn set_referent(reff: ObjectReference, referent: ObjectReference);
fn enqueue_references(references: &[ObjectReference], tls: VMWorkerThread);
}
use crate::scheduler::gc_work::ProcessEdgesWork;
pub trait Finalizable: std::fmt::Debug + Send {
fn get_reference(&self) -> ObjectReference;
fn set_reference(&mut self, object: ObjectReference);
fn keep_alive<E: ProcessEdgesWork>(&mut self, trace: &mut E);
}
impl Finalizable for ObjectReference {
fn get_reference(&self) -> ObjectReference {
*self
}
fn set_reference(&mut self, object: ObjectReference) {
*self = object;
}
fn keep_alive<E: ProcessEdgesWork>(&mut self, trace: &mut E) {
*self = trace.trace_object(*self);
}
}