@@ -373,11 +373,68 @@ unsafe fn mmtk_jl_genericmemory_data_owner_field_address(m: *const jl_genericmem
373
373
// mmtk_jl_genericmemory_data_owner_field_address(m).load::<*const mmtk_jl_value_t>()
374
374
// }
375
375
376
+ pub unsafe fn mmtk_scan_gcpreserve_stack < ' a , EV : SlotVisitor < JuliaVMSlot > > (
377
+ ta : * const jl_task_t ,
378
+ closure : & ' a mut EV ,
379
+ ) {
380
+ // process transitively pinning stack
381
+ let mut s = ( * ta) . gcpreserve_stack ;
382
+ let ( offset, lb, ub) = ( 0 as isize , 0 as u64 , u64:: MAX ) ;
383
+
384
+ if s != std:: ptr:: null_mut ( ) {
385
+ let s_nroots_addr = :: std:: ptr:: addr_of!( ( * s) . nroots) ;
386
+ let mut nroots = read_stack ( Address :: from_ptr ( s_nroots_addr) , offset, lb, ub) ;
387
+ debug_assert ! ( nroots. as_usize( ) <= u32 :: MAX as usize ) ;
388
+ let mut nr = nroots >> 3 ;
389
+
390
+ loop {
391
+ let rts = Address :: from_mut_ptr ( s) . shift :: < Address > ( 2 ) ;
392
+ let mut i = 0 ;
393
+
394
+ while i < nr {
395
+ let real_addr = get_stack_addr ( rts. shift :: < Address > ( i as isize ) , offset, lb, ub) ;
396
+
397
+ let slot = read_stack ( rts. shift :: < Address > ( i as isize ) , offset, lb, ub) ;
398
+ use crate :: julia_finalizer:: gc_ptr_tag;
399
+ // malloced pointer tagged in jl_gc_add_quiescent
400
+ // skip both the next element (native function), and the object
401
+ if slot & 3usize == 3 {
402
+ i += 2 ;
403
+ continue ;
404
+ }
405
+
406
+ // pointer is not malloced but function is native, so skip it
407
+ if gc_ptr_tag ( slot, 1 ) {
408
+ i += 2 ;
409
+ continue ;
410
+ }
411
+
412
+ process_slot ( closure, real_addr) ;
413
+ i += 1 ;
414
+ }
415
+
416
+ let s_prev_address = :: std:: ptr:: addr_of!( ( * s) . prev) ;
417
+ let sprev = read_stack ( Address :: from_ptr ( s_prev_address) , offset, lb, ub) ;
418
+ if sprev. is_zero ( ) {
419
+ break ;
420
+ }
421
+
422
+ s = sprev. to_mut_ptr :: < jl_gcframe_t > ( ) ;
423
+ let s_nroots_addr = :: std:: ptr:: addr_of!( ( * s) . nroots) ;
424
+ let new_nroots = read_stack ( Address :: from_ptr ( s_nroots_addr) , offset, lb, ub) ;
425
+ nroots = new_nroots;
426
+ nr = nroots >> 3 ;
427
+ continue ;
428
+ }
429
+ }
430
+ }
431
+
376
432
pub unsafe fn mmtk_scan_gcstack < ' a , EV : SlotVisitor < JuliaVMSlot > > (
377
433
ta : * const jl_task_t ,
378
434
mut closure : & ' a mut EV ,
379
435
mut pclosure : Option < & ' a mut EV > ,
380
436
) {
437
+ // process Julia's standard shadow (GC) stack
381
438
let stkbuf = ( * ta) . ctx . stkbuf ;
382
439
let copy_stack = ( * ta) . ctx . copy_stack_custom ( ) ;
383
440
0 commit comments