青木です。

  In mail "[ruby-dev:20457] Re: *.soのautoload(PR#504)"
    matz / ruby-lang.org (Yukihiro Matsumoto) wrote:

> |それだと定数に別のものを再代入されたらクラスオブジェクトが
> |宙に浮きませんか? たとえば
> |
> |  NilClass = nil
> |
> |とされた場合、rb_cNilClass がどこかから確実に参照されている
> |ことが保証できなくなるのではないでしょうか。
> 
>   rb_cObject
>   rb_cFixnum
>   rb_cNilClass
>   rb_cFalseClass
>   rb_cTrueClass
> 
> だけ明示的にマークすればよいのかな。

恐らく、Ruby レベルからクラスオブジェクトにアクセスせずに
インスタンスを作れるクラスは全て危険ですよね。とすると
少なくとも rb_cString rb_cArray rb_cHash rb_cBignum rb_cRange
あたりは必要だと思います。

  Range = nil
  GC.start
  p((1..2).class)

てなことをやられたときに落ちる可能性があります。

ただ、拡張ライブラリまで考えると、できれば rb_define_class
で作ったクラスオブジェクトは半永久的にマークしてくれるほうが
よいと思います。例えば自分の書いたのでは strscan が明示的な
マークをさぼっています。また、

~/s/ruby % egrep '^VALUE \w+;' ext/**/*.c | wc -l
     26
~/s/ruby % egrep '^static VALUE \w+;' ext/**/*.c | wc -l
     28
~/s/ruby % egrep 'rb_gc_register_address|rb_global_variable' ext/**/*.c | wc -l
      4

このように、明らかに rb_gc_register_address が足りません。
つまり、明示的なマークをさぼっているものが他にもたくさん
あるのではないかと想像します。そのうちのほとんどは GC されても
無害だとは思いますが、まんがいちハマったときに悲しいことに
なるでしょう。どうせ 1 プロセスで定義されるクラスの数はそう
多くはないでしょうから、まとめて配列にでも入れて保護すれば
よいのではないでしょうか。
-------------------------------------------------------------------
青木峰郎