1use crate::region::Region;
8use crate::relocator::ForwardingTable;
9
10pub fn fixup_roots(
15 forwarding: &ForwardingTable,
16 trace_roots: &mut dyn FnMut(&mut dyn FnMut(*mut u8, &mut *mut u8)),
17) {
18 trace_roots(&mut |old_ptr, slot| {
19 if let Some(new_ptr) = forwarding.lookup(old_ptr) {
20 *slot = new_ptr;
21 }
22 });
23}
24
25pub fn fixup_region(region: &mut Region, _forwarding: &ForwardingTable) {
30 region.for_each_object_mut(|header, _obj_ptr| {
31 if header.size == 0 {
33 return;
34 }
35
36 });
41}
42
43#[inline]
45pub fn fixup_ptr(ptr: *mut u8, forwarding: &ForwardingTable) -> *mut u8 {
46 if let Some(new) = forwarding.lookup(ptr) {
47 new
48 } else {
49 ptr
50 }
51}
52
53#[inline]
55pub fn fixup_nanboxed_bits(bits: &mut u64, forwarding: &ForwardingTable) {
56 const TAG_BASE: u64 = 0xFFF8_0000_0000_0000;
57 const PAYLOAD_MASK: u64 = 0x0000_FFFF_FFFF_FFFF;
58 const TAG_MASK: u64 = 0x0007_0000_0000_0000;
59 const TAG_SHIFT: u32 = 48;
60 const TAG_HEAP: u64 = 0b000;
61
62 let is_tagged = (*bits & TAG_BASE) == TAG_BASE;
63 if !is_tagged {
64 return;
65 }
66
67 let tag = (*bits & TAG_MASK) >> TAG_SHIFT;
68 if tag != TAG_HEAP {
69 return;
70 }
71
72 let old_ptr = (*bits & PAYLOAD_MASK) as *mut u8;
73 if old_ptr.is_null() {
74 return;
75 }
76
77 if let Some(new_ptr) = forwarding.lookup(old_ptr) {
78 let new_payload = (new_ptr as u64) & PAYLOAD_MASK;
79 *bits = (*bits & !PAYLOAD_MASK) | new_payload;
80 }
81}