Bug #842: endless loop of ObjectSpace.each_object
http://redmine.ruby-lang.org/issues/show/842

起票者: Narihiro Nakamura
ステータス: Open, 優先度: Normal

nariです.

以下の様にすると無限ループに入ります.

$ ./miniruby -v                                                          
ruby 1.9.1 (2008-12-10 revision 20602) [i686-linux]
$ ./miniruby -e "GC.disable; ObjectSpace.each_object{ String.new('a') }"

これがバグなのかどうか分かりませんでした.
GC.disableな状態での動作ですので当然といえば当然なのですが..
修正するパッチを添付いたしますので,ご検討程よろしくお願いします.

Index: gc.c
===================================================================
--- gc.c        (revision 20602)
+++ gc.c        (working copy)
@@ -2089,7 +2089,9 @@
     RVALUE *membase = 0;
     RVALUE *p, *pend;
     volatile VALUE v;
+    int old_dont_gc = dont_gc;
 
+    if (old_dont_gc) dont_gc = Qfalse;
     i = 0;
     while (i < heaps_used) {
         while (0 < i && (uintptr_t)membase < (uintptr_t)heaps[i-1].membase)
@@ -2123,6 +2125,7 @@
        }
     }
 
+    dont_gc = old_dont_gc;
     return SIZET2NUM(n);
 }


----------------------------------------
http://redmine.ruby-lang.org