From d7eb7bbccef6da8951c8a2427354f87156918909 Mon Sep 17 00:00:00 2001 From: ko1 Date: Wed, 13 Jul 2016 07:08:32 +0000 Subject: [PATCH] * gc.c (gc_mark_roots): should mark the VM object itself to mark singleton class of the VM object. Before this patch, we only set mark bit for the VM object and invoke mark function separately. [Bug #12583] * test/ruby/test_gc.rb: add a test. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55663 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 10 ++++++++++ gc.c | 2 +- test/ruby/test_gc.rb | 7 +++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 97443227e8..654f9712b1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +Wed Jul 13 16:08:08 2016 Koichi Sasada + + * gc.c (gc_mark_roots): should mark the VM object itself to mark + singleton class of the VM object. + Before this patch, we only set mark bit for the VM object and + invoke mark function separately. + [Bug #12583] + + * test/ruby/test_gc.rb: add a test. + Wed Jul 13 15:59:59 2016 NAKAMURA Usaku * math.c (_USE_MATH_DEFINES): it must be set before including internal.h diff --git a/gc.c b/gc.c index ebfb037c1e..e72006898c 100644 --- a/gc.c +++ b/gc.c @@ -4694,7 +4694,7 @@ gc_mark_roots(rb_objspace_t *objspace, const char **categoryp) MARK_CHECKPOINT("vm"); SET_STACK_END; rb_vm_mark(th->vm); - if (th->vm->self) gc_mark_set(objspace, th->vm->self); + if (th->vm->self) gc_mark(objspace, th->vm->self); MARK_CHECKPOINT("finalizers"); mark_tbl(objspace, finalizer_table); diff --git a/test/ruby/test_gc.rb b/test/ruby/test_gc.rb index d915ae25d7..a5fd2897a2 100644 --- a/test/ruby/test_gc.rb +++ b/test/ruby/test_gc.rb @@ -390,4 +390,11 @@ class TestGc < Test::Unit::TestCase GC.enable unless disabled end end + + def test_vm_object + assert_normal_exit <<-'end', '[Bug #12583]' + ObjectSpace.each_object{|o| o.singleton_class rescue 0} + ObjectSpace.each_object{|o| case o when Module then o.instance_methods end} + end + end end