@@ -6,18 +6,7 @@ impl<'a> VM<'a> {
66 /* Mark all reachable roots then sweep; non-heap Vals are no-op to mark. */
77 pub ( crate ) fn collect ( & mut self , current_slots : & [ Val ] ) {
88 for & v in & self . stack { self . heap . mark ( v) ; }
9- for sf in & self . pending_sync_frames {
10- for & v in & sf. slots { self . heap . mark ( v) ; }
11- for & v in & sf. stack_delta { self . heap . mark ( v) ; }
12- for fr in & sf. iter_delta {
13- match fr {
14- IterFrame :: Seq { items, .. } => for & v in items { self . heap . mark ( v) ; } ,
15- IterFrame :: Coroutine ( v) => self . heap . mark ( * v) ,
16- IterFrame :: UserDefined ( v) => self . heap . mark ( * v) ,
17- IterFrame :: Range { .. } => { }
18- }
19- }
20- }
9+ for sf in & self . pending_sync_frames { sf. for_each_val ( & mut |v| heap. mark ( v) ) ; }
2110 for & v in & self . with_stack { self . heap . mark ( v) ; }
2211 for & v in & self . yields { self . heap . mark ( v) ; }
2312 for & v in & self . event_queue { self . heap . mark ( v) ; }
@@ -40,16 +29,9 @@ impl<'a> VM<'a> {
4029 }
4130 for & v in self . globals . values ( ) { self . heap . mark ( v) ; }
4231 for & v in self . module_state . values ( ) { self . heap . mark ( v) ; }
43- for frame in & self . iter_stack {
44- match frame {
45- IterFrame :: Seq { items, .. } => {
46- for & v in items { self . heap . mark ( v) ; }
47- }
48- IterFrame :: Coroutine ( v) => self . heap . mark ( * v) ,
49- IterFrame :: UserDefined ( v) => self . heap . mark ( * v) ,
50- IterFrame :: Range { .. } => { }
51- }
52- }
32+ let heap = & mut self . heap ; // split borrow: lets closures take &mut heap while iterating other fields
33+ for frame in & self . iter_stack { frame. for_each_val ( & mut |v| heap. mark ( v) ) ; }
34+ for sf in & self . pending_sync_frames { sf. for_each_val ( & mut |v| heap. mark ( v) ) ; }
5335 for cache in self . opcode_caches . values ( ) {
5436 if let Some ( consts) = cache. const_vals_opt ( ) {
5537 for & v in consts { self . heap . mark ( v) ; }
0 commit comments