summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gc.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/gc.c b/gc.c
index 28ac2082ee..66bdb012b6 100644
--- a/gc.c
+++ b/gc.c
@@ -8397,10 +8397,6 @@ gc_compact_after_gc(rb_objspace_t *objspace, int use_toward_empty, int use_doubl
heap_eden->free_pages = NULL;
heap_eden->using_page = NULL;
- if (use_verifier) {
- gc_verify_internal_consistency(objspace);
- }
-
while (moved_list) {
VALUE next_moved;
struct heap_page *page;
@@ -8413,10 +8409,19 @@ gc_compact_after_gc(rb_objspace_t *objspace, int use_toward_empty, int use_doubl
RMOVED(moved_list)->next = 0;
page->free_slots++;
heap_page_add_freeobj(objspace, page, moved_list);
+ if (page->free_slots == page->total_slots) {
+ heap_pages_freeable_pages--;
+ heap_unlink_page(objspace, heap_eden, page);
+ heap_add_page(objspace, heap_tomb, page);
+ }
objspace->profile.total_freed_objects++;
moved_list = next_moved;
}
+ if (use_verifier) {
+ gc_verify_internal_consistency(objspace);
+ }
+
mjit_gc_exit_hook(); // unlock MJIT here, because `rb_gc()` calls `mjit_gc_start_hook()` again.
}