Skip to content

Commit 82933eb

Browse files
committed
gc: Add more assertions
1 parent 19c82be commit 82933eb

File tree

2 files changed

+17
-6
lines changed

2 files changed

+17
-6
lines changed

gc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1407,7 +1407,7 @@ rb_gc_obj_needs_cleanup_p(VALUE obj)
14071407
return true;
14081408

14091409
default:
1410-
UNREACHABLE_RETURN(true);
1410+
rb_bug("bad object type in needs_cleanup_p: %lu", flags & RUBY_T_MASK);
14111411
}
14121412
}
14131413

gc/default/default.c

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)