Skip to content

Commit 0a4e92b

Browse files
authored
Trace the owner field of bindings (mmtk#169)
The `owner` field points to the module that a binding belongs to. It was not traced. So if the module is moved, the pointer becomes invalid. The alternative is to pin or use non moving allocation for all the module objects here: https://github.com/mmtk/julia/blob/d98aa333178d372d96f3c99c712edf0018a50289/src/module.c#L15.
1 parent 173b338 commit 0a4e92b

File tree

1 file changed

+5
-0
lines changed

1 file changed

+5
-0
lines changed

mmtk/src/julia_scanning.rs

+5
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,13 @@ pub unsafe fn scan_julia_object<SV: SlotVisitor<JuliaVMSlot>>(obj: Address, clos
6464
let value = ::std::ptr::addr_of!((*b).value);
6565
let globalref = ::std::ptr::addr_of!((*b).globalref);
6666
let ty = ::std::ptr::addr_of!((*b).ty);
67+
let owner = ::std::ptr::addr_of!((*b).owner);
6768

6869
process_slot(closure, Address::from_usize(value as usize));
6970
process_slot(closure, Address::from_usize(globalref as usize));
7071
process_slot(closure, Address::from_usize(ty as usize));
72+
process_slot(closure, Address::from_usize(owner as usize));
73+
7174
// clearing tag bits
7275
Address::from_usize(as_tagged_value).store::<usize>(t_header.as_usize() & !3);
7376
return;
@@ -234,10 +237,12 @@ pub unsafe fn scan_julia_object<SV: SlotVisitor<JuliaVMSlot>>(obj: Address, clos
234237
let value = ::std::ptr::addr_of!((*b).value);
235238
let globalref = ::std::ptr::addr_of!((*b).globalref);
236239
let ty = ::std::ptr::addr_of!((*b).ty);
240+
let owner = ::std::ptr::addr_of!((*b).owner);
237241

238242
process_slot(closure, Address::from_usize(value as usize));
239243
process_slot(closure, Address::from_usize(globalref as usize));
240244
process_slot(closure, Address::from_usize(ty as usize));
245+
process_slot(closure, Address::from_usize(owner as usize));
241246
begin = begin.shift::<Address>(2);
242247
}
243248

0 commit comments

Comments
 (0)