summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authorAaron Patterson <tenderlove@ruby-lang.org>2019-10-07 10:14:13 -0700
committerAaron Patterson <tenderlove@ruby-lang.org>2019-10-07 10:57:30 -0700
commit0a2f04e156cb717dcf78f2ea9bfe26f864a24616 (patch)
treeff387665197459047b868a2885e49f85e24b3858 /gc.c
parentd8b6f585027a5657c6921f97513a8cf70a031c94 (diff)
Eliminate second GC pass for eliminating T_MOVED
`T_MOVED` is a linked list, so we can just iterate through the `T_MOVED` objects, clearing them out and adding them to respective free lists.
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c23
1 files changed, 13 insertions, 10 deletions
diff --git a/gc.c b/gc.c
index 86c9c672c8..28ac2082ee 100644
--- a/gc.c
+++ b/gc.c
@@ -8401,20 +8401,23 @@ gc_compact_after_gc(rb_objspace_t *objspace, int use_toward_empty, int use_doubl
gc_verify_internal_consistency(objspace);
}
-#if __has_feature(address_sanitizer)
while (moved_list) {
- VALUE current = moved_list;
- moved_list = RANY(moved_list)->as.moved.next;
- asan_poison_object(current);
+ VALUE next_moved;
+ struct heap_page *page;
+
+ page = GET_HEAP_PAGE(moved_list);
+ next_moved = RMOVED(moved_list)->next;
+
+ RMOVED(moved_list)->flags = 0;
+ RMOVED(moved_list)->destination = 0;
+ RMOVED(moved_list)->next = 0;
+ page->free_slots++;
+ heap_page_add_freeobj(objspace, page, moved_list);
+ objspace->profile.total_freed_objects++;
+ moved_list = next_moved;
}
-#else
- (void)moved_list;
-#endif
mjit_gc_exit_hook(); // unlock MJIT here, because `rb_gc()` calls `mjit_gc_start_hook()` again.
-
- /* GC after compaction to eliminate T_MOVED */
- garbage_collect(objspace, GPR_DEFAULT_REASON);
}
/*