@@ -4519,26 +4519,33 @@ gc_pre_sweep_plane(rb_objspace_t *objspace, rb_heap_t *heap, struct heap_page *p
45194519 }
45204520 break ;
45214521 free : {
4522- debug_free_check (objspace , vp );
4523- if (RB_LIKELY (rb_gc_obj_free_concurrency_safe_vm_weak_references (vp ))) {
4524- bool can_put_back_on_freelist = rb_gc_obj_free (objspace , vp );
4525- if (can_put_back_on_freelist ) {
4526- heap_page_add_freeobj (objspace , page , vp , true);
4527- freed ++ ;
4528- psweep_debug (2 , "[sweep] freed: page(%p), obj(%p)\n" , (void * )page , (void * )vp );
4529- (void )VALGRIND_MAKE_MEM_UNDEFINED ((void * )vp , page -> slot_size );
4530- }
4531- else {
4532- RUBY_ASSERT (BUILTIN_TYPE (vp ) == T_ZOMBIE );
4533- psweep_debug (2 , "[sweep] zombie: page(%p), obj(%p)\n" , (void * )page , (void * )vp );
4534- finals ++ ;
4535- }
4536- }
4537- else {
4538- GC_ASSERT (BUILTIN_TYPE (vp ) != T_NONE );
4539- sweep_in_ruby_thread (objspace , page , vp );
4540- }
4541- break ;
4522+ debug_free_check (objspace , vp );
4523+ if (!rb_gc_obj_needs_cleanup_p (vp )) {
4524+ heap_page_add_freeobj (objspace , page , vp , true);
4525+ (void )VALGRIND_MAKE_MEM_UNDEFINED ((void * )vp , page -> slot_size );
4526+ freed ++ ;
4527+ }
4528+ else {
4529+ if (RB_LIKELY (rb_gc_obj_free_concurrency_safe_vm_weak_references (vp ))) {
4530+ bool can_put_back_on_freelist = rb_gc_obj_free (objspace , vp );
4531+ if (can_put_back_on_freelist ) {
4532+ heap_page_add_freeobj (objspace , page , vp , true);
4533+ freed ++ ;
4534+ psweep_debug (2 , "[sweep] freed: page(%p), obj(%p)\n" , (void * )page , (void * )vp );
4535+ (void )VALGRIND_MAKE_MEM_UNDEFINED ((void * )vp , page -> slot_size );
4536+ }
4537+ else {
4538+ RUBY_ASSERT (BUILTIN_TYPE (vp ) == T_ZOMBIE );
4539+ psweep_debug (2 , "[sweep] zombie: page(%p), obj(%p)\n" , (void * )page , (void * )vp );
4540+ finals ++ ;
4541+ }
4542+ }
4543+ else {
4544+ GC_ASSERT (BUILTIN_TYPE (vp ) != T_NONE );
4545+ sweep_in_ruby_thread (objspace , page , vp );
4546+ }
4547+ }
4548+ break ;
45424549 }
45434550 default :
45444551 rb_bug ("unexpected type: %d\n" , BUILTIN_TYPE (vp ));
0 commit comments