なかだです。

At Fri, 4 Feb 2000 10:23:01 +0900,
OZAWA Sakuro <crouton / duelists.org> wrote:
> > rb_global_variable()で指定されたアドレス
> > はRegexpオブジェクトがdeleteされた後は不正なアドレスになるん
> > ではないかと。
> 
> でしょうかね。でもREADME.EXT.jp見た限りではインタプリタに変数を教える
> APIがあっても、取り消す方法がなかったので、
> 
> >とはいえ、ちょっと考えた限りでは他にGCから保護する方法が無い
> >んで、rb_global_variable()で登録したアドレスを削除するAPIが
> >必要な気がしますね。
> 
> これ、欲しいです。

# インスタンス変数なので元々グローバルではないと思うのですが、ってのはさ
# ておき。

  RData を継承して dmark()/dfree() を実装するという手も考えられますがめ
んどくさそうなので、こんなんじゃどうでしょう。


--- wrapre.cc.orig Fri Feb 4 11:47:30 2000 +++ wrapre.cc Fri Feb 4 12:54:03 2000 @@ -9,14 +9,23 @@ class Object { - static bool rubyInitialized; // Object.cppにて falseに初期化 + static VALUE rubyObjects; // Object.cppにて falseに初期化 public: Object() { - if ( ! rubyInitialized) { + if (! rubyObjects) { ruby_init(); - rubyInitialized = true; + rubyObjects = rb_ary_new(); + rb_global_variable(&rubyObjects); } } virtual ~Object() { } + protected: + static void markRuby(VALUE obj) { + if (! rb_ary_includes(rubyObjects, obj)) + rb_ary_push(rubyObjects, obj); + } + static void freeRuby(VALUE obj) { + rb_ary_delete(rubyObjects, obj); + } } @@ -50,7 +59,7 @@ throw RegexpException(s); } - rb_global_variable(&regexp_); + markRuby(&regexp_); } - virtual ~Regexp() { } + virtual ~Regexp() {freeRuby(&regexp_);} // string sとマッチした位置を返す。マッチしなければnpos(=-1)を返す。
-- そうだ 強気に ちょっと インチキに☆彡 中田 "Bugるくらいがちょうどいいかも;-)" 伸悦