diff --git a/src/policy/copyspace.rs b/src/policy/copyspace.rs index bf73255033..b2e61da815 100644 --- a/src/policy/copyspace.rs +++ b/src/policy/copyspace.rs @@ -47,7 +47,7 @@ impl SFT for CopySpace { false } - fn is_movable(&self) -> bool { + fn is_movable(&self, _object: ObjectReference) -> bool { true } diff --git a/src/policy/immix/immixspace.rs b/src/policy/immix/immixspace.rs index 547ac6d794..5e35fa8ba6 100644 --- a/src/policy/immix/immixspace.rs +++ b/src/policy/immix/immixspace.rs @@ -128,7 +128,11 @@ impl SFT for ImmixSpace { fn is_object_pinned(&self, object: ObjectReference) -> bool { VM::VMObjectModel::LOCAL_PINNING_BIT_SPEC.is_object_pinned::(object) } - fn is_movable(&self) -> bool { + fn is_movable(&self, _object: ObjectReference) -> bool { + #[cfg(feature = "object_pinning")] + if self.is_object_pinned(_object) { + return false; + } !super::NEVER_MOVE_OBJECTS } diff --git a/src/policy/immortalspace.rs b/src/policy/immortalspace.rs index 6d3e63922d..1bec6a0b47 100644 --- a/src/policy/immortalspace.rs +++ b/src/policy/immortalspace.rs @@ -47,7 +47,7 @@ impl SFT for ImmortalSpace { fn is_object_pinned(&self, _object: ObjectReference) -> bool { true } - fn is_movable(&self) -> bool { + fn is_movable(&self, _object: ObjectReference) -> bool { false } #[cfg(feature = "sanity")] diff --git a/src/policy/largeobjectspace.rs b/src/policy/largeobjectspace.rs index b64a5371c6..eee017c458 100644 --- a/src/policy/largeobjectspace.rs +++ b/src/policy/largeobjectspace.rs @@ -49,7 +49,7 @@ impl SFT for LargeObjectSpace { fn is_object_pinned(&self, _object: ObjectReference) -> bool { true } - fn is_movable(&self) -> bool { + fn is_movable(&self, _object: ObjectReference) -> bool { false } #[cfg(feature = "sanity")] diff --git a/src/policy/lockfreeimmortalspace.rs b/src/policy/lockfreeimmortalspace.rs index 858d07fd5f..07b6af432a 100644 --- a/src/policy/lockfreeimmortalspace.rs +++ b/src/policy/lockfreeimmortalspace.rs @@ -62,7 +62,7 @@ impl SFT for LockFreeImmortalSpace { fn is_object_pinned(&self, _object: ObjectReference) -> bool { true } - fn is_movable(&self) -> bool { + fn is_movable(&self, _object: ObjectReference) -> bool { unimplemented!() } #[cfg(feature = "sanity")] diff --git a/src/policy/markcompactspace.rs b/src/policy/markcompactspace.rs index 9db05e56aa..6c8eaeff0d 100644 --- a/src/policy/markcompactspace.rs +++ b/src/policy/markcompactspace.rs @@ -61,7 +61,7 @@ impl SFT for MarkCompactSpace { false } - fn is_movable(&self) -> bool { + fn is_movable(&self, _object: ObjectReference) -> bool { true } diff --git a/src/policy/marksweepspace/malloc_ms/global.rs b/src/policy/marksweepspace/malloc_ms/global.rs index d95aa8437b..4e2c859aad 100644 --- a/src/policy/marksweepspace/malloc_ms/global.rs +++ b/src/policy/marksweepspace/malloc_ms/global.rs @@ -86,7 +86,7 @@ impl SFT for MallocSpace { false } - fn is_movable(&self) -> bool { + fn is_movable(&self, _object: ObjectReference) -> bool { false } diff --git a/src/policy/marksweepspace/native_ms/global.rs b/src/policy/marksweepspace/native_ms/global.rs index 41773be244..1b082edfc5 100644 --- a/src/policy/marksweepspace/native_ms/global.rs +++ b/src/policy/marksweepspace/native_ms/global.rs @@ -178,7 +178,7 @@ impl SFT for MarkSweepSpace { false } - fn is_movable(&self) -> bool { + fn is_movable(&self, _object: ObjectReference) -> bool { false } diff --git a/src/policy/sft.rs b/src/policy/sft.rs index cab4cc987a..3fe8b87e75 100644 --- a/src/policy/sft.rs +++ b/src/policy/sft.rs @@ -56,7 +56,7 @@ pub trait SFT { /// Is the object movable, determined by the policy? E.g. the policy is non-moving, /// or the object is pinned. - fn is_movable(&self) -> bool; + fn is_movable(&self, object: ObjectReference) -> bool; /// Is the object sane? A policy should return false if there is any abnormality about /// object - the sanity checker will fail if an object is not sane. @@ -146,7 +146,7 @@ impl SFT for EmptySpaceSFT { fn is_object_pinned(&self, _object: ObjectReference) -> bool { false } - fn is_movable(&self) -> bool { + fn is_movable(&self, _object: ObjectReference) -> bool { /* * FIXME steveb I think this should panic (ie the function should not * be invoked on an empty space). However, JikesRVM currently does diff --git a/src/policy/vmspace.rs b/src/policy/vmspace.rs index 5d38a77042..9e0db0a723 100644 --- a/src/policy/vmspace.rs +++ b/src/policy/vmspace.rs @@ -49,7 +49,7 @@ impl SFT for VMSpace { fn is_object_pinned(&self, _object: ObjectReference) -> bool { true } - fn is_movable(&self) -> bool { + fn is_movable(&self, _object: ObjectReference) -> bool { false } #[cfg(feature = "sanity")] diff --git a/src/util/address.rs b/src/util/address.rs index d5e720c0ed..97d1a9b868 100644 --- a/src/util/address.rs +++ b/src/util/address.rs @@ -600,7 +600,7 @@ impl ObjectReference { /// Can the object be moved? pub fn is_movable(self) -> bool { - unsafe { SFT_MAP.get_unchecked(self.to_address::()) }.is_movable() + unsafe { SFT_MAP.get_unchecked(self.to_address::()) }.is_movable(self) } /// Get forwarding pointer if the object is forwarded.