きりかノート 3冊め

おあそびプログラミング

可変引数のバグ修正

[rubycocoa-devel:376]。ちょっと前に rubycocoa-talk での議論中に Jonathan が発見したバグを修正。

ruby では、引数が可変のときに Method#arity は負の数を返すのだけど、そこの処理がうまくないために Objective-C 側から Ruby のメソッドを呼び出すとクラッシュした。もちっと詳しく説明すると

  1. Time#now を Objective-C から呼び出し
  2. これは Ruby のオブジェクトなので RBObject#forwardInvocation: が呼ばれる
  3. NSMethodSignature の取得時にこのバグが影響して、メソッドのタイプ情報が "@@:@" (引数 1コあり) になる
  4. 引数を取り出そうとしたときに、実際には引数は渡されていないので、メモリのへんな場所にアクセスしてクラッシュ(これが Jonathan が 「[time now:nil] とすればクラッシュしない」と言っていた理由)

今回の件は直したからいいけど、Objective-C 側からの 可変引数をもつ Ruby のメソッドの呼び出しが今の実装ではできないってことに気づく。逆の Ruby -> Objective-C ができないのは知ってて、それを調べてたときにそんな予感はしてたけどニーズがないのでちゃんと調べてなかった。実際あまりニーズはないと思うけど、true/false のスイッチ系のメソッドは使いたいかもなあ。

この件はいくつか対応策は考えてはみているのだけど、その話はまたこんど。