ささだです。
Cで記述したメソッドの登録をまとめて行えないでしょうか。
具体的には、今
void
Init_foo(void)
{
VALUE klass = ...;
rb_define_method(klass, "foo", foo_func, 0);
rb_define_method(klass, "bar", bar_func, 1);
rb_define_method(klass, "baz", baz_func, -1);
}
とあるのを、
typedef struct {
char *name;
VALUE (*)(ANYARGS);
int argsize;
} rb_method_definition_info_t;
void
Init_foo(void)
{
VALUE klass = ...;
const rb_method_definition_info_t[] = {
{"foo", foo_func, 0},
{"bar", bar_func, 1},
{"baz", baz_func, -1},
};
rb_define_methods(klass, method_info_table,
sizeof(method_info_table)/
sizeof(rb_method_definition_info_t));
}
のように書くための型 rb_method_definition_info_t と rb_define_methods
API の追加です。
メリットは、
a) rb_define_method を並べるよりも、一覧になって読みやすい
b) また、メソッドの追加削除も容易になる(かも)
c) Cメソッド追加ごとにメソッドキャッシュをクリアしているが、
これは無駄なので止めたい
d) メソッド追加のために何かをロックする必要が、これからある
かもしれないが、それが一箇所で済むようになる
まぁ、いつものように、私の望みは c, d なのですが、いかがでしょうか。
検討事項としては、rb_method_definition_info_t は visibility を含めても
いいような気がする、というところでしょうか。ほとんどは public なんだか
ら、要らないと思いますが。
--
// SASADA Koichi at atdot dot net