|
From: Masahiro S. <s01...@sf...> - 2002-06-19 06:20:31
|
さかいです。 From: Masao Mutoh <mu...@hi...> Subject: Re: [ruby-gnome2-devel-ja] Re: GLib2読んでみました Date: Tue, 18 Jun 2002 00:36:20 +0900 > まずはシンプルにして頭の中を整理したいなと。 そうですね。 > んじゃ、いったん削除しましょう。GErrorを実装するときがあれば > そのときにまた考えましょう。 了解。 > > XXXと書いたのは、cinfo->freeを呼ばなくしてしまった事についてでした。 > > 何故そうしたかというと、先のメールでは書き忘れてしまいましたが > > GObjectのリファレンスカウンタを実験的に使おうとしていたからです。 > > > > ちゃんと呼ぶようにも出来るのですが、cinfo->freeは現在使われていないので、 > > 後回しでいっかと思って。(^^;; > > えっと、まぁそうなんですが、使わないなら、gobj_mark()もいらなくなりますし > この際、削除した方がスッキリすると思います。 - mark用の関数をtype markerとして使うのは無理があるので、gobj_markは消す。 - cinfo->freeが本当に要らないのかどうかは確信が持てないので保留。 - rbgobj_lookup_*のAPIを練り直すことで、cinfoがNULLにならないようにする。 って感じでどうでしょうか。 > ふと思ったのですが、g_object_ref/unref前後(じゃなくても良いけど)のGObject > ってmalloc/freeって必要ないんですかね....。 えっと、ちょっと想像できないのですが、どういうことでしょう? > あ、ちょっと説明が悪かったですね。実は、Init_gobject_gobj()内の > > rbgobj_register_r2g_func(rbgobj_cGObject, &_gobject_from_ruby); > rbgobj_register_g2r_func(G_TYPE_OBJECT, &_gobject_to_ruby); > > の意図がちょっとわからなかったんです。 > これって何を意図してるんでしょうか。 rbgobj_cGObjectの派生クラス用のVALUE->GValueの変換関数として、 _gobject_from_ruby() を登録し、 G_TYPE_OBJECTの派生タイプ用のGValue->VALUEの変換関数として _gobject_to_ruby() を登録しています。 > > > ・gobj_smethod_added()って何に使うんでしょうか? > > > > シグナルハンドラを特異メソッドとして書くためのもののようです。 > > 具体的にはどのようなコードを意図してるんでしょうか。 > > win = Gtk::Window.new > win.singleton_method_added(?????) > ???? > あり?全然イメージできないです....。ごめんなさい、教えてください。 yashiさんの書いている通りだと思います。 # そういえば、この辺りはGClosureを使うようにしたときに # だいぶヘボいコードにしてしまったので、rbgobj_closure.cの方とあわせて、 # どなたか改良して貰えると助かります。 > > リファレンスカウンタについては僕もだいぶ混乱しているのですが、 > > 現状だと、各クラスのinitializeの実装はunrefしないので、 > > ここでrefしてしまうのはまずそうな気がします。 > > # もちろん、unrefするようにinitializeの方を変更すれば良いのですが…… > > initializeの方でunrefって、unrefしたオブジェクトを使い回すということに > なるので、ちょっと気持ち悪い気がします。 initializeからリターンする前に最初のリファレンスをunrefしても、 set_gobject()でのrefによってRubyのオブジェクト自身が 新しいリファレンスを保持している事になるので、 僕はあんまし気持悪いとは感じてません。 > > 1. initializeメソッド内で、hogehoge_new()を呼び出して、 > > 新しく作成されたオブジェクトのリファレンスを得る。 > > この時点で、リファレンスカウンタは1 > > これって、例えば、rbgtkbutton.cのbutton_initialize()とかのことを言ってますか? > どこでリファレンスカウンタが1になるのでしたっけ。ちょっとわからないんですが...。 その例でしたら、gtk_button_new()からリターンした時点で 既にリファレンスカウンタは1になっていると思います。 ちなみに、具体的に1をセットしているのはg_object_init() # と思ったら、gtk+側では floating object なんて概念もあるのか。 # ややこしい…… > > 5. glib側のオブジェクトは解放されない。 > > えっと、これって今のRuby/GTKの実装がってことでいいでしょうか? 「他を変更せずにset_objectでrefするようにすると」です。 > さかいさん的には、2.でrefしなくても良いんじゃないかって解釈で良いでしょうか? 2.でrefしなくても実質的にはうまく行くんじゃないかとは思ってますが、 これは気持悪いし、あまり自信がないです。 一方、2.でrefする事にすると、initialize側でunrefする必要があるはずで、 面倒臭そう…… と思っていたのですが、 floating object の事とか見落としていたので、 リファレンスカウンタについては、ちゃんと考え直そうと思います。 > さらに、INT2FIXみたいなマクロを用意するとスッキリするかも。 > > GOBJ2GVAL() > RVAL2GVAL() > GOBJ2RVAL() > RVAL2GOBJ() この名前短くて良いですね。 # そういえば、rvalueやRVALって「右辺値」を連想してしまいそう。(^^;; -- さかい |