@@ -37,12 +37,7 @@ impl<VM: VMBinding> SFT for MarkCompactSpace<VM> {
3737 }
3838
3939 fn get_forwarded_object ( & self , object : ObjectReference ) -> Option < ObjectReference > {
40- let forwarding_pointer = Self :: get_header_forwarding_pointer ( object) ;
41- if forwarding_pointer. is_null ( ) {
42- None
43- } else {
44- Some ( forwarding_pointer)
45- }
40+ Self :: get_header_forwarding_pointer ( object)
4641 }
4742
4843 fn is_live ( & self , object : ObjectReference ) -> bool {
@@ -130,7 +125,6 @@ impl<VM: VMBinding> crate::policy::gc_work::PolicyTraceObject<VM> for MarkCompac
130125 _copy : Option < CopySemantics > ,
131126 _worker : & mut GCWorker < VM > ,
132127 ) -> ObjectReference {
133- debug_assert ! ( !object. is_null( ) ) ;
134128 debug_assert ! (
135129 KIND != TRACE_KIND_TRANSITIVE_PIN ,
136130 "MarkCompact does not support transitive pin trace."
@@ -177,8 +171,9 @@ impl<VM: VMBinding> MarkCompactSpace<VM> {
177171 }
178172
179173 /// Get header forwarding pointer for an object
180- fn get_header_forwarding_pointer ( object : ObjectReference ) -> ObjectReference {
181- unsafe { Self :: header_forwarding_pointer_address ( object) . load :: < ObjectReference > ( ) }
174+ fn get_header_forwarding_pointer ( object : ObjectReference ) -> Option < ObjectReference > {
175+ let addr = unsafe { Self :: header_forwarding_pointer_address ( object) . load :: < Address > ( ) } ;
176+ ObjectReference :: from_raw_address ( addr)
182177 }
183178
184179 /// Store header forwarding pointer for an object
@@ -251,7 +246,9 @@ impl<VM: VMBinding> MarkCompactSpace<VM> {
251246 queue. enqueue ( object) ;
252247 }
253248
254- Self :: get_header_forwarding_pointer ( object)
249+ Self :: get_header_forwarding_pointer ( object) . unwrap_or_else ( || {
250+ panic ! ( "trace_forward_object called when an object is not forwarded, yet. object: {object}" )
251+ } )
255252 }
256253
257254 pub fn test_and_mark ( object : ObjectReference ) -> bool {
@@ -388,10 +385,9 @@ impl<VM: VMBinding> MarkCompactSpace<VM> {
388385 // clear the VO bit
389386 vo_bit:: unset_vo_bit :: < VM > ( obj) ;
390387
391- let forwarding_pointer = Self :: get_header_forwarding_pointer ( obj) ;
392-
393- trace ! ( "Compact {} to {}" , obj, forwarding_pointer) ;
394- if !forwarding_pointer. is_null ( ) {
388+ let maybe_forwarding_pointer = Self :: get_header_forwarding_pointer ( obj) ;
389+ if let Some ( forwarding_pointer) = maybe_forwarding_pointer {
390+ trace ! ( "Compact {} to {}" , obj, forwarding_pointer) ;
395391 let new_object = forwarding_pointer;
396392 Self :: clear_header_forwarding_pointer ( new_object) ;
397393
@@ -403,6 +399,8 @@ impl<VM: VMBinding> MarkCompactSpace<VM> {
403399 vo_bit:: set_vo_bit :: < VM > ( new_object) ;
404400 to = new_object. to_object_start :: < VM > ( ) + copied_size;
405401 debug_assert_eq ! ( end_of_new_object, to) ;
402+ } else {
403+ trace ! ( "Skipping dead object {}" , obj) ;
406404 }
407405 }
408406 }
0 commit comments