summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/gc.c b/gc.c
index be61b3dad1..1bb78add2a 100644
--- a/gc.c
+++ b/gc.c
@@ -4655,10 +4655,6 @@ gc_mark_maybe_(rb_objspace_t *objspace, VALUE obj, int pin)
unpoison_object(obj, false);
type = BUILTIN_TYPE(obj);
- if (type == T_MOVED || type == T_ZOMBIE) {
- gc_pin(objspace, obj);
- }
-
/* Garbage can live on the stack, so do not mark or pin */
if (type != T_MOVED && type != T_ZOMBIE && type != T_NONE) {
if (pin) {
@@ -7984,6 +7980,7 @@ gc_ref_update(void *vstart, void *vend, size_t stride, void * data)
page->freelist = NULL;
poison_memory_region(&page->freelist, sizeof(RVALUE*));
page->flags.has_uncollectible_shady_objects = FALSE;
+ page->flags.has_remembered_objects = FALSE;
/* For each object on the page */
for (; v != (VALUE)vend; v += stride) {
@@ -7998,6 +7995,9 @@ gc_ref_update(void *vstart, void *vend, size_t stride, void * data)
if (RVALUE_WB_UNPROTECTED(v)) {
page->flags.has_uncollectible_shady_objects = TRUE;
}
+ if (RVALUE_PAGE_MARKING(page, v)) {
+ page->flags.has_remembered_objects = TRUE;
+ }
gc_update_object_references(objspace, v);
}
}
@@ -8145,6 +8145,7 @@ gc_verify_compaction_references(VALUE mod)
/* Ensure objects are pinned */
rb_gc();
+ rb_gc_disable();
gc_compact_heap(objspace);
@@ -8157,6 +8158,8 @@ gc_verify_compaction_references(VALUE mod)
heap_eden->free_pages = NULL;
heap_eden->using_page = NULL;
+ gc_verify_internal_consistency(mod);
+ rb_gc_enable();
/* GC after compaction to eliminate T_MOVED */
rb_gc();