diff --git a/vmkit/src/bdwgc_shim.rs b/vmkit/src/bdwgc_shim.rs index d3a9fa1..7bd4c97 100644 --- a/vmkit/src/bdwgc_shim.rs +++ b/vmkit/src/bdwgc_shim.rs @@ -462,21 +462,21 @@ static CONSERVATIVE_METADATA: GCMetadata = GCMetadata { }), }; -impl FromBitfield for BDWGCMetadata { - fn from_bitfield(value: u64) -> Self { +impl FromBitfield for BDWGCMetadata { + fn from_bitfield(value: usize) -> Self { Self { meta: value as usize, } } fn from_i64(value: i64) -> Self { - Self::from_bitfield(value as u64) + Self::from_bitfield(value as usize) } } -impl ToBitfield for BDWGCMetadata { - fn to_bitfield(self) -> u64 { - self.meta as u64 +impl ToBitfield for BDWGCMetadata { + fn to_bitfield(self) -> usize { + self.meta as usize } fn one() -> Self { diff --git a/vmkit/src/main.rs b/vmkit/src/main.rs index f328e4d..35f4ae6 100644 --- a/vmkit/src/main.rs +++ b/vmkit/src/main.rs @@ -1 +1,9 @@ -fn main() {} +use easy_bitfield::BitFieldTrait; +use vmkit::object_model::header::{HashState, HashStateField}; + +fn main() { + let encoded = HashStateField::encode(HashState::HashedAndMoved); + println!("{:x}", encoded); + println!("{}", HashStateField::NEXT_BIT); + println!("{:?}", HashStateField::decode(encoded)); +} diff --git a/vmkit/src/object_model/header.rs b/vmkit/src/object_model/header.rs index dd7128f..37cf2d1 100644 --- a/vmkit/src/object_model/header.rs +++ b/vmkit/src/object_model/header.rs @@ -11,10 +11,10 @@ pub const OBJECT_REF_OFFSET: isize = 8; pub const OBJECT_HEADER_OFFSET: isize = -OBJECT_REF_OFFSET; pub const HASHCODE_OFFSET: isize = -(OBJECT_REF_OFFSET + size_of::() as isize); -pub const METADATA_BIT_LIMIT: usize = if ADDRESS_BASED_HASHING { 60 } else { 63 }; +pub const METADATA_BIT_LIMIT: usize = if ADDRESS_BASED_HASHING { usize::BITS as usize - 2 } else { usize::BITS as usize }; -pub type MetadataField = BitField; -pub type HashStateField = BitField; +pub type MetadataField = BitField; +pub type HashStateField = BitField; #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum HashState { @@ -23,8 +23,8 @@ pub enum HashState { HashedAndMoved, } -impl FromBitfield for HashState { - fn from_bitfield(value: u64) -> Self { +impl FromBitfield for HashState { + fn from_bitfield(value: usize) -> Self { match value { 0 => Self::Unhashed, 1 => Self::Hashed, @@ -43,8 +43,8 @@ impl FromBitfield for HashState { } } -impl ToBitfield for HashState { - fn to_bitfield(self) -> u64 { +impl ToBitfield for HashState { + fn to_bitfield(self) -> usize { match self { Self::Unhashed => 0, Self::Hashed => 1, @@ -62,7 +62,7 @@ impl ToBitfield for HashState { } pub struct HeapObjectHeader { - pub metadata: AtomicBitfieldContainer, + pub metadata: AtomicBitfieldContainer, pub marker: PhantomData, } diff --git a/vmkit/src/object_model/metadata.rs b/vmkit/src/object_model/metadata.rs index d49fee4..154ff6a 100644 --- a/vmkit/src/object_model/metadata.rs +++ b/vmkit/src/object_model/metadata.rs @@ -32,7 +32,7 @@ pub enum TraceCallback { /// /// Types which implement `Metadata` must also be convertible to and from bitfields. pub trait Metadata: - ToBitfield + FromBitfield + ToSlot + ToBitfield + FromBitfield + ToSlot { /// Size of the metadata in bits. Must be `<= 62`. const METADATA_BIT_SIZE: usize; @@ -82,16 +82,16 @@ macro_rules! make_uncooperative_metadata { unreachable!() } } - impl $crate::object_model::metadata::ToBitfield for $name { - fn to_bitfield(self) -> u64 { - self.wsize as u64 + impl $crate::object_model::metadata::ToBitfield for $name { + fn to_bitfield(self) -> usize { + self.wsize as usize } } - impl $crate::object_model::metadata::FromBitfield + impl $crate::object_model::metadata::FromBitfield for $name { - fn from_bitfield(value: u64) -> Self { + fn from_bitfield(value: usize) -> Self { Self { wsize: value as usize, } @@ -100,9 +100,9 @@ macro_rules! make_uncooperative_metadata { }; } -impl ToBitfield for &'static GCMetadata { - fn to_bitfield(self) -> u64 { - let res = self as *const GCMetadata as usize as u64; +impl ToBitfield for &'static GCMetadata { + fn to_bitfield(self) -> usize { + let res = self as *const GCMetadata as usize as usize; res } @@ -115,8 +115,8 @@ impl ToBitfield for &'static GCMetadata { } } -impl FromBitfield for &'static GCMetadata { - fn from_bitfield(value: u64) -> Self { +impl FromBitfield for &'static GCMetadata { + fn from_bitfield(value: usize) -> Self { unsafe { &*(value as usize as *const GCMetadata) } }