summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authortenderlove <tenderlove@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2019-04-17 05:19:05 +0000
committertenderlove <tenderlove@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2019-04-17 05:19:05 +0000
commit62c07674e06443075872bdc11662de6408bd00d2 (patch)
tree5502e4b9cba9013badff017095e9d599b470627b /gc.c
parentdbc9f43cb38acc037b152949a9f7b98362a6dcac (diff)
make verification more strict
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67581 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c28
1 files 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