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.
This commit is contained in:
Peter Zhu 2024-09-03 13:44:09 -04:00
parent 53eaa67305
commit ef42e04a1a

5
gc.c
View File

@ -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; \