青木です。

  In mail "[ruby-dev:20459] Re: *.soのautoload(PR#504)"
    nobu.nakada / nifty.ne.jp wrote:

> なかだです。

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

ですね。リテラル絡みと、型変換があるものをチェックすれば
いいんでしょうか。


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

え、逆ではないですか? C で定義されたものだけ保護するんですよね。
……ああそうか、C で定義したものはそれぞれの拡張ライブラリが
しっかり面倒を見ろってことですね。確かにそれが正論ですね。

ただ、いままでは「rb_define_class() で定義したクラスは GC を
気にしなくてよい」ということを暗黙に保証していたと思うのです。
その仕様は 1.8 の間だけでも継続すべきではないでしょうか。
将来的には面倒は見ない、ということなら賛成です。


> となると、一本化するメリットってなんだろう。定数の検索がやや単
> 純化されるってことだけかな。

コードの本流と GC 対策はキッチリ分かれてるほうが読みやすいので、
「変更する」に一票入れます。
-------------------------------------------------------------------
青木峰郎