Skip to content

Commit bcb37d3

Browse files
committed
Tracking void* pointers in genericmemory objects
1 parent cc7b7e8 commit bcb37d3

File tree

1 file changed

+38
-0
lines changed

1 file changed

+38
-0
lines changed

mmtk/src/julia_scanning.rs

+38
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use crate::slots::JuliaVMSlot;
44
use crate::slots::OffsetSlot;
55
use crate::JULIA_BUFF_TAG;
66
use memoffset::offset_of;
7+
use mmtk::memory_manager;
78
use mmtk::util::{Address, ObjectReference};
89
use mmtk::vm::slot::SimpleSlot;
910
use mmtk::vm::SlotVisitor;
@@ -246,13 +247,50 @@ pub unsafe fn scan_julia_object<SV: SlotVisitor<JuliaVMSlot>>(obj: Address, clos
246247
let owner_addr = mmtk_jl_genericmemory_data_owner_field_address(m);
247248
process_slot(closure, owner_addr);
248249

250+
let ptr_addr = Address::from_ptr((*m).ptr);
251+
// m.ptr might be an internal pointer
252+
// find the beginning of the object and trace it since the object may have moved
253+
if crate::object_model::is_addr_in_immixspace(ptr_addr) {
254+
let object =
255+
memory_manager::find_object_from_internal_pointer(ptr_addr, usize::MAX)
256+
.unwrap();
257+
let offset = Address::from_ptr((*m).ptr) - object.to_raw_address();
258+
let ptr_address = Address::from_ptr((::std::ptr::addr_of!((*m).ptr)));
259+
process_offset_slot(closure, ptr_address, offset);
260+
}
261+
249262
return;
250263
}
251264

252265
if (*m).length == 0 {
253266
return;
254267
}
255268

269+
if how == 1 {
270+
let ptr_addr = Address::from_ptr((*m).ptr);
271+
// m.ptr might be an internal pointer
272+
// find the beginning of the object and trace it since the object may have moved
273+
if crate::object_model::is_addr_in_immixspace(ptr_addr) {
274+
let object =
275+
memory_manager::find_object_from_internal_pointer(ptr_addr, usize::MAX)
276+
.unwrap();
277+
let offset = Address::from_ptr((*m).ptr) - object.to_raw_address();
278+
println!(
279+
"obj = {}, m->ptr = {}, offset = {}",
280+
object.to_raw_address(),
281+
Address::from_ptr((*m).ptr),
282+
offset
283+
);
284+
let ptr_address = Address::from_ptr((::std::ptr::addr_of!((*m).ptr)));
285+
process_offset_slot(closure, ptr_address, offset);
286+
return;
287+
}
288+
}
289+
290+
// m.ptr is interior to the same object
291+
// or malloced
292+
// debug_assert!((how == 0 || how == 2) && is_malloced_obj() || is_interior_pointer())
293+
256294
let layout = (*vt).layout;
257295
if (*layout).flags.arrayelem_isboxed() != 0 {
258296
let length = (*m).length;

0 commit comments

Comments
 (0)