mmtk/util/
is_mmtk_object.rs

1/// The region size (in bytes) of the `VO_BIT` side metadata.
2/// The VM can use this to check if an object is properly aligned.
3pub const VO_BIT_REGION_SIZE: usize =
4    1usize << crate::util::metadata::vo_bit::VO_BIT_SIDE_METADATA_SPEC.log_bytes_in_region;
5
6use crate::util::{Address, ObjectReference};
7
8pub(crate) fn check_object_reference(addr: Address) -> Option<ObjectReference> {
9    use crate::mmtk::SFT_MAP;
10    debug_assert_ne!(addr, Address::ZERO, "Address is zero");
11    debug_assert!(
12        addr.is_aligned_to(ObjectReference::ALIGNMENT),
13        "Address is not aligned to word size: {addr}"
14    );
15    SFT_MAP.get_checked(addr).is_mmtk_object(addr)
16}
17
18pub(crate) fn check_internal_reference(
19    addr: Address,
20    max_search_bytes: usize,
21) -> Option<ObjectReference> {
22    use crate::mmtk::SFT_MAP;
23    let ret = SFT_MAP
24        .get_checked(addr)
25        .find_object_from_internal_pointer(addr, max_search_bytes);
26    #[cfg(debug_assertions)]
27    if let Some(obj) = ret {
28        let obj = check_object_reference(obj.to_raw_address());
29        debug_assert_eq!(obj, ret);
30    }
31    ret
32}