@@ -183,7 +183,9 @@ impl MarkSweepGarbageCollector {
183183 let ephemerons = core:: mem:: take ( & mut * self . ephemeron_queue . borrow_mut ( ) ) ;
184184 for ephemeron in ephemerons {
185185 let ephemeron_ref = unsafe { ephemeron. as_ref ( ) } ;
186- unsafe { ephemeron_ref. value ( ) . drop_fn ( ) ( ephemeron) } ;
186+ let vtable = ephemeron_ref. value ( ) ;
187+ unsafe { vtable. finalize_fn ( ) ( ephemeron) } ;
188+ unsafe { vtable. drop_fn ( ) ( ephemeron) } ;
187189 self . allocator
188190 . borrow_mut ( )
189191 . free_slot ( ephemeron. cast :: < u8 > ( ) ) ;
@@ -192,14 +194,18 @@ impl MarkSweepGarbageCollector {
192194 let roots = core:: mem:: take ( & mut * self . root_queue . borrow_mut ( ) ) ;
193195 for node in roots {
194196 let node_ref = unsafe { node. as_ref ( ) } ;
195- unsafe { node_ref. value ( ) . drop_fn ( ) ( node) } ;
197+ let gc_box = node_ref. value ( ) ;
198+ unsafe { gc_box. finalize_fn ( ) ( node) } ;
199+ unsafe { gc_box. drop_fn ( ) ( node) } ;
196200 self . allocator . borrow_mut ( ) . free_slot ( node. cast :: < u8 > ( ) ) ;
197201 }
198202
199203 let pending_e = core:: mem:: take ( & mut * self . pending_ephemeron_queue . borrow_mut ( ) ) ;
200204 for ephemeron in pending_e {
201205 let ephemeron_ref = unsafe { ephemeron. as_ref ( ) } ;
202- unsafe { ephemeron_ref. value ( ) . drop_fn ( ) ( ephemeron) } ;
206+ let vtable = ephemeron_ref. value ( ) ;
207+ unsafe { vtable. finalize_fn ( ) ( ephemeron) } ;
208+ unsafe { vtable. drop_fn ( ) ( ephemeron) } ;
203209 self . allocator
204210 . borrow_mut ( )
205211 . free_slot ( ephemeron. cast :: < u8 > ( ) ) ;
@@ -208,7 +214,9 @@ impl MarkSweepGarbageCollector {
208214 let pending_r = core:: mem:: take ( & mut * self . pending_root_queue . borrow_mut ( ) ) ;
209215 for node in pending_r {
210216 let node_ref = unsafe { node. as_ref ( ) } ;
211- unsafe { node_ref. value ( ) . drop_fn ( ) ( node) } ;
217+ let gc_box = node_ref. value ( ) ;
218+ unsafe { gc_box. finalize_fn ( ) ( node) } ;
219+ unsafe { gc_box. drop_fn ( ) ( node) } ;
212220 self . allocator . borrow_mut ( ) . free_slot ( node. cast :: < u8 > ( ) ) ;
213221 }
214222 }
@@ -298,7 +306,7 @@ impl MarkSweepGarbageCollector {
298306 // Check if the value is not reachable, i.e. dead.
299307 if !gc_box. is_reachable ( color) {
300308 // Finalize the dead item
301- gc_box. finalize ( ) ;
309+ unsafe { gc_box. finalize_fn ( ) ( * node ) } ;
302310 // Recheck if the value is now rooted again after finalization.
303311 if gc_box. is_rooted ( ) {
304312 unsafe { gc_box. trace_fn ( ) ( * node, color) } ;
0 commit comments