From: Kouhei S. <ko...@co...> - 2011-12-03 05:35:42
|
須藤です。 In <CAMyNdeVpTtHfeBdegReX=DTDMUuXxawaBZc2Nc=jrN...@ma...> "[ruby-gnome2-devel-ja] リストからrubyオブジェクトへの変換について" on Sat, 3 Dec 2011 12:06:09 +0900, Masaaki Aoyagi <mas...@gm...> wrote: > gtk_widget_path_iter_list_classes > gtk_widget_path_iter_list_regions > にて、戻り値の開放を要素はせず、リストのみ行うとのことなので、単純に対応したものを > https://github.com/ruby-gnome2/ruby-gnome2/pull/62 > で提案しました。が、今度は > gtk_file_chooser_get_files > にて、要素はg_object_unrefを、リストはg_slist_freeしろとのことで、色々なパターンが > ありそうです。そのため、柔軟に対応できるように ... > のように開放有り無しの2種類定義しておいて、解放する場合はその関数を渡せるようにしたら > いかがでしょうか? > よろしければ、現在のものはdeprecatedとしてファイルを分けていって、置き換えていこうと思います。 > (例:rbgutil.c -> rbgutildeprecated.c) はい、基本的にはそれでよいと思います。 > struct gobjgslist2rval_args { > GSList *list; > GFreeFunc free_list; > GFreeFunc free_elem; > }; GSListを解放する方法はg_slist_free()しかないと思うので、 GFreeFuncなfree_listではなく、gbooleanで十分じゃないかと思い ました。 もしかしたら、要素を解放するときはリスト自体も削除する、とい う風にしてしまって、free_list自体をなくしてしまってもいいか もしれません。要素だけを解放したい時ってあるのかしら。リスト の中に解放済み要素だけあっても意味無いですよねぇ。 > static VALUE > gobjgslist2rval_body(VALUE data) > { > struct gobjgslist2rval_args *args = (struct gobjgslist2rval_args *)data; > GSList *i; > VALUE ary; > > ary = rb_ary_new(); > for (i = args->list; i != NULL; i = i->next) > rb_ary_push(ary, GOBJ2RVAL(i->data)); > > return ary; > } 実は、個人的には GSList *node; ... for (node = args->list; node; node = g_slist_next(node)) ... という書き方が好みだったりします。 (より適切な名前を使っていると思うので。) もしよければ採用してもらえると嬉しいです。 > のようなものを定義し、マクロとしては > > #define GOBJGSLIST2RVAL(list) \ > rbgutil_gobjgslist2rval(list, (GFreeFunc)NULL, (GFreeFunc)NULL) > #define GOBJGSLIST2RVAL_FREE(list, free_list, free_elem) \ > rbgutil_gobjgslist2rval(list, (GFreeFunc)free_list, > (GFreeFunc)free_elem) GSListにはGObject以外にもgchar *とかも入っていそうなので、解 放する関数をGFreeFuncでカスタマイズできるようにするなら、最 初の「GOBJ」は抜いたほうがいいかなぁと思いました。 |