きりかノート 3冊め

おあそびプログラミング

ocm_invoke() の可変な数の引数への対応(案)

NSPredicate を扱うためには、NSPredicate.predicateWithFormat: を使うのが常道。だけど、RubyCocoa ではフォーマット文字列のように引数の数が可変であるものの扱いに問題がある。現実問題として、そろそろどうにかしないといけないなあという気持ちになった。

というわけで、以前にもちょっと考えたことのつづき。てか、handle_ruby_method() は Objective-C から Ruby のメソッドの呼び出しなので、前の記述は正しくない。ocm_send() から ocm_invoke() のとこが問題の現場だ(see framework/src/objc/mdl_objwrapper.m)。

ocm_invoke() では、ちゃんと argc が渡されるので、handle_ruby_method() よりは対応は楽だな。たぶん。

で、方針は次にように考えた。原則として前のと同様。

  • argc が NSMethodSignature#numberOfArguments (-2) より大きければ、可変長引数とみなす
  • 可変長の引数は、2つめ以降の型がわからないので、次のように扱う
    • セレクタが "Format:" で終わるとき、Number → int, float, ... とし、その他は id とする
    • そうでないとき、すべて最終引数の型を適用する

これなら、手を動かせばできそうな見通し。

コード見てて気づいたのだけど、ocm_invoke() では、ruby の引数が少ないときに nil を詰めてる。これって例外にしたほうが良くないかな?