@@ -4,6 +4,7 @@ use crate::slots::JuliaVMSlot;
44use crate :: slots:: OffsetSlot ;
55use crate :: JULIA_BUFF_TAG ;
66use memoffset:: offset_of;
7+ use mmtk:: memory_manager;
78use mmtk:: util:: { Address , ObjectReference } ;
89use mmtk:: vm:: slot:: SimpleSlot ;
910use 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