use crate::plan::global::NoCopy;
use crate::plan::global::Plan;
use crate::policy::space::Space;
use crate::scheduler::gc_work::*;
use crate::util::Address;
use crate::util::ObjectReference;
use crate::vm::VMBinding;
use crate::MMTK;
use std::ops::{Deref, DerefMut};
use super::MarkSweep;
pub struct MSProcessEdges<VM: VMBinding> {
plan: &'static MarkSweep<VM>,
base: ProcessEdgesBase<MSProcessEdges<VM>>,
}
impl<VM: VMBinding> ProcessEdgesWork for MSProcessEdges<VM> {
type VM = VM;
const OVERWRITE_REFERENCE: bool = false;
fn new(edges: Vec<Address>, _roots: bool, mmtk: &'static MMTK<VM>) -> Self {
let base = ProcessEdgesBase::new(edges, mmtk);
let plan = base.plan().downcast_ref::<MarkSweep<VM>>().unwrap();
Self { plan, base }
}
#[inline]
fn trace_object(&mut self, object: ObjectReference) -> ObjectReference {
if object.is_null() {
return object;
}
trace!("Tracing object {}", object);
if self.plan.ms_space().in_space(object) {
self.plan.ms_space().trace_object::<Self>(self, object)
} else {
self.plan
.common()
.trace_object::<Self, NoCopy<VM>>(self, object)
}
}
}
impl<VM: VMBinding> Deref for MSProcessEdges<VM> {
type Target = ProcessEdgesBase<Self>;
#[inline]
fn deref(&self) -> &Self::Target {
&self.base
}
}
impl<VM: VMBinding> DerefMut for MSProcessEdges<VM> {
#[inline]
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.base
}
}