@@ -4,6 +4,7 @@ use crate::slots::JuliaVMSlot;
4
4
use crate :: slots:: OffsetSlot ;
5
5
use crate :: JULIA_BUFF_TAG ;
6
6
use memoffset:: offset_of;
7
+ use mmtk:: memory_manager;
7
8
use mmtk:: util:: { Address , ObjectReference } ;
8
9
use mmtk:: vm:: slot:: SimpleSlot ;
9
10
use mmtk:: vm:: SlotVisitor ;
@@ -246,13 +247,50 @@ pub unsafe fn scan_julia_object<SV: SlotVisitor<JuliaVMSlot>>(obj: Address, clos
246
247
let owner_addr = mmtk_jl_genericmemory_data_owner_field_address ( m) ;
247
248
process_slot ( closure, owner_addr) ;
248
249
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
+
249
262
return ;
250
263
}
251
264
252
265
if ( * m) . length == 0 {
253
266
return ;
254
267
}
255
268
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
+
256
294
let layout = ( * vt) . layout ;
257
295
if ( * layout) . flags . arrayelem_isboxed ( ) != 0 {
258
296
let length = ( * m) . length ;
0 commit comments