mirror of
https://github.com/ruby/ruby.git
synced 2025-08-15 13:39:04 +02:00
[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:
parent
f8db23afe5
commit
60de513d05
3 changed files with 47 additions and 35 deletions
|
@ -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]
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)*);
|
||||
}
|
||||
};
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue