diff options
Diffstat (limited to 'gc.c')
-rw-r--r-- | gc.c | 11 |
1 files changed, 8 insertions, 3 deletions
@@ -4231,7 +4231,8 @@ allrefs_add(struct allrefs *data, VALUE obj) struct reflist *refs; if (st_lookup(data->references, obj, (st_data_t *)&refs)) { - return reflist_add(refs, data->root_obj); + reflist_add(refs, data->root_obj); + return 0; } else { refs = reflist_create(data->root_obj); @@ -4244,9 +4245,11 @@ static void allrefs_i(VALUE obj, void *ptr) { struct allrefs *data = (struct allrefs *)ptr; - if (allrefs_add(data, obj)) /* follow new reference */ + + if (allrefs_add(data, obj)) { push_mark_stack(&data->objspace->mark_stack, obj); } +} static void allrefs_roots_i(VALUE obj, void *ptr) @@ -4254,9 +4257,11 @@ allrefs_roots_i(VALUE obj, void *ptr) struct allrefs *data = (struct allrefs *)ptr; if (strlen(data->category) == 0) rb_bug("!!!"); data->root_obj = MAKE_ROOTSIG(data->category); - allrefs_add(data, obj); + + if (allrefs_add(data, obj)) { push_mark_stack(&data->objspace->mark_stack, obj); } +} static st_table * objspace_allrefs(rb_objspace_t *objspace) |