青木です。 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 対策はキッチリ分かれてるほうが読みやすいので、 「変更する」に一票入れます。 ------------------------------------------------------------------- 青木峰郎