From 62c07674e06443075872bdc11662de6408bd00d2 Mon Sep 17 00:00:00 2001 From: tenderlove Date: Wed, 17 Apr 2019 05:19:05 +0000 Subject: make verification more strict git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67581 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- gc.c | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/gc.c b/gc.c index f3497c3a7c..37bdcbb7af 100644 --- a/gc.c +++ b/gc.c @@ -8130,20 +8130,32 @@ gc_check_references_for_moved(VALUE dummy) * make a SEGV. */ static VALUE -gc_verify_compaction_references(VALUE dummy) +gc_verify_compaction_references(VALUE mod) { - VALUE stats; rb_objspace_t *objspace = &rb_objspace; - /* Double heap size */ - heap_add_pages(objspace, heap_eden, heap_allocated_pages); + /* Ensure objects are pinned */ + rb_gc(); + + /* Drain interrupts so that THEAP has a chance to evacuate before + * any possible compaction. */ + rb_thread_execute_interrupts(rb_thread_current()); + + gc_compact_heap(objspace); + + heap_eden->freelist = NULL; + gc_update_references(objspace); + gc_check_references_for_moved(mod); - stats = rb_gc_compact(dummy); + rb_clear_method_cache_by_class(rb_cObject); + rb_clear_constant_cache(); + heap_eden->free_pages = NULL; + heap_eden->using_page = NULL; - gc_check_references_for_moved(dummy); - gc_verify_internal_consistency(dummy); + /* GC after compaction to eliminate T_MOVED */ + rb_gc(); - return stats; + return rb_gc_compact_stats(mod); } VALUE -- cgit v1.2.3