From: Masahiro S. ()
<sa...@to...> - 2003-07-11 05:04:59
|
さかいです。 From: Masao Mutoh <mu...@hi...> Subject: Re: [ruby-gnome2-devel-ja] Accept rb_cObject as G_TYPE_POINTER? Date: Fri, 11 Jul 2003 01:05:59 +0900 > むとうです。 > > > > 正しいVALUEかどうかわからないポインタにrb_obj_is_kind_of()を適用するのは > > > > 危険ではないでしょうか? > > > > > > rbgobj_gvalue_to_rvalue()に渡されるGValue値でgpointerに渡される > > > VALUE以外の値は無いんじゃないのかなぁ、と思いそのようにしました。 > > > あったらバグかなと。 > > > > 例えば、GCされたVALUEが渡って来る可能性はどうでしょうか? > > ですからその場合はバグなのかなと。 devel-enで話題になっている TreeIter#(set|get)_value にも、 その「バグ」がありますね。 > 実は私もその部分をうまく保証できる方法はないかなと > 考えてるんですが、良いアイデアないですかね....。 そもそもgpointerにVALUEを格納しようとするのが無謀のような気がします。 メモリ管理の出来るGBoxedの派生タイプで扱うのはダメなんでしょうか? こんな事もあろうかと、そのためのタイプを用意してあります。 # 実装はまだちょっといい加減だけど (^^; | #define RBGOBJ_TYPE_RUBY_VALUE (rbgobj_ruby_value_get_type()) | extern GType rbgobj_ruby_value_get_type(); | extern VALUE g_value_get_ruby_value(const GValue* value); | extern void g_value_set_ruby_value(GValue* value, VALUE ruby); > > > 一部、シグナル等でgpointerが返ってくるのがあるのですが、それは呼び出し元 > > > で適切なオブジェクトに独自に変換しますよね。 > > > そういうのはrbgobj_gvalue_to_rvalue()を使いませんし。 > > > > > > ex) > > > gtk/src/rbgtknotebook.cのsignal_g2r_func(num, values) > > > > そのような変換を必ず実装しなくてはいけなくなるのは > > 個人的には結構嫌です。 > > でも、それをしないとRuby側から使えないですよね。 私はGLib::Pointerのままでも意味が無いとは思っていませんが、 それはさておき、そのような変換を実装しないと、 特定の機能が使えないのは当然ですし、それは仕方がないです。 ですが、むとうさんの現在のコードは、それだけではなく、 これまでの「便利に使うために例外的に変換を実装する」から、 「きちんと動作する(SEGVらない)ために変換を常に実装しなくてはならない」 に方針が実質的に変わる事を意味します。 これによって * デフォルトを危険側に傾けることになる * 実現したい機能が特に無い場合にも変換を実装しなくてはいけない ことになるわけですが、これは本末転倒ではないでしょうか? > > > つまり、GLib::Pointerっていらないんじゃないかなと。 > > > GLib::Pointerのまま返されてもRuby側では使えないですしね。 > > > > RubyレベルからはOpaqueだというだけで、 > > その値を使ってGLibやGtkの機能を呼び出せるのであれば、 > > 存在意義はあるのではないかと思います。 > > 少なくとも、今まで実装した範囲では、そのような引数を受ける > 機能はないです。 > そのような実装は具体的にありそうなのでしょうか? > #私はないと思っています。 すぐに思い付くのは Gtk::Object#user_data Gtk::Object#user_data= とか。他にもあると思うけど。 -- 酒井 政裕 / Masahiro Sakai |