From ef42e04a1a623df533815d3d9305a79fb69b1593 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Tue, 3 Sep 2024 13:44:09 -0400 Subject: [PATCH] Don't traverse garbage objects in heap traversal The object could be garbage (e.g. T_NONE, T_MOVED, or T_ZOMBIE) so we don't want to traverse those. --- gc.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/gc.c b/gc.c index 8665f719ab..3234784797 100644 --- a/gc.c +++ b/gc.c @@ -2042,7 +2042,10 @@ ruby_stack_check(void) if (LIKELY(vm->gc.mark_func_data == NULL)) { \ (func)(vm->gc.objspace, (obj_or_ptr)); \ } \ - else if (check_obj ? rb_gc_impl_pointer_to_heap_p(vm->gc.objspace, (const void *)obj) : true) { \ + else if (check_obj ? \ + rb_gc_impl_pointer_to_heap_p(vm->gc.objspace, (const void *)obj) && \ + !rb_gc_impl_garbage_object_p(vm->gc.objspace, obj) : \ + true) { \ GC_ASSERT(!rb_gc_impl_during_gc_p(vm->gc.objspace)); \ struct gc_mark_func_data_struct *mark_func_data = vm->gc.mark_func_data; \ vm->gc.mark_func_data = NULL; \