From: Masaaki A. <mas...@gm...> - 2011-12-03 03:06:17
|
青柳です。 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しろとのことで、色々なパターンが ありそうです。そのため、柔軟に対応できるように struct gobjgslist2rval_args { GSList *list; GFreeFunc free_list; GFreeFunc free_elem; }; 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; } static VALUE gobjgslist2rval_ensure(VALUE data) { struct gobjgslist2rval_args *args = (struct gobjgslist2rval_args *)data; GSList *i; if (args->free_elem) for (i = args->list; i != NULL; i = i->next) args->free_elem(i->data); if (args->free_list) args->free_list(args->list); return Qnil; } VALUE rbgutil_gobjgslist2rval(GSList *const list, GFreeFunc free_list, GFreeFunc free_elem) { struct gobjgslist2rval_args args = {list, free_list, free_elem}; return rb_ensure(gobjgslist2rval_body, (VALUE)&args, gobjgslist2rval_ensure, (VALUE)&args); } のようなものを定義し、マクロとしては #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) のように開放有り無しの2種類定義しておいて、解放する場合はその関数を渡せるようにしたら いかがでしょうか? よろしければ、現在のものはdeprecatedとしてファイルを分けていって、置き換えていこうと思います。 (例:rbgutil.c -> rbgutildeprecated.c) |