なかだです。

rb_thread_tのthgroupがmarkされていません。

  $ ruby -v -e '
  def foo(n, t)
    if n > 0
      foo(n-1, t)
    else
      ThreadGroup.new.add(t)
      p t.group
      t
    end
  end
  t = foo(100, Thread.new{Thread.stop})
  100000.times{Object.new}
  p t.group'
  ruby 1.9.0 (2004-12-01) [i686-linux]
  #<ThreadGroup:0x401d7ef4>
  #<Object:0x401d7ef4>

また、ThreadだけでなくContinuationもaddできてしまいますが、list
には出てきません。

  $ ruby -v -e 'c = nil; callcc{|c|}; g = ThreadGroup.new; p g.add(c); p g.list'
  ruby 1.9.0 (2004-11-30) [i686-linux]
  #<ThreadGroup:0x403325e8>
  []


Index: eval.c =================================================================== RCS file: /cvs/ruby/src/ruby/eval.c,v retrieving revision 1.738 diff -u -2 -p -r1.738 eval.c --- eval.c 30 Nov 2004 17:28:16 -0000 1.738 +++ eval.c 1 Dec 2004 15:31:45 -0000 @@ -9787,4 +9787,5 @@ thread_mark(th) rb_gc_mark(th->last_match); rb_mark_tbl(th->locals); + rb_gc_mark(th->thgroup); /* mark data in copied stack */ @@ -12481,4 +12482,8 @@ thgroup_add(group, thread) rb_secure(4); th = rb_thread_check(thread); + if (!rb_obj_is_kind_of(thread, rb_cThread)) { + rb_raise(rb_eTypeError, "wrong argument type %s (expected Thread)", + rb_obj_classname(thread)); + } if (OBJ_FROZEN(group)) {
-- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦