From: Minero Aoki Date: 2003-06-25T19:17:01+09:00 Subject: [ruby-dev:20458] Re: *.soのautoload(PR#504) 青木です。 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 プロセスで定義されるクラスの数はそう 多くはないでしょうから、まとめて配列にでも入れて保護すれば よいのではないでしょうか。 ------------------------------------------------------------------- 青木峰郎