なかだです。 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(®exp_); + markRuby(®exp_); } - virtual ~Regexp() { } + virtual ~Regexp() {freeRuby(®exp_);} // string sとマッチした位置を返す。マッチしなければnpos(=-1)を返す。
-- そうだ 強気に ちょっと インチキに☆彡 中田 "Bugるくらいがちょうどいいかも;-)" 伸悦