[ruby/mmtk] Remove unused constant

Remove the unused constant HAS_MOVED_GFIELDSTBL and related methods.

In the mmtk/mmtk-ruby repo, we are now able to find the global field
(IV) table of a moved object during copying GC without using the
HAS_MOVED_GFIELDSTBL bit.  We synchronize some of the code, although we
haven't implemented moving GC in ruby/mmtk, yet.

See: 13080acdf5

400ba4e747
This commit is contained in:
Kunshan Wang 2025-05-27 16:31:54 +08:00 committed by git
parent f8db23afe5
commit 60de513d05
3 changed files with 47 additions and 35 deletions

View file

@ -36,4 +36,7 @@ default = []
# When moving an object, clear its original copy.
clear_old_copy = []
# Enable extra assertions in release build. For debugging.
extra_assert = []
[workspace]

View file

@ -1,5 +1,5 @@
use crate::api::RubyMutator;
use crate::Ruby;
use crate::{extra_assert, Ruby};
use libc::c_int;
use mmtk::scheduler::GCWorker;
use mmtk::util::{Address, ObjectReference, VMMutatorThread, VMWorkerThread};
@ -10,7 +10,6 @@ pub const MIN_OBJ_ALIGN: usize = 8; // Even on 32-bit machine. A Ruby object is
pub const GC_THREAD_KIND_WORKER: libc::c_int = 1;
const HAS_MOVED_GFIELDSTBL: usize = 1 << 63;
const HIDDEN_SIZE_MASK: usize = 0x0000FFFFFFFFFFFF;
// Should keep in sync with C code.
@ -20,6 +19,32 @@ const RUBY_FL_EXIVAR: usize = 1 << 10;
#[allow(non_camel_case_types)]
pub struct st_table;
#[repr(C)]
pub struct HiddenHeader {
pub prefix: usize,
}
impl HiddenHeader {
#[inline(always)]
pub fn is_sane(&self) -> bool {
self.prefix & !HIDDEN_SIZE_MASK == 0
}
#[inline(always)]
fn assert_sane(&self) {
extra_assert!(
self.is_sane(),
"Hidden header is corrupted: {:x}",
self.prefix
);
}
pub fn payload_size(&self) -> usize {
self.assert_sane();
self.prefix & HIDDEN_SIZE_MASK
}
}
/// Provide convenient methods for accessing Ruby objects.
/// TODO: Wrap C functions in `RubyUpcalls` as Rust-friendly methods.
pub struct RubyObjectAccess {
@ -47,32 +72,17 @@ impl RubyObjectAccess {
self.suffix_addr() + Self::suffix_size()
}
fn hidden_field(&self) -> Address {
self.obj_start()
fn hidden_header(&self) -> &'static HiddenHeader {
unsafe { self.obj_start().as_ref() }
}
fn load_hidden_field(&self) -> usize {
unsafe { self.hidden_field().load::<usize>() }
}
fn update_hidden_field<F>(&self, f: F)
where
F: FnOnce(usize) -> usize,
{
let old_value = self.load_hidden_field();
let new_value = f(old_value);
unsafe {
self.hidden_field().store(new_value);
}
#[allow(unused)] // Maybe we need to mutate the hidden header in the future.
fn hidden_header_mut(&self) -> &'static mut HiddenHeader {
unsafe { self.obj_start().as_mut_ref() }
}
pub fn payload_size(&self) -> usize {
self.load_hidden_field() & HIDDEN_SIZE_MASK
}
pub fn set_payload_size(&self, size: usize) {
debug_assert!((size & HIDDEN_SIZE_MASK) == size);
self.update_hidden_field(|old| old & !HIDDEN_SIZE_MASK | size & HIDDEN_SIZE_MASK);
self.hidden_header().payload_size()
}
fn flags_field(&self) -> Address {
@ -87,18 +97,6 @@ impl RubyObjectAccess {
(self.load_flags() & RUBY_FL_EXIVAR) != 0
}
pub fn has_moved_gfields_tbl(&self) -> bool {
(self.load_hidden_field() & HAS_MOVED_GFIELDSTBL) != 0
}
pub fn set_has_moved_gfields_tbl(&self) {
self.update_hidden_field(|old| old | HAS_MOVED_GFIELDSTBL)
}
pub fn clear_has_moved_gfields_tbl(&self) {
self.update_hidden_field(|old| old & !HAS_MOVED_GFIELDSTBL)
}
pub fn prefix_size() -> usize {
// Currently, a hidden size field of word size is placed before each object.
OBJREF_OFFSET

View file

@ -131,3 +131,14 @@ pub(crate) fn set_panic_hook() {
}
}));
}
/// This kind of assertion is enabled if either building in debug mode or the
/// "extra_assert" feature is enabled.
#[macro_export]
macro_rules! extra_assert {
($($arg:tt)*) => {
if std::cfg!(any(debug_assertions, feature = "extra_assert")) {
std::assert!($($arg)*);
}
};
}