@@ -1683,7 +1683,7 @@ check_rvalue_consistency_force(rb_objspace_t *objspace, const VALUE obj, int ter
16831683 fprintf (stderr , "check_rvalue_consistency: %s is T_NONE.\n" , rb_obj_info (obj ));
16841684 err ++ ;
16851685 }
1686- if (BUILTIN_TYPE (obj ) == T_ZOMBIE ) {
1686+ if (BUILTIN_TYPE (obj ) == T_ZOMBIE && ! FL_TEST ( obj , FL_FREEZE ) ) {
16871687 fprintf (stderr , "check_rvalue_consistency: %s is T_ZOMBIE.\n" , rb_obj_info (obj ));
16881688 err ++ ;
16891689 }
@@ -3977,7 +3977,7 @@ gc_sweep_plane(rb_objspace_t *objspace, rb_heap_t *heap, uintptr_t p, bits_t bit
39773977 ctx -> empty_slots ++ ;
39783978 heap_page_add_freeobj (objspace , sweep_page , vp );
39793979 break ;
3980- case T_ZOMBIE : // FIXME: no more zombies?
3980+ case T_ZOMBIE :
39813981 if (ZOMBIE_NEEDS_FREE_P (vp )) {
39823982 goto free_object ;
39833983 }
@@ -3993,8 +3993,8 @@ gc_sweep_plane(rb_objspace_t *objspace, rb_heap_t *heap, uintptr_t p, bits_t bit
39933993 psweep_debug (0 , "[gc] gc_sweep_plane: heap:%p (%ld) freeing obj:%p (%s)\n" , heap , heap - heaps , (void * )vp , rb_obj_info (vp ));
39943994#if RGENGC_CHECK_MODE
39953995 if (!is_full_marking (objspace )) {
3996- if (RVALUE_OLD_P (objspace , vp )) rb_bug ("page_sweep: %p - old while minor GC." , (void * )p );
3997- if (RVALUE_REMEMBERED (objspace , vp )) rb_bug ("page_sweep: %p - remembered." , (void * )p );
3996+ if (RVALUE_OLD_P (objspace , vp )) rb_bug ("page_sweep: %p - old while minor GC." , (void * )vp );
3997+ if (RVALUE_REMEMBERED (objspace , vp )) rb_bug ("page_sweep: %p - remembered." , (void * )vp );
39983998 }
39993999#endif
40004000
@@ -4021,7 +4021,7 @@ gc_sweep_plane(rb_objspace_t *objspace, rb_heap_t *heap, uintptr_t p, bits_t bit
40214021 ctx -> freed_slots ++ ;
40224022 }
40234023 else {
4024- gc_report (2 , objspace , "page_sweep: free %p\n" , (void * )p );
4024+ gc_report (2 , objspace , "page_sweep: free %p\n" , (void * )vp );
40254025
40264026 rb_gc_event_hook (vp , RUBY_INTERNAL_EVENT_FREEOBJ );
40274027
@@ -4040,6 +4040,9 @@ gc_sweep_plane(rb_objspace_t *objspace, rb_heap_t *heap, uintptr_t p, bits_t bit
40404040 break ;
40414041 }
40424042 }
4043+ else {
4044+ GC_ASSERT (RVALUE_MARKED (objspace , vp ));
4045+ }
40434046 p += slot_size ;
40444047 bitset >>= 1 ;
40454048 } while (bitset );
@@ -4107,6 +4110,11 @@ deferred_free(rb_objspace_t *objspace, VALUE obj)
41074110 result = true;
41084111 }
41094112 else {
4113+ #if RUBY_DEBUG
4114+ if (!(BUILTIN_TYPE (obj ) == T_ZOMBIE && !FL_TEST (obj , FL_FREEZE ))) {
4115+ rb_bug ("should be unfreeable zombie" );
4116+ }
4117+ #endif
41104118 result = false;
41114119 MAYBE_UNUSED (struct heap_page * page ) = GET_HEAP_PAGE (obj );
41124120 psweep_debug (1 , "[gc] deferred sweep: page(%p) obj(%p) %s (zombie)\n" , page , (void * )obj , obj_info );
@@ -4514,6 +4522,9 @@ gc_pre_sweep_plane(rb_objspace_t *objspace, rb_heap_t *heap, struct heap_page *p
45144522 }
45154523 }
45164524 }
4525+ else {
4526+ GC_ASSERT (RVALUE_MARKED (objspace , vp ));
4527+ }
45174528
45184529 p += slot_size ;
45194530 bitset >>= 1 ;
0 commit comments