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:
parent
53eaa67305
commit
ef42e04a1a
5
gc.c
5
gc.c
@ -2042,7 +2042,10 @@ ruby_stack_check(void)
|
|||||||
if (LIKELY(vm->gc.mark_func_data == NULL)) { \
|
if (LIKELY(vm->gc.mark_func_data == NULL)) { \
|
||||||
(func)(vm->gc.objspace, (obj_or_ptr)); \
|
(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)); \
|
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; \
|
struct gc_mark_func_data_struct *mark_func_data = vm->gc.mark_func_data; \
|
||||||
vm->gc.mark_func_data = NULL; \
|
vm->gc.mark_func_data = NULL; \
|
||||||
|
Loading…
x
Reference in New Issue
Block a user