ささだです。

 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